Amazon Cognito
개발자 가이드

사용자 풀 인증 흐름

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

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

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

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

클라이언트 측 인증 흐름

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 API는 다음 중 하나를 수행하여 명시적으로 활성화하지 않는 경우 관리자 로그인에 대해 사용자 이름 및 암호 사용자 자격 증명을 허용할 수 없습니다.

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

  • 사용자 풀 생성앱 클라이언트에서 서버 기반 인증용 로그인 API 활성화 (ADMIN_NO_SRP_AUTH)를 선택합니다. 자세한 내용은 사용자 풀 앱 클라이언트 구성 단원을 참조하십시오.

사용자 지정 인증 흐름

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

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

  • 사용자가 로그인한 경우 ID, 액세스 및 새로 고침 토큰

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

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

Amazon Cognito가 챌린지를 통해 InitiateAuth 호출에 응답할 경우 앱은 입력을 더 수집하고 RespondToAuthChallenge API를 호출하여 챌린지 응답을 제공하고 세션을 다시 전달합니다. Amazon Cognito는 InitiateAuth 호출과 비슷하게 RespondToAuthChallenge 호출에 응답하여 사용자가 로그인한 경우 토큰을 제공하거나 또 다른 챌린지나 오류를 제공합니다. 또 다른 챌린지가 반환되면 사용자가 로그인하거나 오류가 반환될 때까지 RespondToAuthChallenge를 호출하여 앱에서 시퀀스가 반복됩니다. 자세한 내용은 InitiateAuthRespondToAuthChallenge API의 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(멀티 팩터 인증)가 활성화된 경우 SMS_MFAChallengeName이 반환되고 앱은 RespondToAuthChallenge를 또 호출하여 필요한 코드를 제공할 수 있습니다.

앱은 CUSTOM_AUTH와 함께 InitiateAuthAuthflow로 호출하여 사용자 지정 인증 흐름을 시작할 수 있습니다. 사용자 지정 인증 흐름을 사용하면 트리거를 통해 챌린지 및 응답의 확인이 제어됩니다. DefineAuthChallenge Lambda 트리거는 이전 챌린지와 응답의 세션 어레이를 입력으로 사용하고, 사용자가 인증되거나(권한이 부여된 토큰이어야 함) 인증이 실패한 경우 다음 챌린지 이름과 부울을 출력합니다. 이 트리거는 챌린지를 통해 사용자의 경로를 제어하는 상태 시스템입니다. CreateAuthChallenge Lambda 트리거는 챌린지 이름을 입력으로 사용하고 챌린지 및 파라미터를 생성하여 응답을 평가합니다. CreateAuthChallengeDefineAuthChallengeCUSTOM_CHALLENGE를 다음 챌린지로 반환되고 다음 챌린지 유형이 챌린지 메타데이터 파라미터에 전달될 때 호출됩니다. VerifyAuthChallengeResponse Lambda 함수가 응답을 평가하고 부울을 반환하여 응답이 유효한지 여부를 나타냅니다.

또한 사용자 지정 인증 흐름은 SRP 암호 및 SMS를 통한 MFA와 같은 기본 제공 챌린지와 CAPTCHA 또는 본인 확인 지문과 같은 사용자 지정 챌린지를 함께 사용할 수 있습니다. 사용자 지정 인증 흐름에 SRP를 포함하려면 SRP를 시작해야 합니다. SRP 암호 확인을 시작하기 위해 DefineAuthChallenge Lambda 트리거가 챌린지 이름으로 SRP_A를 반환하고 인증 파라미터 맵의 SRP_A를 반환합니다. 암호가 확인되면 DefineAuthChallenge Lambda 트리거가 이전 챌린지 어레이의 PASSWORD_VERIFIER로 다시 호출됩니다. 사용자에 대해 활성화된 경우 MFA가 자동으로 수행됩니다.

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

참고

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

관리 인증 흐름

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

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

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

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

참고

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

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

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

모든 사용자 마이그레이션을 완료했을 때 네트워크를 통해 어떠한 암호도 전송하지 않는 더욱 안전한 보안 SRP 흐름으로 흐름을 전환하는 것이 좋습니다.

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

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