JSON 웹 토큰 확인 - Amazon Cognito

JSON 웹 토큰 확인

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

사전 조건

라이브러리, SDK 또는 소프트웨어 프레임워크에서 이 섹션의 작업을 이미 처리했을 수 있습니다. 예를 들어 Amazon Cognito SDK에서 클라이언트 측 사용자 풀 토큰 처리 및 관리를 제공합니다. 마찬가지로 유효한(만료되지 않음) 새로 고침 토큰이 존재하고 ID 및 액세스 토큰의 유효 기간이 최소 5분 남아 있어야 한다는 두 가지 조건에 부합할 경우, Mobile SDK for iOS 및 Mobile SDK for Android는 ID 및 액세스 토큰을 자동으로 새로 고침합니다. SDK에 대한 자세한 내용과 JavaScript, Android, iOS용 샘플 코드는 Amazon Cognito 사용자 풀 SDK를 참조하세요.

JSON 웹 토큰(JWT)을 디코딩하고 확인하는 데 사용할 수 있는 유용한 라이브러리가 많습니다. 서버 측 API 처리를 위해 토큰을 수동으로 처리해야 하는 경우 또는 다른 프로그래밍 언어를 사용 중인 경우 이러한 라이브러리가 유용할 수 있습니다. JWT 토큰 작업을 위한 OpenID Foundation 라이브러리 목록을 참조하세요.

1단계: JWT의 구조 확인

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

  1. 헤더

  2. Payload

  3. 서명(Signature)

11111111111.22222222222.33333333333

이러한 섹션은 base64url 문자열로 인코딩되며 점(.) 문자로 구분됩니다. JWT가 이 구조를 확인하지 않은 경우에는 이를 유효하지 않은 것으로 간주하고 수락하지 않도록 합니다.

2단계: JWT 서명 검증

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

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

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

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

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

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

    1. 사용자 풀에 해당되는 퍼블릭 JSON 웹 키(JWK)를 다운로드하고 저장합니다. 이 키는 JSON 웹 키 집합(JWKS)의 일부로 사용이 가능합니다. 사용자 환경에 대해 다음 URL을 구성하여 찾을 수 있습니다.

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

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

      참고

      사용자 풀에 대한 JWK 다운로드 및 저장은 웹 API 작업에서 토큰을 처리하기 전에 1회성 단계로 진행됩니다. 그렇게 한 다음, 웹 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 파라미터는 퍼블릭 키의 용도를 설명합니다. 이 예제에서 usesig는 서명을 나타냅니다.

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

  3. GitHub의 aws-jwt-verify 라이브러리와 같은 JWT 라이브러리를 사용하여 발급자 서명을 토큰의 서명과 비교합니다. 발급자 서명은 kid 토큰과 일치하는 jwks.json 내 kid의 퍼블릭 키(RSA 모듈러스 "n")에서 파생됩니다. 먼저 형식을 JWK에서 PEM로 변환해야 합니다. 다음 예제에서는 JWT와 JWK를 가져와서 Node.js 라이브러리인 jsonwebtoken을 사용하여 JWT 서명을 확인합니다.

    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. ID 토큰의 aud 클레임 및 액세스 토큰의 client_id 클레임은 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여야 합니다.

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