사용자 풀 인증 흐름 - Amazon Cognito

사용자 풀 인증 흐름

현대식 인증 흐름에는 사용자의 자격 증명을 확인하기 위해 암호 외에도 새로운 챌린지 유형이 통합되어 있습니다. 인증은 두 가지 공통 단계로 일반화되며, 이러한 단계는 두 API 작업인 InitiateAuthRespondToAuthChallenge를 통해 구현됩니다.

인증이 실패하거나 사용자에게 토큰이 발행될 때까지 사용자는 연속 챌린지에 응답하여 인증합니다. Amazon에서는 서로 다른 챌린지를 포함하기 위해 반복 실행되는 이러한 두 단계를 통해 사용자 지정 인증 흐름을 지원할 수 있습니다.

AWS Lambda 트리거를 사용하여 인증 흐름을 사용자 지정할 수 있습니다. 이러한 트리거는 인증 흐름의 일부로서 고유 챌린지를 발행 및 확인할 수 있습니다.

보안 백엔드 서버에 대해 관리자 인증 흐름을 사용할 수 있으며, 사용자 마이그레이션 인증 흐름을 사용하면 사용자에게 암호 재설정을 요구하지 않고도 사용자 마이그레이션이 가능합니다.

참고

로그인 시도의 실패는 5회까지 허용되며 그 후의 각 실패에 대해서는 1초부터 시작하여 약 15분까지 두 배씩 기하급수적으로 증가한 시간만큼 임시 잠금 상태가 됩니다. 임시 잠금 시간 동안의 시도는 무시됩니다. 임시 잠금 시간이 지난 후 다음 시도가 실패하면 새 임시 잠금 시간은 마지막 시간의 두 배로 시작됩니다. 시도하지 않고 15분 정도 기다리면 임시 잠금도 재설정됩니다. 이 동작은 변경될 수 있습니다.

클라이언트 측 인증 흐름

Android용 AWS Mobile SDK, AWS Mobile SDK for iOS 또는 JavaScript용 AWS SDK for JavaScript를 사용하여 생성된 최종 사용자 클라이언트 측 앱에서 사용자 풀 인증의 작동 방식은 다음과 같습니다.

  1. 사용자가 사용자 이름 및 암호를 앱에 입력합니다.

  2. 앱이 사용자의 사용자 이름 및 SRP 세부 정보를 사용하여 InitiateAuth 작업을 호출합니다.

    이 메서드는 인증 파라미터를 반환합니다.

    참고

    앱이 Android, iOS 및 JavaScript SDK에서 Amazon Cognito SRP 지원을 사용하여 SRP 세부 정보를 생성합니다.

  3. 앱이 RespondToAuthChallenge 작업을 호출합니다. 호출에 성공하면 메서드가 사용자 토큰을 반환하고 인증 흐름이 완료됩니다.

    또 다른 챌린지가 필요한 경우 토큰이 반환되지 않습니다. 대신 RespondToAuthChallenge를 호출하면 세션이 반환됩니다.

  4. RespondToAuthChallenge가 세션을 반환하는 경우 이번에는 앱이 세션 및 챌린지 응답(예: MFA 코드)과 함께 RespondToAuthChallenge를 다시 호출합니다.

서버 측 인증 흐름

최종 사용자 앱이 없지만, 대신 Java, Ruby 또는 Node.js 보안 백엔드 또는 서버 측 앱을 사용 중인 경우 Amazon Cognito 사용자 풀에 대해 인증된 서버 측 API를 사용할 수 있습니다.

서버 측 앱의 경우, 사용자 풀 인증은 클라이언트 측 앱과 비슷합니다. 단, 다음은 예외입니다.

  • 서버 측 앱은 AdminInitiateAuth API 작업(InitiateAuth 대신)을 호출합니다. 이 작업에는 AWS 관리자 자격 증명이 필요합니다. 이 작업은 인증 파라미터를 반환합니다.

  • 인증 파라미터를 지정하고 나면 앱에서 AdminRespondToAuthChallenge API 작업(RespondToAuthChallenge 대신)을 호출하는데, 이때도 AWS 관리자 자격 증명이 필요합니다.

