AWS

[AWS] aws 강의 섹션 27 (Cognito User Pools, Cognito Identity Pools)

대기업 가고 싶은 공돌이 2024. 12. 4. 18:15

AWS Cognito

자격 증명을 통해 사용자에게 여러 웹, 모바일 어플리케이션과 상호작용하게 하는 것이 목표다

 

사용자는 보통 AWS 계정 외부에 자리하고 있어서 이름이 cognito이다.

 

코그니토에는 두 가지 서비스가 있다.

 

  • Cognito User Pools
    • 사용자를 위해 로그인 기능을 제공준다.
    • api 게이트웨이, 로드밸런서와 통합이 잘 되어 있다.
  • Cognito Identity Pools (Federated Identity)
    • 앱에 등록된 사용자가 aws 리소스에 바로 액세스할 수 있도록, 임시 AWS 자격 증명을 제공하는 것이다.
    • 사용자 풀과도 통합이 잘 되어 있다.

Cognito User Pools (CUP)

  • 웹 및 모바일 애플리케이션 사용자들의 서버리스 데이터베이스를 생성할 수 있는 방법이다.
  • 아이디, 비밀번호 등의 단순 조합으로 애플리케이션 접속을 가능하게 한다.
  • 비밀번호 변경, 이메일 전화번호 인증 등의 기능을 제공한다.
  • MFA 기능을 추가할 수도 있고
  • 구글, 페이스북, 등의 소셜 로그인을 통한 접근도 가능하게 한다.
  • 사용자를 차단할 수 있는 기능도 있다.
  • 사용자가 로그인을 하면 JSON Web Token을 반환한다.

CUP는 데이터베이스를 보유하고 있고, 사용자가 로그인을 하면 데이터베이스를 통해 인증하고 JWT 토큰을 반환한다.

소셜 로그인 및 OIDC 등등의 로그인도 지원한다.

 

Cognito User Pools - Intergration

  • CUP는 게이트웨이, 로드 밸런서와 통합이 된다.

  • 게이트웨이는 전에 살펴봤듯, 사용자 풀에서 토큰을 받고 게이트웨이로 요청을 보내면
  • 게이트웨이에서 코그니토에 토큰 유효성을 물어보고 유효하다면 접근을 허용하는 방식이다.
  • 로드 밸런서는 만약 사용자가 protected된 엔드포인트로 요청을 보낸다면
    로드 밸런서에서 자동으로 유저 풀에 리다이렉트를 시킨다.
  • 유저 풀에서 인증을 수행하고 oidc 토큰을 반환한다.
  • 반환된 토큰을 통해 로드밸런서는 권한을 확인 후 자동으로 타깃 그룹으로 보낸다.
  • 이후에는 세션 쿠키가 생성되어, 다시 인증할 필요 없이 로드밸런서에서 확인 후 바로 타깃 그룹으로 라우팅을 한다.

코그니토 Hosted Authentication UI 제공

코그니토에서 전용 UI를 제공해 바로 회원가입과 로그인이 가능하게 한다.

이 호스팅 UI를 사용하면 소셜 로그인을 모두 통합해주는 기반이 만들어져서 프로그래밍할 필요가 없다.

 

UI에 내 애플리케이션 이미지를 삽입하여, 전용 로그인 페이지로 커스텀 할 수도 있다.

 

호스팅 UI - 커스텀 도메인

호스팅 UI에 커스텀 도메인을 사용한다면, 무조건 HTTPS에 필요한 SSL 인증서를 생성해야 한다.

인증서는 ACM에 존재해야 한다.

 

인증서 리전은 US-EAST-1로 선택해야한다.

 

코그니토 유저 풀이 us-west-1에 존재한다고 하더라도 인증서는 무조건 us-east-1에 존제해야한다.

 

코그니토와 람다 함수의 통합

  • 여러가지 트리거 조건을 두고 해당 조건을 만족할 시 람다 함수를 호출하게 할 수 있다.
  • 예를 들어, 회원 가입의 경우
  • 회원가입 전, 회원가입 후, 트리거를 걸 수 있고
  • 사용자가 회원가입 버튼을 클릭하면 바로 람다 함수를 실행시켜 사용자가 특정 데이터 베이스에 존재하는지 이중 확인 방식
    으로 응용 또는,
  • 사용자가 회원가입 이후 환영 이메일을 보내는 방식으로 사용할 수 있다.

코그니토 User Pools - Lambda Triggers

  • 람다 트리거를 사용해서 코그니토 사용자 풀이 트리거 발생 시 람다 함수를 호출할 수 있다.
  • 트리거 유형은 다음과 같다.

CUP - Adaptive Authentication

  • 사용자가 로그인 시 이상한 행동을 보인다면, 로그인을 잠시 차단하거나 MFA를 강제하는 기능이다.
  • 로그인 시도마다 코그니토가 검사를 진행해 위험 점수를 낮음, 중간, 높음으로 판단한다.
  • 로그인 요청이 악의적인 공격자의 요청이거나 알 수 없는 로그인일 가능성이 얼마나 되는지 알려준다.

  • 위 사진과 같이 기존 로그인하던 ip 주소가 아닌 새로운 곳에서 로그인 시, MFA를 강제하는 등의 방식이다.
  • 조정 인증 메커니즘이 수행하는 모든 작업은 로그인 시도나 위험 점수와 관계없이 모두
    Cloudwatch Logs에 기록된다.

