Amazon Cognito 사용자 풀로 사용자를 가져오는 방안

5분 분량
콘텐츠 수준: 중급
1

해당 기사에서는 Amazon Cognito의 사용자 풀로 사용자를 가져오는 방안에 대해서 설명합니다.

Amazon Cognito를 사용하면 사용자 가입 및 로그인 기능을 추가하고 웹 및 모바일 애플리케이션에 대한 액세스를 제어할 수 있습니다. 사용 사례에 따라 대규모 사용자를 한번에 사용자 풀로 가져와야 하는 경우가 있고, 기존 사용자 풀에서 다른 사용자 풀로 사용자를 마이그레이션 하는 경우가 있습니다. 해당 기사에서는 상황에 따라 파일로 사용자를 가져오는 방안과 Lambda 트리거를 사용하여 사용자를 마이그레이션 하는 방안에 대해서 설명합니다.

Option 1. CSV 파일을 통해 사용자 풀로 사용자 가져오기

사용자를 Amazon Cognito 사용자 풀로 가져올 수 있습니다. 사용자 정보는 특별히 형식화된 .csv 파일에서 가져옵니다. 가져오기 프로세스는 비밀번호를 제외한 모든 사용자 속성에 대한 값을 설정합니다. 보안 모범 사례에서는 비밀번호를 일반 텍스트로 사용할 수 없도록 요구하고 해시 가져오기를 지원하지 않기 때문에 비밀번호 가져오기가 지원되지 않습니다. 이는 사용자가 처음 로그인할 때 비밀번호를 변경해야 함을 의미합니다. 따라서 이 방법을 사용하여 가져올 때 사용자는 RESET_REQUIRED 상태가 됩니다. [1]

Step 1. CloudWatch Logs IAM 역할 생성

Amazon Cognito가 가져오기 작업의 결과를 CloudWatch Logs에 기록하는 데 사용할 수 있는 IAM 역할을 생성해야 합니다. Cognito 콘솔에서 가져오기 작업을 생성할 때 CloudWatch 역할을 생성할 수 있지만, CLI 또는 API를 사용하는 경우 CloudWatch IAM 역할을 수동으로 생성해야 합니다. 다음 문서를 참고하여 CloudWatch 역할을 생성합니다. [2]

Step 2. 사용자 가져오기 CSV 파일 생성

기존 사용자를 사용자 풀로 가져오려면 먼저 가져올 사용자와 해당 속성을 포함하는 쉼표로 구분된 값(CSV) 파일을 생성해야 합니다. [3] Amazon Cognito 콘솔 또는 CLI를 통해서 CSV 파일 헤더를 다운 받을 수 있습니다.

여기에 이미지 설명 입력

파일을 다운로드하면, 아래와 같은 형식의 CSV 파일이 생성됩니다.

여기에 이미지 설명 입력

CSV 파일 지정 형식 규칙 및 제한사항은 다음 문서를 참고할 수 있습니다. [4] 다음과 같은 속성이 필요합니다.

  • cognito:username
  • cognito:mfa_enabled
  • email_verified 또는 phone_number_verified
    • 각 사용자의 자동 확인 속성 중 하나 이상이 true이어야 합니다. 자동 확인 속성은 새 사용자가 사용자 풀에 가입할 때 Amazon Cognito에서 자동으로 코드를 보내는 이메일 주소 또는 전화 번호입니다.
    • 사용자 풀에는 하나 이상의 자동 확인 속성(email_verified 또는 phone_number_verified)이 있어야 합니다. 사용자 풀에 자동 확인된 속성이 없으면 가져오기 작업이 시작되지 않습니다.
    • 사용자 풀에 자동 확인 속성이 하나만 있는 경우 각 사용자에 대해 해당 속성을 확인해야 합니다. 예를 들어 사용자 풀에 phone_number만 자동 검증 속성으로 설정되어 있는 경우 각 사용자의 phone_number_verified 값이 true이어야 합니다.
  • email(email_verified가 true인 경우)
  • phone_number(phone_number_verified가 true인 경우)
  • 사용자 풀을 생성할 때 필수 속성으로 표시한 모든 속성

아래는 사용자 정의 속성이 없는 사용자 풀에 대한 CSV 가져오기 파일 예시입니다.

cognito:username,name,given_name,family_name,middle_name,nickname,preferred_username,profile,picture,website,email,email_verified,gender,birthdate,zoneinfo,locale,phone_number,phone_number_verified,address,updated_at,cognito:mfa_enabled
John,,John,Doe,,,,,,,johndoe@example.com,TRUE,,02/01/1985,,,+12345550100,TRUE,123 Any Street,,FALSE
Jane,,Jane,Roe,,,,,,,janeroe@example.com,TRUE,,01/01/1985,,,+12345550199,TRUE,100 Main Street,,FALSE

Step 3. CSV 파일로 사용자 가져오기

생성한 IAM 역할과 CSV 파일을 사용하여 사용자 풀로 사용자 가져오기 작업을 실행합니다. 정상적으로 사용자 가져오기에 성공한다면, 아래와 같은 화면 및 CloudWatch Log를 확인하실 수 있습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

CSV 파일을 통해 사용자 풀로 사용자를 가져오는 방안은 비밀번호를 가져오지 않기에, 비밀번호 재 설정이 필요합니다. [5] 비밀번호 재 설정 완료 시, Confirmation status가 Reset required에서 Confirmed로 변경되는 것을 확인하실 수 있습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

