JSON웹 토큰 확인 - Amazon Cognito

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

JSON웹 토큰 확인

이 단계에서는 사용자 풀 JSON 웹 토큰 (JWT) 확인에 대해 설명합니다.

사전 조건

라이브러리 또는 소프트웨어 프레임워크가 이 섹션의 작업을 이미 처리하고 있을 수 있습니다. SDK AWS SDKs앱에서 Amazon Cognito 사용자 풀 토큰 처리 및 관리를 위한 도구를 제공합니다. AWS Amplify Amazon Cognito 토큰을 검색하고 새로 고치는 함수를 포함합니다.

자세한 내용은 다음 페이지를 참조하십시오.

JSON웹 토큰 () 을 디코딩하고 검증하는 데 사용할 수 있는 라이브러리가 많이 있습니다. JWT 서버 측 API 처리를 위해 토큰을 수동으로 처리하려는 경우 또는 다른 프로그래밍 언어를 사용하는 경우 이러한 라이브러리가 도움이 될 수 있습니다. 토큰 작업에 대한 OpenID 기초 라이브러리 목록을 참조하십시오. JWT

다음을 사용하여 토큰을 검증합니다. aws-jwt-verify

Node.js 앱에서는 aws-jwt-verify라이브러리가 사용자가 앱에 전달하는 토큰의 파라미터를 검증하도록 AWS 권장합니다. aws-jwt-verify를 사용하면 하나 이상의 사용자 풀에 대해 확인하려는 클레임 값으로 CognitoJwtVerifier를 채울 수 있습니다. 확인할 수 있는 값에는 다음이 포함됩니다.

Node.js 앱 또는 AWS Lambda 권한 부여자에서 사용할 수 있는 자세한 내용 및 예제 코드는 aws-jwt-verify GitHubon을 참조하십시오.

토큰 이해 및 검사

토큰 검사를 앱과 통합하기 전에 Amazon Cognito가 어떻게 조합되는지 생각해 보세요. JWTs 사용자 풀에서 예시 토큰을 검색하세요. 디코딩하고 자세히 검사하여 특성을 이해하고 언제 무엇을 검증할지 결정하세요. 예를 들어 한 시나리오에서는 그룹 멤버십을 검사하고 또 다른 시나리오에서는 범위를 검사할 수 있습니다.

다음 섹션에서는 앱을 JWTs 준비하면서 Amazon Cognito를 수동으로 검사하는 프로세스를 설명합니다.

의 구조를 확인하십시오. JWT

JSON웹 토큰 (JWT) 에는 세 개의 섹션과 두 섹션 사이에 . (점) 구분 기호가 있습니다.

헤더

Amazon Cognito가 토큰에 서명하는 데 사용한 키 ID 및 RSA 알고리즘. kid alg Amazon Cognito는 RS256이라는 alg로 토큰을 서명합니다. 사용자 kid 풀이 보유한 2048비트 RSA 개인 서명 키에 대한 잘린 참조입니다.

페이로드

토큰 클레임입니다. ID 토큰의 클레임에는 사용자 속성 및 사용자 풀(iss), 앱 클라이언트(aud)에 대한 정보가 포함됩니다. 액세스 토큰의 페이로드에는 범위, 그룹 멤버십과 포함되며 사용자 풀이 iss로, 앱 클라이언트가 client_id로 포함됩니다.

Signature

서명은 헤더 및 페이로드와 같이 디코딩할 수 있는 base64가 아닙니다. 서명 키와 매개 변수에서 파생된 RSA256 식별자로, 사용자가 직접 확인할 수 있습니다. JWKS URI

헤더와 페이로드는 base64로 JSON 인코딩됩니다. 시작 문자 {로 디코딩되는 시작 문자 eyJ로 알 수 있습니다. 사용자가 base64로 인코딩된 JWT 형식을 앱에 제시하고 해당 [JSON Header].[JSON Payload].[Signature] 형식이 아닌 경우 이는 유효한 Amazon Cognito 토큰이 아니므로 폐기해도 됩니다.

유효성을 검사하십시오. JWT

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

토큰의 서명을 확인하려면 JWT
  1. ID 토큰을 디코딩합니다.

    OpenID 재단은 또한 토큰 작업을 위한 라이브러리 목록을 유지 관리합니다. JWT

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

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

    1. 사용자 풀에 해당하는 퍼블릭 JSON 웹 키 (JWK) 를 다운로드하고 저장합니다. JSON웹 키 세트 (JWKS) 의 일부로 제공됩니다. 환경에 jwks_uri URI 맞게 다음을 구성하여 찾을 수 있습니다.

      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json

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

      참고

      Amazon Cognito는 사용자 풀의 서명 키를 교체할 수 있습니다. 가장 좋은 방법은 kid를 캐시 키로 사용하여 앱에서 퍼블릭 키를 캐시하고 주기적으로 캐시를 새로 고치는 것입니다. 앱에서 받는 토큰의 kid를 캐시와 비교합니다.

      발급자는 올바르지만 kid가 다른 토큰을 받은 경우 Amazon Cognito가 서명 키를 교체했을 수 있습니다. 사용자 풀 jwks_uri 엔드포인트에서 캐시를 새로 고칩니다.

      다음은 샘플 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 토큰을 보호하는 데 사용되는 암호화 알고리즘을 나타냅니다. 사용자 풀은 -256의 RSA 서명인 RS256 암호화 알고리즘을 사용합니다. SHA 에 대한 자세한 내용은 암호화를 참조하십시오. RSA RSA

      키 유형(kty)

      kty파라미터는 키와 함께 사용되는 암호화 알고리즘 패밀리를 식별합니다 (예: 이 예제에서는 RSA "“).

      RSA지수 () e

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

      RSA모듈러스 () n

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

      사용(use)

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

    2. 공개 JSON 웹 키에서 내 키와 kid 일치하는 키를 검색하십시오. kid JWT

  3. JWT라이브러리를 사용하여 발급자의 서명을 토큰의 서명과 비교하십시오. 발급자 서명은 토큰과 일치하는 kid in jwks.json의 공개 키 (RSA모듈러스"n") 에서 파생됩니다. kid 먼저 를 형식으로 변환해야 할 수도 있습니다. 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) { });

클레임 확인

JWT클레임을 확인하려면
  1. 다음 방법 중 하나를 사용하여 토큰이 만료되지 않았는지 확인합니다.

    1. 토큰을 디코딩하고 exp 클레임을 현재 시간과 비교합니다.

    2. 액세스 토큰에 aws.cognito.signin.user.admin 클레임이 포함된 경우 API 좋아요에 요청을 보내세요 GetUser. API액세스 토큰으로 요청을 승인하면 토큰이 만료된 경우 오류가 반환됩니다.

    3. UserInfo 엔드포인트 요청 시 액세스 토큰을 제시합니다. 토큰이 만료된 경우 요청에서 오류가 반환됩니다.

  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여야 합니다.

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