AdminInitiateAuthAdminRespondToAuthChallenge 작업은 다음 중 하나를 수행하여 명시적으로 활성화하지 않는 경우 관리자 로그인에 대해 사용자 이름 및 암호 사용자 자격 증명을 허용할 수 없습니다.

  • 서버 측 앱의 CreateUserPoolClient 또는 UpdateUserPoolClient 호출에서 ExplicitAuthFlow 파라미터에 ADMIN_USER_PASSWORD_AUTH(이전 ADMIN_NO_SRP_AUTH)를 전달합니다.

  • 사용자 풀 생성앱 클라이언트 탭에서 Enable sign-in API for server-based authentication (ADMIN_USER_PASSWORD_AUTH)를 선택합니다. 자세한 내용은 사용자 풀 앱 클라이언트 구성 단원을 참조하십시오.

사용자 지정 인증 흐름

Amazon Cognito 사용자 풀은 서비스는 사용자 지정 인증 흐름도 활성화하는데, 이 인증 흐름을 통해 AWS Lambda 트리거를 사용하여 챌린지 응답 기반 인증 모델을 쉽게 생성할 수 있습니다.

사용자 지정 인증 흐름은 여러 요구 사항에 맞추어 사용자 지정할 수 있는 일련의 챌린지 및 응답 사이클을 허용하도록 고안되었습니다. 이 흐름은 사용할 인증 유형을 지시하고 초기 인증 파라미터를 제공하는 InitiateAuth API 작업을 호출하면서 시작됩니다. Amazon Cognito는 다음 중 하나를 사용하여 InitiateAuth 호출에 응답합니다.

  • 세션 및 파라미터와 함께 사용자에 대한 챌린지

  • 사용자가 인증에 실패할 경우 오류

  • InitiateAuth 호출에서 사용자 로그인에 필요한 파라미터가 제공된 경우 ID, 액세스 및 새로 고침 토큰. (일반적으로 챌린지에 먼저 응답해야 하지만 사용자 지정 코드로 이를 결정해야 합니다.)

Amazon Cognito가 챌린지를 통해 InitiateAuth 호출에 응답할 경우 앱은 입력을 더 수집하고 RespondToAuthChallenge 작업을 호출하여 챌린지 응답을 제공하고 세션을 다시 전달합니다. Amazon Cognito는 InitiateAuth 호출과 비슷하게 RespondToAuthChallenge 호출에 응답하여 사용자가 로그인한 경우 토큰을 제공하거나 또 다른 챌린지나 오류를 제공합니다. 또 다른 챌린지가 반환되면 사용자가 로그인하거나 오류가 반환될 때까지 RespondToAuthChallenge를 호출하여 앱에서 시퀀스가 반복됩니다. InitiateAuth 및 API 작업에 대한 자세한 내용은 RespondToAuthChallenge API 설명서를 참조하십시오.

기본 제공 인증 흐름 및 챌린지

Amazon Cognito에는 표준 인증을 위한 AuthFlowChallengeName 값이 기본으로 제공되어 SRP(Secure Remote Password) 프로토콜을 통해 사용자 이름과 암호가 확인됩니다. 이 흐름은 용 iOS, Android 및 JavaScript SDK에 내장되어 있습니다. 상위 수준에서는 AuthParameters에 있는 USERNAMESRP_A 값과 함께 USER_SRP_AUTHAuthFlowInitiateAuth에 보내면서 흐름이 시작됩니다. InitiateAuth 호출이 성공하면 PASSWORD_VERIFIER가 챌린지 파라미터의 ChallengeNameSRP_B로 응답에 포함됩니다. 그러면 앱이 PASSWORD_VERIFIER ChallengeNameChallengeResponses의 필수 파라미터를 사용하여 RespondToAuthChallenge를 호출합니다. RespondToAuthChallenge 호출이 성공하고 사용자가 로그인하면 토큰이 반환됩니다. 사용자에 대해 MFA(Multi-Factor Authentication)가 활성화된 경우 SMS_MFAChallengeName이 반환되고 앱은 RespondToAuthChallenge를 또 호출하여 필요한 코드를 제공할 수 있습니다.

