Amazon Cognito
개발자 가이드

JSON 웹 토큰 확인

이러한 단계들은 사용자 풀 JSON 웹 토큰(JWT)의 확인 방법을 설명합니다.

사전 조건

  • 이 단원에서는 라이브러리, SDK 또는 소프트웨어 프레임워크에서 이미 처리되었을 수 있는 작업들을 설명합니다. 예를 들어 사용자 풀 토큰 처리 및 관리는 Amazon Cognito SDK를 통해 클라이언트 측에서 제공됩니다. 마찬가지로 유효한(기간이 만료되지 않은) 새로 고침 토큰이 존재하고 ID 및 액세스 토큰의 유효 기간이 최소 5분 남아 있는 경우, Mobile SDK for iOS 및 Android용 Mobile SDK는 ID 및 액세스 토큰을 자동으로 새로 고침합니다. SDK와 JavaScript, Android 및 iOS용 샘플 코드에 대한 자세한 내용은 Amazon Cognito 사용자 풀 SDK를 참조하십시오.

  • 서버 측 API 처리를 위해 토큰을 수동으로 처리해야 하거나 다른 프로그래밍 언어를 사용하고 있는 경우, 다양한 라이브러리를 활용하여 JWT를 디코딩 및 확인할 수 있습니다. JWT 토큰 작업을 위한 OpenID Foundation 라이브러리 목록을 참조하십시오.

1단계: JWT 구조 확인

JSON 웹 토큰(JWT)은 다음 3개의 섹션이 포함되어 있습니다.

  1. 헤더

  2. Payload

  3. Signature

11111111111.22222222222.33333333333

JWT는 Base64url 문자열로 암호화되며 점(".") 문자로 구분됩니다. JWT가 이 구조를 확인하지 않은 경우에는 이를 유효하지 않은 것으로 간주하고 수락하지 않도록 합니다.

2단계: JWT 서명 검증

JWT 서명은 헤더와 페이로드의 해시 조합입니다. Amazon Cognito는 각 사용자 풀에서 RSA 암호화 키를 두 쌍 생성합니다. 프라이빗 키 중 하나는 토큰 서명에 사용됩니다.

JWT 토큰의 서명을 확인하는 방법

  1. ID 토큰을 디코딩합니다.

    1. AWS Lambda을 사용하여 사용자 풀 JWT를 디코딩할 수 있습니다. 자세한 내용은 Lambda를 사용하여 Amazon Cognito JWT 토큰을 디코딩 및 확인을 참조하십시오.

    2. 또한 OpenID Foundation에는 JWT 토큰 작업을 위한 라이브러리 목록이 포함되어 있습니다.

  2. 로컬 키 ID(kid)를 퍼블릭 키와 비교합니다.

    1. 사용자 풀에 해당되는 퍼블릭 JSON 웹 키(JWK)를 다운로드하고 저장합니다. 이 키는 JSON 웹 키 집합(JWKS)의 일부로 사용이 가능합니다. https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json에서 찾을 수 있습니다.

      JWK 및 JWK 집합에 대한 자세한 내용은 JSON 웹 키(JWK)를 참조하십시오.

      참고

      웹 API에서 토큰을 처리할 수 있으려면 이 단계를 한 번 거쳐야 합니다. 이제 웹 API에서 ID 토큰과 액세스 토큰을 사용할 때마다 다음 단계를 수행할 수 있습니다.

      jwks.json 파일 샘플입니다.

      { "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
      키 ID(kid)

      kid는 토큰의 JSON 웹 서명(JWS)을 보호하는 데 어떤 키가 사용되었는지 나타내는 힌트입니다.

      알고리즘(alg)

      alg 헤더 파라미터는 ID 토큰을 보호하는 데 사용되는 암호화 알고리즘을 나타냅니다. 사용자 풀은 SHA-256에서의 RSA 서명인 RS256 암호화 알고리즘을 사용합니다. RSA에 대한 자세한 정보는 RSA 암호화를 참조하십시오.

      키 유형(kty)

      kty 파라미터는 이 예제의 "RSA"와 같이 키에서 사용되는 암호화 알고리즘 그룹을 식별합니다.

      RSA 지수(e)

      e 파라미터는 RSA 퍼블릭 키의 지수 값을 포함합니다. 이 값은 Base64urlUInt 인코딩 값으로 표현됩니다.

      RSA 모듈러스(n)

      n 파라미터는 RSA 퍼블릭 키의 모듈러스 값을 포함합니다. 이 값은 Base64urlUInt 인코딩 값으로 표현됩니다.

      사용(use)

      use 파라미터는 퍼블릭 키의 용도를 설명합니다. 이 예제에서 use 값 sig는 서명을 나타냅니다.

    2. JWT의 kid와 일치하는 kid에서 퍼블릭 JSON 웹 키를 검색합니다.

  3. 퍼블릭 키를 사용하여 JWT 라이브러리를 이용한 서명을 확인합니다. 먼저 형식을 JWK에서 PEM로 변환해야 합니다. 이 예제에서는 JWT 및 JWK를 가져와서 Node.js 라이브러리인 jsonwebtoken을 사용하여 JWT 서명을 확인하고 있습니다.

    Node.js
    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

3단계: 클레임 확인

JWT 클레임을 확인하는 방법

  1. 토큰이 만료되지 않았는지 확인합니다.

  2. 대상(aud) 클레임은 Amazon Cognito 사용자 풀에서 생성된 앱 클라이언트 ID와 일치해야 합니다.

  3. 발행자(iss) 클레임은 사용자 풀과 일치해야 합니다. 예를 들어 us-east-1 리전에서 생성된 사용자 풀은 다음과 같은 iss 값을 갖게 됩니다.

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>를 선택하십시오.

  4. token_use 클레임을 확인합니다.

    • 웹 API에서 액세스 토큰만 허용하는 경우 해당 값은 access여야 합니다.

    • ID 토큰만 사용하고 있는 경우 해당 값은 id여야 합니다.

    • ID와 액세스 토큰을 모두 사용하고 있는 경우에는 token_use 클레임이 id 또는 access여야 합니다.

이제 토큰 내에 있는 클레임을 신뢰할 수 있습니다.