2023. 5. 8. 18:13ใAWS
Amazon Cognito?
Amazon Cognito user pools
User pool์ด ์ ๊ณตํ๋ ๊ฒ
- Sign-up and sign-in services.
- A built-in, customizable web UI to sign in users.
- Social sign-in with Facebook, Google, Login with Amazon, and Sign in with Apple, as well as sign-in with SAML identity providers from your user pool.
- User directory management and user profiles.
- Security features such as multi-factor authentication (MFA), checks for compromised credentials, account takeover protection, and phone and email verification.
- Customized workflows and user migration through AWS Lambda triggers.
Cognito Token ์ด์ฉํ๊ธฐ
์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, Cognito๋ ์ธ์ ์ ์์ฑํ๊ณ ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ID token, access token, refersh token์ ๋ฆฌํดํ๋ค. ํ ํฐ์ API Gateway๋ ์์ฒด ๊ตฌ์ฑ๋ server-side ๋ฆฌ์์ค์ ์ธ์ฆ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. Cognito Identity Pool์ ์ด์ฉํด์ ์ด ํ ํฐ๋ค์ API Gateway๊ฐ ์๋ AWS ์๋น์ค์ ์ ๊ทผํ๊ธฐ ์ํด ์์ AWS credentials์ผ๋ก ๋ฐ๊ฟ ์๋ ์๋ค.
์ข ๋ฅ
- ID token(์๊ฒฉ ์ฆ๋ช ํ ํฐ): ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ํด๋ ์์ ๊ธฐ๋ฐ์ผ๋ก API ํธ์ถ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- Access token(์ก์ธ์ค ํ ํฐ): ์ง์ ๋ ์ก์ธ์ค ๋ณดํธ ๋ฆฌ์์ค์ ์ฌ์ฉ์ ์ง์ ๋ฒ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ํธ์ถ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- Refresh token(๋ฆฌํ๋ ์ ํ ํฐ): ์ ๊ท ID/์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋๋ค. ๋ฆฌํ๋ ์ ํ ํฐ์ default ๋ง๋ฃ ๊ธฐ๊ฐ์ 30์ผ์ด๋ฉฐ, 60๋ถ~10๋ ์ฌ์ด๋ก ์ค์ ๊ฐ๋ฅํ๋ค.
ํน์ง
- Cognito์์ ๋ฐํํ๋ ํ ํฐ์ ํด๋ ์ ๊ธฐ๋ฐ์ ํ ํฐ์ด๋ค. Access/ID ํ ํฐ์ ๋ชจ๋ cognito:groups๋ผ๋ ํด๋ ์์ ํฌํจํ๋ค.
- token: ์ ์ ๋ฅผ ์ธ์ฆํ๊ณ , ๋ฆฌ์์ค์ ์ ๊ทผ์ ํ์ฉํ๋ค.
- claim: ํ ํฐ์ ํฌํจ๋ ์ ์ ๊ด๋ จ ์ ๋ณด. ์ฃผ์ฒด๊ฐ ๋ฌด์์ธ์ง ํํํ๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์.
- Cognito๋ Base64 ์ธ์ฝ๋ฉ ๋ string ๊ฐ์ผ๋ก ํ ํฐ ๋ฐํํ๋ค. Cognito ID ๋๋ access token์ Base64๋ก๋ถํฐ plaintext JSON์ผ๋ก ๋์ฝ๋ฉ ๊ฐ๋ฅํ๋ค.
- refresh token์ ์ํธํ๋์์ผ๋ฉฐ Cognito administrator๋ ์ ์ ๋ก๋ถํฐ ์ฝํ ์ ์๋ค.
๐ As-Is Architecture
EC2์ API Server๊ฐ ๊ตฌ์ฑ๋์ด ์๊ณ ์ฌ์ฉ์๋ค์ ์๋จ์ API Gateway๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ๋ ํํ๋ก, API Gateway๋ REST API๋ก ๊ตฌ์ฑ๋์๋ค. API Gateway์์ REST API๊ฐ ์๋ ๊ฒฝ์ฐ Cognito๋ฅผ ์ด์ฉํ ์ธ์ฆ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โ๏ธ To-Be Architecture
- ์ธ์ฆ(Authentication): API๋ฅผ ํธ์ถํ๋ ํด๋ผ์ด์ธํธ์ ๋ํ Identity(์ ๋ถ)์ ํ์ธํด ์ฃผ๋ ๊ธฐ๋ฅ
- ์ธ๊ฐ(Authorization): ํด๋ผ์ด์ธํธ๊ฐ API๋ฅผ ํธ์ถํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํด์ฃผ๋ ๊ธฐ๋ฅ
ํด๋น ํฌ์คํ ์์๋ ๊ถํ ๋ถ์ฌ(์ธ๊ฐ) ์์ด ๋จ์ํ Cognito ์ฌ์ฉ์ ํ์ ์ด์ฉํ “์ธ์ฆ”๋ง์ ์ถ๊ฐํด๋ณด๋๋ก ํ์.
Cognito User Pool์ ์์ฑํ๊ณ User Pool์ ๋ฑ๋ก๋ ์ฌ์ฉ์์ธ ๊ฒฝ์ฐ, API Gateway๋ฅผ ํตํด API๋ฅผ ํธ์ถ์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํด ๋ณด์.
1. Cognito User Pool ์์ฑ
[Authentication Provider]
- provider type: cognito user pool
- cognito user pool sign-in options
- ์ ์ ๊ฐ ๋ก๊ทธ์ธํ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ ์ ํ
- user pool ์์ฑ ํ ์ต์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
[Security Requirements]
- Password policy : ๋น๋ฐ๋ฒํธ ์ ์ฑ
- Multi-factor authentication : ๋ก๊ทธ์ธ ๊ณผ์ ์์ MFA ์ฌ์ฉ ์ฌ๋ถ
- User account recovery : ์ ์ ๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ๊ฒฝ์ฐ ๊ณ์ ๋ณต๊ตฌ ๋ฐฉ๋ฒ
[Sign-up experience]
- Self-service sign-up : ์ ์ ํ์๊ฐ์ ๊ฐ๋ฅ ์ฌ๋ถ
- Attribute verification and user account confirmation: ์ฌ์ฉ์ ํ์ธ(attribute verification/user pool administrator confirmation). ํ์ธ๋ attribute๋ง ๋ก๊ทธ์ธ, ๊ณ์ ๋ณต๊ตฌ, MFA์ ์ฌ์ฉ ๊ฐ๋ฅ.
- Required attributes : ์ ๊ท ์ ์ ์์ฑ ์ ํ์๋ก ํ๋ ์์ฑ. OIDC ํ์ค์์ ๊ฐ์ ธ์จ ํ์ค ์์ฑ.
[Configure message delivery]
- Email/SMS : ์ ์ ์๊ฒ ์ ์กํ email/SMS message ๋ฐ์ก ๋ฐฉ์ ์ ํ
[Integrate your app]
⇒ (์ฐธ๊ณ ) AWS Docs: Setting up the hosted UI with the Amazon Cognito console
- User pool name : user pool ์์ฑ ํ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
- Hosted authentication pages
- Cognito Hosted UI๋ OAuth 2.0 ํธํ ์ธ์ฆ ์๋ฒ๋ฅผ ์ ๊ณตํ๋ค.
- Hosted UI ๊ตฌ์ฑ ์, ์๋์ ๊ฐ์ sign up, sign in ๊ฐ๋ฅํ ์นํ์ด์ง๊ฐ ์ ๊ณต๋๋ค. ํด๋น ์นํ์ด์ง๋ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ.
- Domain : Hosted UI์ OAuth 2.0 ์๋ํฌ์ธํธ๋ฅผ ์ํ ๋๋ฉ์ธ. Hosted UI๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ธ์ฆ ์๋ํฌ์ธํธ๊ฐ ์์ฑ๋๋ ๋๋ฉ์ธ์ ๋ฐ๋์ ์ ํํด์ผ๋ง ํ๋ค.
- Initial app client
- ์ธ์ฆ๋์ง ์์ API ์์ (sign-up, sing-in, ์ํธ ์ฐพ๊ธฐ ๋ฑ)์ ํธ์ถํ ์ ์๋ ๊ถํ์ ๊ฐ์ง ์ฌ์ฉ์ ํ์ ๋จ์ผ ์ฑ ํ๋ซํผ. ์ฌ์ฉ์ ํ์๋ ์ฌ๋ฌ ๊ฐ์ ์ฑ ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ ์๋ค.
- Advanced app client settings์์ ์ด์ ์ ์ ํํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก authentication flow, OAuth 2.0 grant type ๋ฐ OIDC scope ๋ฑ์ ์ ํํ ์ ์๋ค.
- ๋ณธ ํฌ์คํ ์์๋ ํ ํฐ์ ์ง์ ๋ฆฌํด ๋ฐ๊ธฐ ์ํด OAuth 2.0 grant types์์ Implicit grant(์์์ ๋ถ์ฌ)๋ฅผ ์ถ๊ฐํ๋ค. Implicit grant๋ฅผ ์ ํํ๋ฉด ํ ํฐ์ ๋ํ ์ธ์ฆ ์ฝ๋๋ฅผ ๊ตํํ ์ ์๋ ๋ฐฑ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ ํ ํฐ ๋๋ฒ๊น ์ ์ ์ฉํ๋ค.
2. API Gateway REST API์ Amazon Cognito ์ฌ์ฉ์ ํ ํตํฉ
2-1. Authroizer ์์ฑ
API Gateway ์ฝ์์์ 1์์ ์์ฑํ Cognito User Pool๋ฅผ ์ด์ฉํ Authroizer๋ฅผ ์์ฑํ๋ค.
2-2. Method์ Authorizer ์ ์ฉ
์ธ์ฆ์ด ํ์ํ ๋ฉ์๋ > Method Request > Settings > Authroization์์ 2-1์์ ์์ฑํ authroizer๋ฅผ ์ ์ฉํ๋ค.
3. ํ ์คํธ
3-0. ์ธ์ฆ ํ ํฐ ์์ด API ํธ์ถ
Postman์ ์ด์ฉํด API๋ฅผ ํธ์ถํ์๋ค. ์ธ์ฆ ํ ํฐ ์์ด ํธ์ถํ์ฌ 401 Unauthorized๋ฅผ ์๋ต๋ฐ์๋ค.
3-1. Access Token ๋ฐ๊ธ
Hosted UI๋ฅผ ํตํด Sign-up ๊ณผ์ ์ ์ํํ๋ค. ๊ตฌ์ฑํ๋๋ก ์ฌ์ฉ์ ์ธ์ฆ ๊ณผ์ (์ ๊ทธ๋ฆผ์์๋ ์ด๋ฉ์ผ ์ธ์ฆ)์ ๊ฑฐ์ณ ์ ์์ ์ผ๋ก ๋ฑ๋ก์ ์ฑ๊ณตํ๋ฉด Amazon Cognito ์ฝ์์์ ์์ ๊ฐ์ด ์ ์ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค.
๋ณธ ํฌ์คํ ์์๋ ํ ํฐ์ ๋ํ ์ธ์ฆ ์ฝ๋๋ฅผ ๊ตํํ ์ ์๋ ๋ฐฑ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ Hosted UI ๊ตฌ์ฑ ์ OAuth gran type์ implicit grant๋ฅผ ์ถ๊ฐํ์๋ค.
https://<your_domain>/login?response_type=token&client_id=<your_app_client_id>&redirect_uri=<your_callback_url>
์ URL์ ์ฌ์ฉํ์ฌ Hosted UI ์นํ์ด์ง์์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, Cognito๋ ์๋์ ๊ฐ์ด ์ ์ ํ ํ ํฐ์ ์น ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ํตํด ๋ฆฌํดํ๋ค.
<https://www.example.com/#id_token=123456789tokens123456789&expires_in=3600&token_type=Bearer>
์ ์์ ์ผ๋ก ๋ฆฌํด๋์ง ์๋ ๊ฒฝ์ฐ, ์๋ ๋ ๊ฐ์ง ์ฌํญ์ ํ์ธํ์.
- Hosted UI ์นํ์ด์ง ๋ก๊ทธ์ธ URL์ response_type=token ํฌํจ๋ ์ํ์์ ๋ก๊ทธ์ธ์ ์ํํ๋์ง.
- ์๋ฌต์ ์ฝ๋ ๋ถ์ฌ๊ฐ ํ์ฑํ๋์ด ์๋์ง.
3-2. Request Header์ ์ธ์ฆ ํ ํฐ์ ํฌํจํ์ฌ API ํธ์ถ
Header์ Key์ Authorization, Value์๋ 3-1์์ ๋ฆฌํด ๋ฐ์ id token์ ์ด์ฉํ์. ์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก 200์ ๋ฆฌํดํ๋ค.
API Gateway๋ฅผ ์ด์ฉํ Cognito User Pool ๊ฒํฅ๊ธฐ ์ฑ๊ณต~!
๐ ์ฐธ๊ณ ๋งํฌ
- AWS Docs: What is Amazon Cognito?
- AWS Docs: Using tokens with user pools
- AWS Docs: Amazon Cognito ์ฌ์ฉ์ ํ์ ๊ถํ ๋ถ์ฌ์๋ก ์ฌ์ฉํ์ฌ REST API์ ๋ํ ์ก์ธ์ค ์ ์ด
- ๊ธฐ์ ๋ธ๋ก๊ทธ: OpenID(OIDC) ๊ฐ๋ ๊ณผ ๋์์๋ฆฌ
- AWS Docs: Using the Amazon Cognito hosted UI for sign-up and sign-in
- ๊ธฐ์ ๋ธ๋ก๊ทธ: MSA ์ํคํ ์ณ ๊ตฌํ์ ์ํ API ๊ฒ์ดํธ์จ์ด์ ์ดํด (API GATEWAY)