사용자 지정 인증 흐름 및 챌린지

앱은 CUSTOM_AUTHAuthflow로 지정해 InitiateAuth를 호출하여 사용자 지정 인증 흐름을 시작할 수 있습니다. 사용자 지정 인증 흐름을 사용하면 트리거를 통해 챌린지 및 응답의 확인이 제어됩니다.

  • DefineAuthChallenge Lambda 트리거는 이전 챌린지와 응답의 세션 어레이를 입력으로 사용하고, 사용자가 인증되었는지(그리고 토큰이 부여되어야 하는지) 여부를 나타내는 부울과 다음 챌린지 이름을 출력합니다. 이 트리거는 챌린지를 통해 사용자의 경로를 제어하는 상태 시스템입니다.

  • CreateAuthChallenge Lambda 트리거는 챌린지 이름을 입력으로 사용하고 챌린지 및 파라미터를 생성하여 응답을 평가합니다. CreateAuthChallengeDefineAuthChallengeCUSTOM_CHALLENGE를 다음 챌린지로 반환하고 다음 챌린지 유형이 챌린지 메타데이터 파라미터에 전달될 때 호출됩니다.

  • VerifyAuthChallengeResponse Lambda 함수가 응답을 평가하고 부울을 반환하여 응답이 유효한지 여부를 나타냅니다.

사용자 지정 인증 흐름은 SRP 암호 확인 및 SMS를 통한 MFA와 같은 기본 제공 챌린지를 조합하여 사용할 수 있습니다. 또한 CAPTCHA 또는 본인 확인 질문과 같은 사용자 지정 챌린지를 사용할 수 있습니다.

사용자 지정 인증 흐름에서 SRP 암호 확인 사용

사용자 지정 인증 흐름에 SRP를 포함하려면 SRP를 시작해야 합니다.

  • 앱은 사용자 지정 흐름에서 SRP 암호 확인을 시작하기 위해 CUSTOM_AUTHAuthflow로 지정하여 InitiateAuth를 호출합니다. 여기에는 AuthParametersSRP_A:(SRP A 값) 및 CHALLENGE_NAME: SRP_A가 포함됩니다.

  • DefineAuthChallenge Lambda 트리거는 초기 세션의 challengeName: SRP_AchallengeResult: true에서 호출되며 challengeName: PASSWORD_VERIFIER, issueTokens: falsefailAuthentication: false로 응답해야 합니다.

  • 다음 앱은 challengeName: PASSWORD_VERIFIERchallengeResponses 맵의 SRP에 필요한 다른 파라미터와 함께 RespondToAuthChallenge를 호출해야 합니다.

  • 암호가 확인되면 DefineAuthChallenge Lambda 트리거가 두 번째 세션의 challengeName: PASSWORD_VERIFIERchallengeResult: true에서 호출됩니다. 이때 DefineAuthChallenge Lambda 트리기는 challengeName: CUSTOM_CHALLENGE로 응답하여 사용자 지정 챌린지를 시작할 수 있습니다.

  • 사용자에 대해 MFA가 활성화된 경우 암호가 확인된 후 자동으로 MFA가 처리됩니다.

참고

Amazon Cognito 호스팅 로그인 웹 페이지는 사용자 지정 인증 흐름을 지원하지 않습니다.

Lambda 트리거에 대한 자세한 내용은 Lambda 트리거를 사용하여 사용자 풀 워크플로우 사용자 지정 단원을 참조하십시오.

참고

