애플리케이션의 인증 방법으로 Amazon Cognito 사용자 풀을 사용하려고 합니다. 클라이언트가 애플리케이션에 보낸 ID 및 액세스 토큰을 확인하는 안전한 방법은 무엇입니까?

클라이언트가 사용자 풀을 사용하여 애플리케이션을 인증할 때 Amazon Cognito에서 ID 토큰을 전송합니다. 다음과 같은 상황에서 ID 토큰을 직접 확인해야 할 수 있습니다.

  • 웹 애플리케이션을 만든 후 인증에 Amazon Cognito 사용자 풀을 사용하려고 합니다.
  • 인증에 Amazon Cognito 사용자 풀을 사용하고, AWS Security Token Service(AWS STS) 임시 자격 증명을 검색하는 데 Amazon Cognito ID 풀을 사용합니다. AWS Lambda는 해당 자격 증명으로 호출되지만, Lambda에는 사용자 풀을 사용하여 누가 원래 인증했는지에 대한 정보가 없습니다.

Amazon Cognito JSON 웹 토큰(JWT)에 들어 있는 Amazon Cognito 사용자 세부 정보를 확인하려면 토큰을 디코딩한 후 서명을 확인합니다. AWS Lambda를 사용하여 Amazon Cognito JWT를 디코딩하고 확인하는 코드 예제를 보려면 GitHub에서 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하십시오.

사용자가 로그인하면 Amazon Cognito 사용자 풀에서 JWT를 반환합니다. JWT는 사용자에 대한 정보가 들어 있는 Base64 인코딩 JSON 문자열(클레임이라고 함)입니다. Amazon Cognito는 세 가지 토큰 즉, ID 토큰, 액세스 토큰 및 새로 고침 토큰을 반환합니다. ID 토큰에는 Amazon Cognito 사용자 풀에 정의된 사용자 필드가 포함되어 있습니다.

토큰에는 헤더, 페이로드, 서명 섹션이 있습니다.

다음은 샘플 ID 토큰의 헤더입니다. 헤더에는 키 ID("kid")와, 토큰에 서명하는 데 사용되는 알고리즘("alg")이 들어 있습니다. 이 예에서 알고리즘은 "RS256", 즉 SHA-256을 사용하는 RSA 서명입니다.

{
  "kid": "abcdefghijklmnopqrsexample=",
  "alg": "RS256"
}

다음은 사용자에 대한 정보와 토큰 생성 및 만료 타임스탬프를 포함하는 페이로드의 예입니다.

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}

마지막 섹션은 서명이며, 헤더와 페이로드 조합을 해싱 및 암호화한 것입니다.

Amazon Cognito는 각 사용자 풀에 대해 2개의 RSA 키 페어를 생성합니다. 각 키 페어의 프라이빗 키는 해당 ID 토큰이나 액세스 토큰에 서명하는 데 사용됩니다. 퍼블릭 키는 다음 형식의 주소에서 사용할 수 있습니다.

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

JSON 파일(jwks.json)의 형식은 다음과 같습니다.

{
    "keys": [{
        "alg": "RS256",
        "e": "AQAB",
        "kid": "abcdefghijklmnopqrsexample=",
        "kty": "RSA",
        "n": "lsjhglskjhgslkjgh43lj5h34lkjh34lkjht3example",
        "use": "sig"
    }, {
        "alg":
        "RS256",
        "e": "AQAB",
        "kid": "fgjhlkhjlkhexample=",
        "kty": "RSA",
        "n": "sgjhlk6jp98ugp98up34hpexample",
        "use": "sig"
    }]
}

Amazon Cognito JWT의 서명을 확인하려면 먼저 토큰 헤더의 키 ID와 일치하는 키 ID를 가진 퍼블릭 키를 검색합니다. 그런 다음 jwt.io 또는 OpenID Foundation에서 권장하는 라이브러리 등을 사용하여 토큰의 서명을 검증하고, 만료 및 사용자 이름과 같은 값을 추출합니다.

서명 외에도 다음을 확인하는 것이 좋습니다.

  • 토큰이 만료되지 않았음.
  • 페이로드에 지정된 대상("aud")이 Amazon Cognito 사용자 풀에 생성된 앱 클라이언트 ID와 일치함.

AWS Lambda를 사용하여 Amazon Cognito JWT를 디코딩하고 확인하는 코드 예제를 보려면 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하십시오.


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시된 날짜: 2018년 2월 13일

업데이트된 날짜: 2018년 7월 24일