Amazon Cognito 사용자 풀에서 기억된 디바이스를 사용하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Cognito 사용자 풀의 사용자가 내 앱에 로그인하는 데 사용하는 디바이스를 추적하고 싶습니다.

간략한 설명

Amazon Cognito는 사용자 풀의 사용자가 로그인하는 데 사용하는 디바이스를 추적하고 기억할 수 있습니다. 디바이스 기억 기능을 사용하면 단일 장치에서의 로그인 제한과 같은 로그인 제한을 설정할 수 있습니다. 또는 사용자가 동일한 디바이스에서 반복되는 로그인을 건너뛰도록 할 수 있습니다. 자세한 내용은 사용자 풀 디바이스 추적 설정 지정을 참조하세요.

참고: 디바이스 추적 기능을 사용하려면 USER_SRP_AUTH 인증 흐름을 사용해야 합니다. 기억된 디바이스를 사용하여 다중 인증(MFA) 을 대체하려면 사용자 풀의 MFA도 켜야 합니다.

디바이스 기억은 두 부분으로 구성된 프로세스로 이루어집니다.

  • 새 디바이스 확인: 디바이스에서 인증을 시작한 다음 Amazon Cognito로 인증을 확인하여 고유한 디바이스 식별자를 얻습니다.
  • 확인된 디바이스 확인: 확인된 디바이스에서 인증을 시작하여 후속 로그인 시도 시 MFA 단계를 건너뛰세요.

해결 방법

참고: 이 지침은 앱 클라이언트 코드에서 수행하는 Amazon Cognito API 호출을 설명합니다. AWS Mobile SDK와 같은 클라이언트 측 SDK를 사용하는 경우 SDK가 구현의 대부분을 처리합니다.

기억된 디바이스 설정

  1. Amazon Cognito 콘솔에서 **Manage user pools(사용자 풀 관리)**를 선택한 다음, 사용자 풀을 선택하세요.
  2. 탐색 창의 **General settings(일반 설정)**에서 **Devices(디바이스)**를 선택합니다.
  3. Do you want to remember your user's devices(사용자 디바이스를 기억하시겠습니까?) 에서 Always(항상) 또는 **User Opt In(사용자 옵트 인)**을 선택합니다. 자세한 내용은 Amazon Cognito를 사용한 디바이스 추적 및 기억을 참조하세요.
  4. **다중 인증(MFA) 중에 기억되는 디바이스를 사용하여 두 번째 요소를 차단하시겠습니까?**에서 또는 아니요를 선택합니다. 자세한 내용은 기억된 디바이스를 사용하여 다중 인증(MFA) 차단하기를 참조하세요.
    참고: 이러한 옵션이 표시되지 않으면 MFA가 활성화되지 않은 것입니다. MFA를 설정하려면 탐색 창에서 MFA 및 확인을 선택합니다.
  5. 변경 사항 저장을 선택합니다.

SetUserMFAPreference 호출

앱 클라이언트 코드에서 SetUserMFAPreference API를 호출하여 사용하는 MFA 메서드의 MFA 기본 설정을 true로 설정합니다.

InitiateAuth 호출

앱 클라이언트 코드에서 InitiateAuth API를 호출하여 디바이스 키를 가져옵니다. 이 API 요청에는 다음 요청 파라미터를 포함하세요.

  • AuthFlow: USER_SRP_AUTH를 사용하세요.
  • AuthParameters: USERNAME, SRP_A, 및 SECRET_HASH 인증 파라미터를 포함합니다.
    참고: SECRET_HASH는 앱 클라이언트가 클라이언트 암호로 구성된 경우에만 필요합니다.

다음 공식을 사용하여 SRP_A를 계산하세요.
SRP_A = ga (mod N)

  • AuthenticationHelper.js 에 정의된 대로 g를 사용합니다. g에 대한 정의는 GitHub 웹 사이트의 AuthenticationHelper.js를 참조하세요.
  • a = 128개의 랜덤 바이트라고 가정해 봅시다

자세한 내용은 요청 구문선택한 AWS SDK의 API 참조를 참조하세요.

MFA 챌린지에 대한 RespondToAuthChallenge 호출