Amazon Cognito 호스팅 로그인 웹 페이지는 사용자 지정 인증 흐름을 지원하지 않습니다.

관리 인증 흐름

사용자 지정 인증 흐름에서 설명한 API 작업은 암호 확인을 위해 SRP가 사용되며 권장되는 인증 방식입니다. iOS, Android 및 JavaScript SDK는 이 방식을 기반으로 하며 SRP를 쉽게 사용하도록 해줍니다. 그러나 SRP 계산을 원치 않는 경우 보안 백엔드 서버용으로 고안된 관리 API 작업을 대신 사용할 수 있습니다. 이러한 백엔드 관리자 구현의 경우 AdminInitiateAuthInitiateAuth 대신 사용되고, AdminRespondToAuthChallengeRespondToAuthChallenge 대신 사용됩니다. 이러한 작업을 사용할 때는 암호를 일반 텍스트로 제출할 수 있어 SRP 계산이 필요 없습니다. 예를 들면, 다음과 같이 지정합니다.

AdminInitiateAuth Request { "AuthFlow":"ADMIN_USER_PASSWORD_AUTH", "AuthParameters":{ "USERNAME":"<username>", "PASSWORD":"<password>" }, "ClientId":"<clientId>", "UserPoolId":"<userPoolId>" }

이 관리 인증 작업에는 개발자 자격 증명이 필요하며 AWS 서명 버전 4(SigV4) 서명 프로세스가 사용됩니다. 이 작업은 Node.js를 포함하여 Lambda 함수에 편리하게 쓸 수 있는 표준 AWS SDK에서 사용할 수 있습니다. 이러한 작업을 사용하고 일반 텍스트 암호를 받도록 하려면 콘솔에서 앱에 이러한 작업을 활성화해야 합니다. CreateUserPoolClient 또는 UpdateUserPoolClient 호출 시 ExplicitAuthFlow 파라미터에 ADMIN_USER_PASSWORD_AUTH를 전달해도 됩니다. InitiateAuthRespondToAuthChallenge 작업에는 ADMIN_USER_PASSWORD_AUTH AuthFlow가 허용되지 않습니다.

AdminInitiateAuth 응답 ChallengeParametersUSER_ID_FOR_SRP 속성이 있으면 별칭(이메일 주소 또는 전화 번호)이 아닌 사용자의 실제 사용자 이름이 이 속성에 포함됩니다. AdminRespondToAuthChallenge를 호출할 때 ChallengeResponses에서 USERNAME 파라미터에 이 사용자 이름을 전달해야 합니다.

참고

관리 인증 흐름은 백엔드 관리 구현을 위한 것이므로 디바이스 추적을 지원하지 않습니다. 장치 추적이 활성화되면 관리 인증이 성공하지만 액세스 토큰을 새로 고치기 위한 호출은 실패합니다.

사용자 마이그레이션 인증 흐름

사용자 마이그레이션 Lambda 트리거는 기존 사용자 관리 시스템에서 사용자 풀로의 손쉬운 마이그레이션을 허용합니다. 사용자 마이그레이션 과정에서 사용자가 암호를 재설정하지 않도록 하려면 USER_PASSWORD_AUTH 인증 흐름을 선택합니다. 이 흐름은 인증 시 암호화된 SSL 연결을 통해 사용자의 암호를 서비스로 보냅니다.

모든 사용자 마이그레이션이 완료되면 이 흐름을 보다 안전한 SRP 흐름으로 전환하는 것이 좋습니다. SRP 흐름은 네트워크를 통해 암호를 보내지 않습니다.

Lambda 트리거에 대해 자세히 알아보려면 Lambda 트리거를 사용하여 사용자 풀 워크플로우 사용자 지정 단원을 참조하십시오.

Lambda 트리거를 사용한 사용자 마이그레이션에 대한 자세한 내용은 사용자 마이그레이션 Lambda 트리거를 사용하여 사용자 풀로 사용자 가져오기 단원을 참조하십시오.