[Daily morning study] AWS Cognito와 인증/인가 서비스
#daily morning study
AWS Cognito란
AWS Cognito는 웹/모바일 앱의 사용자 인증, 권한 부여, 사용자 관리를 제공하는 완전 관리형 서비스다. 직접 인증 시스템을 구축하지 않아도 회원가입, 로그인, MFA, 소셜 로그인 등을 빠르게 적용할 수 있다.
크게 두 가지 컴포넌트로 나뉜다.
- User Pool: 사용자 디렉토리 — 인증(AuthN) 담당
- Identity Pool: AWS 리소스 접근 권한 부여 — 인가(AuthZ) 담당
User Pool
User Pool은 사용자 계정을 저장하고 인증 흐름을 처리하는 디렉토리 서비스다.
주요 기능:
- 이메일/전화번호 기반 회원가입·로그인
- 이메일/SMS 인증 코드 발송
- MFA (TOTP, SMS)
- 소셜 로그인 연동 (Google, Facebook, Apple, Amazon)
- SAML 2.0 / OIDC 기반 외부 IdP 연동
- JWT 토큰 발급
발급되는 토큰 종류
| 토큰 | 내용 | 기본 유효기간 |
|---|---|---|
| ID Token | 사용자 정보 (이름, 이메일 등) 포함 | 1시간 |
| Access Token | API 접근 권한 클레임 포함 | 1시간 |
| Refresh Token | 위 두 토큰 갱신 용도 | 30일 |
세 토큰 모두 JWT 형식이며 OIDC 호환이다.
인증 흐름 (SRP 기반)
Cognito 기본 인증은 SRP(Secure Remote Password) 프로토콜을 사용해 비밀번호가 네트워크에 평문으로 노출되지 않는다.
1. 클라이언트 → InitiateAuth 요청 (username, SRP_A 값)
2. Cognito → PASSWORD_VERIFIER 챌린지 응답 (SRP_B, salt)
3. 클라이언트 → RespondToAuthChallenge (SRP_M1: 검증값)
4. Cognito → 인증 성공 → ID/Access/Refresh Token 반환
Identity Pool
Identity Pool(Federated Identity)은 인증된 사용자 또는 비인증 사용자에게 AWS 리소스 접근을 위한 임시 자격증명을 발급한다. 내부적으로 STS(Security Token Service)의 AssumeRoleWithWebIdentity를 호출한다.
사용자 로그인 (User Pool 또는 소셜)
→ JWT / OAuth 토큰 획득
→ Identity Pool에 토큰 전달
→ STS AssumeRoleWithWebIdentity 호출
→ 임시 자격증명 반환 (AccessKeyId, SecretKey, SessionToken)
→ S3, DynamoDB 등 AWS 서비스 직접 호출
주요 사용 사례
- 모바일 앱에서 S3에 이미지를 직접 업로드
- 비인증 사용자에게 읽기 전용 DynamoDB 접근 허용
- IoT 디바이스의 AWS IoT Core 연결
User Pool vs Identity Pool 비교
| 항목 | User Pool | Identity Pool |
|---|---|---|
| 역할 | 사용자 인증 (AuthN) | AWS 리소스 권한 부여 (AuthZ) |
| 발급물 | JWT (ID / Access / Refresh) | AWS 임시 자격증명 |
| 연동 대상 | 앱 백엔드, API Gateway | AWS SDK, S3, DynamoDB 등 |
| 비인증 지원 | X | O (Guest 역할 부여 가능) |
두 컴포넌트를 함께 쓰는 패턴이 일반적이다. User Pool에서 JWT를 받고, Identity Pool에서 그 JWT를 신뢰 자격증명으로 삼아 임시 AWS 자격증명을 획득한다.
Hosted UI
Cognito는 별도 UI 구현 없이 사용할 수 있는 Hosted UI를 제공한다. OAuth 2.0 Authorization Code Flow를 지원하며, 커스텀 도메인 설정도 가능하다.
https://<도메인>.auth.<region>.amazoncognito.com/login
?client_id=<APP_CLIENT_ID>
&response_type=code
&scope=email+openid+profile
&redirect_uri=https://app.example.com/callback
인가 코드를 받아서 토큰 엔드포인트(/oauth2/token)에 교환하는 방식이다.
Lambda Triggers
User Pool의 각 이벤트 단계에 Lambda 함수를 연결해 동작을 확장할 수 있다.
| 트리거 | 실행 시점 |
|---|---|
| Pre Sign-up | 회원가입 직전 (유효성 검사, 차단) |
| Post Confirmation | 이메일/전화 인증 완료 후 |
| Pre Token Generation | JWT 발급 직전 (커스텀 클레임 추가) |
| Post Authentication | 로그인 성공 후 (감사 로깅 등) |
| Custom Message | 인증 메일/SMS 내용 커스터마이징 |
Pre Token Generation을 활용하면 역할(Role), 권한(Permission) 같은 커스텀 클레임을 JWT에 주입할 수 있다.
JWT 검증
백엔드나 API Gateway에서 Cognito JWT를 검증할 때는 User Pool의 JWKS 엔드포인트에서 공개키를 가져와 서명을 확인한다.
https://cognito-idp.<region>.amazonaws.com/<userPoolId>/.well-known/jwks.json
검증 항목:
- 서명 유효성 (RS256)
iss: User Pool URL과 일치 여부aud(ID Token) 또는client_id(Access Token): App Client ID 일치 여부exp: 만료 시간
주의사항
App Client Secret 사용
서버 사이드 앱은 App Client Secret을 활용하지만, SPA나 모바일 앱처럼 소스코드가 노출될 수 있는 환경에서는 Secret 없는 App Client + PKCE(Proof Key for Code Exchange) 플로우를 사용해야 한다.
비밀번호 정책
User Pool 생성 시 비밀번호 정책(최소 길이, 대/소문자, 숫자, 특수문자 요구 여부)을 설정하면 이후 변경이 제한적이므로 초기 설계에 신중해야 한다.
MAU 기반 과금
Cognito는 MAU(Monthly Active User) 기준으로 과금한다. 최초 50,000 MAU는 무료이며, 소셜 로그인(외부 IdP) 사용 사용자는 별도 요금이 발생한다.
정리
| 개념 | 핵심 |
|---|---|
| User Pool | 사용자 디렉토리, JWT 발급, 소셜/SAML 연동 |
| Identity Pool | AWS 리소스 임시 자격증명 발급 (STS) |
| Hosted UI | OAuth 2.0 기반 로그인 페이지 제공 |
| Lambda Trigger | 인증 파이프라인 커스터마이징 |
| JWT 검증 | JWKS 엔드포인트로 공개키 서명 확인 |
Cognito는 인증 인프라를 직접 구축하지 않고도 안전한 사용자 관리 체계를 빠르게 구성할 수 있게 해준다. User Pool과 Identity Pool을 조합해 인증부터 AWS 리소스 접근 제어까지 하나의 파이프라인으로 처리하는 구조가 일반적인 패턴이다.