Amazon Cognito로 최종 사용자 인증하기

AWS에서 애플리케이션 배포하기

Dunieski Otano

Amazon Web Services Solutions Architect

로그인을 직접 구축해야 할까요?

  • 새로운 앱에는 완전한 회원가입과 로그인 기능이 필요합니다
  • 팀은 인증 기능을 처음부터 직접 구축하려 합니다
  • Cognito는 이미 이를 안전하게 처리합니다

커스텀 로그인을 직접 구축하는 대신 관리형 Amazon Cognito 인증을 선택하는 모습

AWS에서 애플리케이션 배포하기

사용자 풀 vs 자격 증명 풀

왼쪽에는 토큰을 발급하는 사용자 디렉터리 역할의 Cognito 사용자 풀, 가운데에는 검증된 토큰을 임시 AWS 자격 증명으로 교환하는 자격 증명 풀, 오른쪽에는 AWS 서비스가 있는 구성도

  • 사용자 풀(User pool): 최종 사용자를 관리하는 디렉터리
  • 회원가입과 로그인을 처리하고 토큰을 발급합니다
  • 자격 증명 풀(Identity pool): 로그인을 AWS 자격 증명으로 교환합니다
  • 두 가지를 함께 사용: 먼저 인증하고 AWS 액세스를 권한 부여합니다
AWS에서 애플리케이션 배포하기

Cognito의 세 가지 토큰

  • ID 토큰: 사용자가 누구인지 나타냅니다(ID 클레임)
  • 액세스 토큰: 사용자가 호출할 수 있는 작업을 나타냅니다
  • 리프레시 토큰: 재로그인 없이 새 토큰을 발급받습니다
  • 세 가지 모두 디코딩하고 검증할 수 있는 JWT입니다

나란히 놓인 세 가지 Cognito JWT 토큰: ID 클레임을 담은 ID 토큰, API 권한 범위를 담은 액세스 토큰, 자동 갱신을 위한 장기 유효 리프레시 토큰

AWS에서 애플리케이션 배포하기

페더레이션 ID

  • 페더레이션(Federation): 외부 ID 공급자로 로그인합니다
  • 소셜: Google, Facebook, Apple
  • 엔터프라이즈: SAML, OIDC 공급자
  • Cognito가 신뢰 관계를 중개하고 자체 토큰을 발급합니다

Cognito 페더레이션: 사용자가 소셜 공급자(Google, Facebook) 또는 엔터프라이즈 SAML/OIDC 공급자를 선택하면, Cognito가 외부 로그인을 검증하고 자체 표준 토큰을 발급하는 과정

AWS에서 애플리케이션 배포하기

API Gateway 권한 부여자로서의 Cognito

API Gateway Cognito 권한 부여자: 클라이언트가 액세스 토큰이 담긴 Authorization 헤더를 전송하면, 게이트웨이가 Lambda 실행 전 사용자 풀을 기준으로 검증하며, 유효하지 않은 토큰은 401로 거부됩니다

  • API Gateway는 Cognito 권한 부여자를 사용할 수 있습니다
  • 클라이언트는 토큰을 Authorization 헤더에 담아 전송합니다
  • API Gateway는 백엔드 실행 전에 토큰을 검증합니다
  • 유효하지 않거나 만료된 토큰은 에지에서 거부됩니다
AWS에서 애플리케이션 배포하기

일반적인 로그인-API 호출 흐름

  • 사용자가 사용자 풀에 로그인합니다
  • ID, 액세스, 리프레시 토큰을 받습니다
  • 클라이언트가 액세스 토큰으로 API Gateway를 호출합니다
  • Cognito 권한 부여자가 검증한 후 백엔드가 실행됩니다

로그인부터 API 호출까지의 흐름: 사용자가 사용자 풀에 로그인해 토큰을 받고, 클라이언트가 액세스 토큰을 API Gateway로 전송하면, Cognito 권한 부여자가 이를 검증한 후 백엔드 Lambda가 실행됩니다

AWS에서 애플리케이션 배포하기

흔한 Cognito 실수

  • 액세스 토큰이 필요한 곳에 ID 토큰을 전송
  • 사용자 풀과 자격 증명 풀을 혼동
  • 사용자 풀만으로 AWS 액세스를 권한 부여하려는 시도
  • 클라이언트에 토큰을 안전하지 않게 저장

흔한 Cognito 실수: 액세스 토큰 대신 ID 토큰을 API에 전송하거나, 사용자 풀과 자격 증명 풀을 혼동하거나, 클라이언트에 토큰을 안전하지 않게 저장하는 경우

AWS에서 애플리케이션 배포하기

연습해 봅시다!

AWS에서 애플리케이션 배포하기

Preparing Video For Download...