앱 클라이언트가 InitiateAuth API 호출을 수행한 후 Amazon Cognito 사용자 풀은 일련의 MFA 챌린지를 반환합니다. MFA 챌린지는 활성화한 MFA 메서드를 기반으로 합니다.

앱은 RespondToAuthChallenge API를 사용하여 이러한 챌린지에 답해야 합니다. 예를 들어 사용자 풀에서 SMS 문자 메시지 MFA를 활성화한 경우 SMS_MFA 값과 함께 ChallengeName 파라미터를 포함시키세요. 자세한 내용은 요청 구문선택한 AWS SDK의 API 참조를 참조하세요.

디바이스 키 저장

모든 MFA 챌린지에 답하면 Amazon Cognito는 NewDeviceMetadataType 필드에 DeviceGroupKey와 고유한 DeviceKey를 사용하여 응답합니다.

브라우저에서 JavaScript 또는 Android, iOS용 AWS Mobile SDK를 사용하면 애플리케이션이 자동으로 이러한 키를 디바이스의 로컬 스토리지로 이동합니다. 다른 AWS SDK를 사용하는 경우 앱에 사용할 유사한 키 스토리지 솔루션을 설계해야 합니다.

ConfirmDevice 호출

DeviceGroupKeyDeviceKey로 보안 원격 암호(SRP) 프로토콜을 사용하여 암호를 생성합니다. 그러면 솔트와 암호 검증기가 생성됩니다. 다음 요청 파라미터를 포함하는 ConfirmDevice API 호출을 통해 이를 Amazon Cognito에 전달하세요.

  • AccessToken: 사용자에 대한 유효한 액세스 토큰을 사용합니다.
  • DeviceKey: Amazon Cognito에서 반환한 디바이스의 고유 키를 사용합니다.
  • DeviceName: 디바이스에 지정한 이름을 사용합니다. (AWS Mobile SDK는 User Agent를 사용합니다.)
  • DeviceSecretVerifierConfig: Salt(16개의 임의 바이트, Base64로 인코딩) 및 PasswordVerifier를 포함합니다.

PasswordVerifier의 경우 다음 공식을 사용합니다.
PasswordVerifier = g( SHA256_HASH(salt + FULL_PASSWORD) ) (mod N)

  • AuthenticationHelper.js 에 정의된 대로 g를 사용합니다. g에 대한 정의는 GitHub 웹 사이트의 AuthenticationHelper.js를 참조하세요.
  • FULL_PASSWORD = SHA256_HASH(DeviceGroupKey + username + ":" + RANDOM_PASSWORD)라고 가정합니다
  • RANDOM_PASSWORD = 40개의 임의 바이트, base64로 인코딩됨이라고 가정합니다
  • AuthenticationHelper.js 에 정의된 대로 N을(를) 사용합니다. N의 정의는 GitHub 웹 사이트의 AuthenticationHelper.js를 참조하세요.

자세한 내용은 요청 구문선택한 AWS SDK의 API 참조를 참조하세요.

(선택 사항) UpdateDeviceStatus 호출

사용자 풀에서 기억된 디바이스를 설정할 때 **Always(항상)**을 선택하면 이 단계를 건너뛸 수 있습니다. **User Opt In(사용자 옵트 인)**을 선택하는 경우 UpdateDeviceStatus API 호출을 포함해야 합니다.

참고: Amazon Cognito Identity SDK for JavaScript를 사용하는 경우 대신 setDeviceStatusRemembered 또는 setDeviceStatusNotRemembered를 호출해야 합니다. Amazon Cognito Identity SDK for JavaScript를 사용하는 방법에 대한 자세한 내용은 GitHub 웹 사이트의 Usage(사용)을 참조하세요.

앱 사용자에게 디바이스를 기억하도록 설정하는 옵션을 제공하면 사용자 풀에서 기기 확인이 '기억되지 않음'으로 추적됩니다. 사용자에게 디바이스를 기억시키고 싶은지 물어본 다음 UpdateDeviceStatusAPI를 사용하여 입력 내용을 보내야 합니다.

참고: 옵트 인이 필요한 경우 사용자가 옵트 인해야 디바이스를 기억하고 MFA 챌린지를 차단할 수 있습니다.

디바이스 키를 사용하여 InitiateAuth 호출

