Amazon Cognito를 AWS CloudFormation 코드로 작성하여 로그인 및 회원 가입 로직 구현

Amazon Cognito를 AWS CloudFormation 코드로 작성하여 로그인 및 회원 가입 로직을 구현해 봤습니다.
2024.04.06

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 Amazon Cognito를 AWS CloudFormation 코드로 작성하여 로그인 및 회원 가입 로직을 구현해 봤습니다.

Amazon Cognito의 사용자 풀, 자격 증명 풀 설정은 아래 블로그와 동일합니다.

Amazon Cognito의 AWS CloudFormation 코드 및 HTML, JavaScript 코드를 포함한 전체 코드는 아래 깃 허브를 확인해 주세요.

AWS CloudFormation 코드

사용자 풀과 자격 증명 풀은 cognito.yml이라는 파일에서 생성하고 있습니다.

먼저 사용자 풀 코드는 다음과 같습니다.

  UserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: !Sub ${SystemName}-${EnvName}-UserPool
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: false # 관리자 이외에도 프로필을 생성 가능하도록 허용
        UnusedAccountValidityDays: 7  # 관리자가 설정한 임시 암호의 만료까지 남은 시간
      UsernameAttributes: # 사용자가 회원 가입할 때 이메일을 지정
      - email
      Policies: # 암호 정책 설정
        PasswordPolicy:
          MinimumLength: 8
          RequireLowercase: true
          RequireNumbers: true
          RequireSymbols: false
          RequireUppercase: true
      MfaConfiguration: 'OFF' # MFA 설정은 무효화
      AccountRecoverySetting: # 계적 복구에는 이메일을 사용
        RecoveryMechanisms:
          - Name: verified_email
            Priority: 1
      AutoVerifiedAttributes: # 로그인, 계쩡 복구 등에 사용할 인증 방법을 선택
      - email
      UserAttributeUpdateSettings: # 업데이트가 보류 중일 때 원래 속성 값을 활성 상태로 유지
        AttributesRequireVerificationBeforeUpdate:
          - email
      Schema: # 새 사용자가 생성될 때 필요한 속성을 확인
        - Name: email
          AttributeDataType: String
          Required: true
          Mutable: true
      EmailConfiguration: # 인증시 사용자에게 보낼 이메일 주소를 선택
        EmailSendingAccount: COGNITO_DEFAULT
        ReplyToEmailAddress: no-reply@verificationemail.com
  UserPoolClient:
    Type: AWS::Cognito::UserPoolClient
    Properties:
      ClientName: !Sub ${SystemName}-${EnvName}-ClientPool
      UserPoolId: !Ref UserPool
      GenerateSecret: false
      ExplicitAuthFlows:
        - ALLOW_USER_SRP_AUTH
        - ALLOW_REFRESH_TOKEN_AUTH
      SupportedIdentityProviders:
        - COGNITO

먼저 사용자 풀을 생성하는 코드입니다.

대략적인 설정은 다음과 같습니다.

  • 공급자 유형에는 Cognito 사용자 풀을 선택했으며, 로그인할 때 이메일을 사용하여 로그인하도록 설정했습니다.
  • 암호 정책은 Cognito 기본 값으로 진행했으며, 임시 암호의 만료 시간도 기본 값인 7일로 설정했습니다.
  • MFA 설정은 없는 상태로 설정했습니다.
  • 계정 복구를 위해 계정 복구 활성화를 했으며, 이메일을 통해 복구하도록 설정했습니다.
  • Cognito 지원 확인과 속성 변경 확인은 기본 값으로 진행했습니다.
  • 필수 속성은 이메일만을 설정했습니다.
  • 인증 코드를 받기 위한 이메일은 Cognito를 사용하여 전송하도록 하였으며, no-reply 이메일을 이용했습니다.
  • 앱 유형은 퍼블릭 클라이언트로 지정했습니다.

이어서 자격 증명 풀 코드입니다.

  IdentityPool:
    Type: AWS::Cognito::IdentityPool
    Properties:
      IdentityPoolName: !Sub ${SystemName}-${EnvName}-IdentityPool
      AllowUnauthenticatedIdentities: false
      CognitoIdentityProviders:
        - ClientId: !Ref UserPoolClient
          ProviderName: !GetAtt UserPool.ProviderName

자격 증명 풀에서는 자격 증명 풀의 이름을 지정하고, 사용자 풀의 ID와 이름을 지정합니다.

  IdentityPoolRoleAttachment:
    Type: AWS::Cognito::IdentityPoolRoleAttachment
    Properties:
      IdentityPoolId: !Ref IdentityPool
      Roles:
        authenticated: !GetAtt IdentityPoolRole.Arn

이어서 자격 증명 풀에서 IAM Role을 설정합니다.

여기서 IAM Role은 자격 증명 풀에서 자동으로 생성되는 ap-northeast-2_xxxxxxx_Full-access 정책을 바탕으로 새로 IAM Role을 생성했으며, 이 IAM Role을 자격 증명 풀과 연결하는 코드입니다.

HTML과 JavaScript에 대한 설명은 생략합니다.

결과 확인

회원 가입 폼에서 이메일과 비밀번호를 입력합니다.

이후 입력한 이메일 주소로 인증 코드를 확인합니다.

인증 화면에서 이메일 주소와 인증 코드를 입력합니다.

인증이 끝났다면, 로그인 페이지로 넘어가게 되며. 로그인을 시도합니다.

로그인에 성공했다면 화면에 로그인한 이메일 주소가 출력됩니다.

사용자 풀에서도 가입한 사용자의 정보를 확인할 수 있습니다.

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 kis2702@naver.com로 보내주시면 감사하겠습니다.