Option 2. Lambda 트리거를 사용하여 사용자 가져오기

Lambda 트리거를 사용하여 사용자를 가져오면 사용자가 앱으로 처음 로그인하거나 암호 재설정을 요청할 때 기존 사용자 디렉터리에 있는 사용자를 사용자 풀로 원활하게 마이그레이션할 수 있습니다. 이 함수는 로그인하려고 하는 사용자에 대한 메타데이터를 수신하고 외부 자격 증명 소스에서 사용자 프로필 정보를 반환합니다. [6][7]

Step 1. Lambda 함수 생성

사용자가 암호를 사용하여 로그인할 때 사용자 풀에 존재하지 않는 경우 또는 암호 찾기 흐름에 있는 경우 Amazon Cognito에서 이 트리거를 호출합니다. Lambda 함수가 성공적으로 반환된 이후 Amazon Cognito는 사용자를 사용자 풀에 추가합니다. 아래 예제 코드를 참고하실 수 있습니다. (UserPoolId, ClientId를 자신의 정보로 변경합니다.)

import boto3

client = boto3.client('cognito-idp',region_name='ap-northeast-2')

def lambda_handler(event, context):
    if (event['triggerSource'] == 'UserMigration_Authentication'):
        user = client.admin_initiate_auth(
            UserPoolId='Your UserPool ID',  #old userpool where user exists
            ClientId='Your AppClient ID', #old appclientid where user exists
            AuthFlow='ADMIN_NO_SRP_AUTH',
            AuthParameters={
                'USERNAME': event['userName'],
                'PASSWORD': event['request']['password']
            }
        )
        if (user):
            userAttributes = client.get_user(
                AccessToken=user['AuthenticationResult']['AccessToken']
            )
            for userAttribute in userAttributes['UserAttributes']:
                if userAttribute['Name'] == 'email':
                    userEmail = userAttribute['Value']
                    #print(userEmail)
                    event['response']['userAttributes'] = {
                        "email": userEmail,
                        "email_verified": "true"
                    }
            event['response']['finalUserStatus'] = "CONFIRMED"
            event['response']['messageAction'] = "SUPPRESS"
            print (event)
            return (event)
        else:
            return('Bad Password')
    elif (event["triggerSource"] == "UserMigration_ForgotPassword"):
        user = client.admin_get_user(
            UserPoolId='Your UserPool ID',  #old userpool where user exists
            Username=event['userName']
        )
        if (user):
            for userAttribute in user['UserAttributes']:
                if userAttribute['Name'] == 'email':
                    userEmail = userAttribute['Value']
                    print(userEmail)
                    event['response']['userAttributes'] = {
                        "email": userEmail,
                        "email_verified": "true"
                    }
            event['response']['messageAction'] = "SUPPRESS"
            print (event)
            return (event)
        else:
            return('Bad Password')
    else:
        return('there was an error')

Step 2. 마이그레이션 사용자 풀 생성

기존 사용자 풀의 사용자를 마이그레이션할 새로운 사용자 풀을 생성합니다. 앱 클라이언트 생성 시, 클라이언트 암호(client secret)는 앱이 클라이언트에 대한 모든 API 요청에서 사용해야 하는 고정 문자열입니다. [7] 따라서, 해당 코드는 클라이언트 암호 설정 시 정상적으로 동작하지 않습니다.

새롭게 생성한 사용자 풀에 Lambda 트리거를 추가하여 Lambda 함수를 호출시 인증 작업을 사용자 정의합니다. [8] 기존에 생성한 Lambda 함수를 지정합니다.

여기에 이미지 설명 입력

Step 3. 사용자 마이그레이션 확인

아래는 기존 사용자 풀의 사용자를 새롭게 생성한 사용자 풀에 마이그레이션 하는 과정입니다.

기존 사용자 풀: 여기에 이미지 설명 입력

새로운 사용자 풀: 여기에 이미지 설명 입력

새로운 사용자 풀의 Hosted UI에서 기존 사용자 풀의 사용자로 로그인하게 되면 새로운 사용자 풀에 사용자가 마이그레이션된 것을 확인할 수 있습니다. 여기에 이미지 설명 입력

여기에 이미지 설명 입력


관련 정보

[1] CSV 파일에서 사용자 풀로 사용자 가져오기 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-using-import-tool.html

[2] CloudWatch Logs IAM 역할 생성 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-using-import-tool-cli-cloudwatch-iam-role.html

[3] 사용자 가져오기 CSV 파일 생성 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-using-import-tool-csv-header.html

[4] CSV 파일 형식 지정 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-using-import-tool-csv-header.html#cognito-user-pools-using-import-tool-formatting-csv-file

[5] Amazon Cognito 호스팅 UI에서 암호를 재설정하는 방법 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-hosted-ui-user-forgot-password.html

[6] 사용자 마이그레이션 Lambda 트리거를 사용하여 사용자 풀로 사용자 가져오기 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-import-using-lambda.html

[7] 앱 클라이언트 유형 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/user-pool-settings-client-apps.html#user-pool-settings-client-app-client-types

[8] Lambda 트리거를 사용하여 사용자 풀 워크플로 사용자 정의 - https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

댓글 없음

관련 콘텐츠