앱 클라이언트 코드에서 InitiateAuth API를 호출하여 기억된 디바이스를 확인합니다. 이 호출에서 다음과 같이 요청 파라미터에 디바이스 키를 포함합니다.

  • AuthFlow: USER_SRP_AUTH를 사용하세요.
  • AuthParameters: USERNAME, SRP_A, 및 DEVICE_KEY 인증 파라미터를 포함합니다.

자세한 내용은 요청 구문선택한 AWS SDK의 API 참조를 참조하세요.

DEVICE_SRP_AUTH에 대한 RespondToAuthChallenge 호출

앱 클라이언트가 유효한 디바이스 키로 InitiateAuth API 호출을 수행하면 Amazon Cognito 사용자 풀이 PASSWORD_VERIFIER 챌린지를 반환합니다. 챌린지 응답에 DEVICE_KEY를 포함해야 합니다. 그러면 DEVICE_SRP_AUTH 챌린지를 받게 됩니다. 응답하려면 RespondToAuthChallenge API를 호출하고 다음 요청 파라미터를 포함하세요.

  • ChallengeName: DEVICE_SRP_AUTH를 사용하세요.
  • ClientId: 유효한 앱 클라이언트 ID를 사용하세요.
  • ChallengeResponses: 이 응답에 USERNAME, DEVICE_KEY, 및 SRP_A를 포함하세요.
    참고: SRP_A의 경우 이 지침의 앞부분에 설명된 공식을 사용하세요.

이 API 호출 후 Amazon Cognito는 다음과 같은 한 가지 추가 챌린지로 응답합니다. DEVICE_PASSWORD_VERIFIER. 응답에서 ChallengeParameters SECRET_BLOCKSRP_B의 값도 얻을 수 있습니다. 챌린지에 응답하려면 SECRET_BLOCKSRP_B 값이 필요합니다.

자세한 내용은 요청 구문선택한 AWS SDK의 API 참조를 참조하세요.

DEVICE_PASSWORD_VERIFIER에 대한 RespondToAuthChallenge 호출

DEVICE_PASSWORD_VERIFIER 챌린지에 응답하려면 RespondToAuthChallenge API를 호출하고 다음 요청 파라미터를 포함하세요.

  • ChallengeName: DEVICE_PASSWORD_VERIFIER를 사용하세요.
  • ClientId: 유효한 앱 클라이언트 ID를 사용하세요.
  • ChallengeResponses: USERNAME, PASSWORD_CLAIM_SECRET_BLOCK, TIMESTAMP, PASSWORD_CLAIM_SIGNATURE, 및 DEVICE_KEY를 포함하세요.

챌린지 응답을 다음과 같이 정의하세요.

  • PASSWORD_CLAIM_SECRET_BLOCK의 경우 SECRET_BLOCK의 값을 사용하세요.
  • TIMESTAMP의 경우 현재 시간을 포함하세요. (예: Tue Sep 25 00:09:40 UTC 2018)
  • PASSWORD_CLAIM_SIGNATURE = SHA256_HMAC(K_USER, DeviceGroupKey + DeviceKey + PASSWORD_CLAIM_SECRET_BLOCK + TIMESTAMP), base64 인코딩이라고 가정합니다
  • K_USER = SHA256_HASH(S_USER)라고 가정합니다
  • S_USER = [ ( SRP_B - [ k * [ (gx) (mod N) ] ] )(a + ux) ](mod N)라고 가정합니다
  • x = SHA256_HASH(salt + FULL_PASSWORD)라고 가정합니다
  • u = SHA256_HASH(SRP_A + SRP_B)라고 가정합니다
  • k = SHA256_HASH(N + g)라고 가정합니다

사용자 풀에서 JSON 웹 토큰 가져오기

마지막 챌린지에 성공적으로 응답하면 Amazon Cognito 사용자 풀이 AuthenticationResult에 JSON 웹 토큰을 반환합니다.

{
    "AuthenticationResult": {
        "AccessToken": "...",
        "ExpiresIn": 3600,
        "IdToken": "...",
        "RefreshToken": "...",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}

관련 정보

사용자 풀 인증 흐름

사용자 풀 참조(AWS Management Console)

GitHub 웹사이트의 CognitoUser.js

AWS 공식
AWS 공식업데이트됨 6달 전