ApplicationLoad Balancer - Authenticate Users

  • 유저의 인증 책임을 로드밸런서에 전가하고 애플리케이션은 비즈니스 로직에만 집중하게 만들 수 있다.
    • 첫 번째 방법은 Open ID Connect를 준수하는 자격 증명자를 사용하는 것이다.
    • 두 번째 옵션은 cognito 사용자 풀을 사용하는 것이다.
      • 아마존 로그인이나 페이스북 로그인 같은 소셜 로그인 자격 증명 방식이다.
  • 이 작업을 하려면 HTTPS 리스너를 설정해야 한다.
  • 그 이후, authentication -oidc 또는 Authentication-cognito rule을 설정할 수 있다.

1번에서 인증을 진행하고 2번을 통해 타깃그룹으로 전송하는 것이다.

 

사용자가 인증을 받지 못한 경우에, 재인증 요청, 전부 거절, 전부 허용 세가지 옵션이 가능하다.

 

  • 사용자 풀과 연동한 경우에, 리다이렉트 URL을 설정하고 필요하다면 소셜 로그인을 사용자 풀에 연동한다.
  • 추가로 여러가지 콜백 url 설정이 가능하다.

  • 로드밸런서와 외부 oidc를 준수하는 자격 증명 앱과 연동하려면 조금 복잡하다.
  • 우선 인증 엔드포인트로 로드밸런서가 사용자를 리디렉션 시킨다.
  • 인증 엔드포인트에서 인증 코드를 반환한다.
  • 인증 코드를 바탕으로 로드밸런서는 토큰 엔드포인트에 요청을 보내 id, access 토큰을 반환받는다.
  • 마지막으로 리소스 서버에 토큰을 기반으로 요청을 보내 사용자 claims를 얻어내면
  • 해당 정보를 바당으로 ECS에 요청을 보낸다.

Cognito Identity Pools (Federated Identities)

  • 사용자들은 AWS 외부 환경에 존재한다. 사용자들은 외부에서 다이나모 디비나 S3버킷에 액세스하려 한다.
  • 그리고 이런 액세스를 위해서는 임시 AWS 자격 증명이 필요하다.
  • 사용자들이 너무 많기 때문에 IAM 사용자를 모두에게 만들어주는 것은 힘들다
  • 때문에 이 사람들을 위해 코그니토 자격 증명 풀을 이용해 액세스를 제공할 것이다.
  • 자격 증명 풀은 신뢰할 수 있는 제 3자를 통해 사용자들에게 로그인을 허용한다.
  • 제 3자는 예를 들어, 아마존, 페이스북, 구글, 애플 등으로 로그인하는 것이 해당된다.
    • 혹은 심지어 코그니토 사용자 풀로 로그인한 사용자를 허용하거나
    • Open Id Connect, Saml 제공자도 허용할 수 있으며
    • 마지막으로 커스텀 로그인 서버인 Developer Authenticated Identites도 가능하다.
    • 또는, 게스트 정책을 이용하여 아직 인증되지 않은 사용자의 액세스도 가능하게 한다.
  • 자격을 얻은 이후 사용자들은 직접 AWS 서비스로 액세스 할 수 있는데,
  • SDK를 이용한 API 콜을 통해서나 혹은 api 게이트웨이를 통해서도 가능하다.
  • 사용자들이 받는 이러한 자격증명은 코그니토 자격 증명 풀에서의 설정을 기반으로 한 
    IAM 정책을 지니고 있다.

즉 정리하자면 코그니토 유저풀은 사용자의 로그인 인증 등의 기능을 제공해서 사용자를 관리하는 기능이며,

 

코그니토 Identiy Pool은 사용자가 직접 AWS 리소스에 접근해서 자료를 POST하거나 할 수 있도록 IAM

권한을 부여하는 기능이다.

 

Cognito Identity Pools- Diagram

  • 외부 사용자가 AWS 서비스에 접근 가능하게 하는 예시다.
  • 우선 사용자는 정해진 외부 자격 증명 제공자에 로그인을 해서 토큰을 발급 받는다.
  • 발급받은 토큰을 Identity Pools에 보내면, Identity Pools는 정해진 자격 증명 제공자에 요청을 해서 토큰 유효성을 검사한다.
  • 토큰이 유효하다면 STS를 통해 임시 자격 증명을 발급받고
  • 해당 임시 자격 증명을 사용자에게 반환한다.
  • 이제 사용자는 해당 자격증명을 통해 AWS 서비스에 액세스가 가능하다.

Cognito Identity Pools - IAM Roles

  • 그러면 어떤 사용자에게 어떤 역할을 부여할지는 정의해야한다.
  • 코그니토 Identity Pools는 인증된 사용자에게 부여할 역할과 게스트 사용자에게 부여할 역할을 미리 정의해 둘 수 있다.
  • 또한 사용자 ID에 따라서 다르게 역할을 배정할 수도 있으며
  • 정책 변수를 사용해서 사용자 별로 접근 권한을 다르게 설정할 수도 있다.
    • 사용자가 Cognito Identity Pool을 통해 인증되면 Identity ID가 생성됨.
    • 예를 들어, Identity ID가 **us-east-1:abcd1234-5678-efgh-ijkl-98765mnopqrs**라면,
      → 사용자는 my-app-bucket/us-east-1:abcd1234-5678-efgh-ijkl-98765mnopqrs/ 폴더에만 접근 가능.
    • 이런 식으로 가능하다.

해당 변수는 사용자 ID를 의미하는 변수다.

이런 식으로 prefix에 사용해서 접근을 제한하면 된다.