애플리케이션의 인증 방법으로 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 JWT(JSON 웹 키 토큰)에 포함된 Amazon Cognito 사용자 세부 정보를 가져오려면 해당 토큰을 디코딩하고 서명을 확인합니다. AWS Lambda를 사용하여 Amazon Cognito JWT를 디코딩 및 확인하려면 GitHub 웹 사이트에서 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하십시오.

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

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

다음은 샘플 ID 토큰의 헤더입니다. 헤더에는 키 ID(“kid”)는 물론 토큰에 서명하는 데 사용되는 알고리즘(“alg”)이 포함되어 있습니다. 이 예에서 알고리즘은 SHA-256을 사용하는 RSA 서명인 “RS256”입니다.

{
  "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는 각 사용자 풀에 대해 두 쌍의 RSA 키를 생성합니다. 프라이빗 키 중 하나가 토큰에 서명하는 데 사용됩니다. 그에 상응하는 퍼블릭 키는 다음 형식의 주소에서 사용할 수 있게 됩니다.

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

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의 서명을 확인하려면 먼저, JWT의 키 ID와 일치하는 키 ID를 사용하여 키를 검색합니다. 그런 다음, 라이브러리를 사용하여 토큰을 디코딩하고 서명을 확인합니다. 또한 다음 사항을 확인하십시오.

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

이 해결 방법은 대부분의 애플리케이션에 적합합니다. 이 해결 방법에 AWS Lambda를 사용하려면 GitHub 웹 사이트에서 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하십시오.


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

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

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

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