Amazon Cognito JSON 웹 토큰의 서명을 디코딩하고 확인하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 14일

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

간략한 설명

클라이언트가 사용자 풀을 사용하여 애플리케이션에 인증하면 Amazon Cognito는 ID 토큰을 전송합니다. 다음과 유사한 시나리오에서 ID 토큰을 수동으로 확인할 수 있습니다.

  • 웹 애플리케이션을 생성하고 인증에 Amazon Cognito 사용자 풀을 사용하고 싶습니다.
  • 인증에 Amazon Cognito 사용자 풀을 사용하고 Amazon Cognito 자격 증명 풀을 사용하여 AWS Security Token Service(AWS STS) 임시 자격 증명을 검색합니다. AWS Lambda는 이러한 자격 증명과 함께 호출되지만 Lambda에는 사용자 풀에서 원래 인증한 사용자에 대한 정보가 없습니다.

Amazon Cognito JSON Web Token(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”)이 포함됩니다. 이 예에서 알고리즘은 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 키 페어를 생성합니다. 각 페어의 개인 키는 해당 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 토큰 디코딩 및 확인을 참조하십시오.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?