AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

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

4분 분량
0

Amazon Cognito 사용자 풀을 애플리케이션의 인증 방법으로 사용하고 싶습니다. 클라이언트가 애플리케이션에 보내는 ID 및 액세스 토큰을 안전하게 확인할 수 있는 방법이 필요합니다.

간략한 설명

클라이언트가 사용자 풀을 사용하여 애플리케이션을 인증할 때 Cognito가 디코딩, 읽기 및 수정을 위한 JSON 웹 토큰(JWT)을 보냅니다. JWT에서 Cognito 사용자 세부 정보를 가져오려면 토큰을 디코딩하고 서명을 확인하십시오.

중요: 리소스에 대한 액세스 권한을 부여하기 전에 서명을 확인해야 합니다.

해결 방법

Cognito가 JWT를 발급했는지 확인

JavaScript에서 다음 코드 사용:

import { CognitoJwtVerifier } from "aws-jwt-verify";

// Verifier that expects valid access tokens:
const verifier = CognitoJwtVerifier.create({
  userPoolId: "user_pool_id",
  tokenUse: "access",
  clientId: "client_id",
});

try {
  const payload = await verifier.verify(
    "eyJraWQeyJhdF9oYXNoIjoidk..." // the JWT as string
  );
  console.log("Token is valid. Payload:", payload);
} catch {
  console.log("Token not valid!");
}

참고: user_pool_id를 사용자 풀 ID로 바꾸고 client_id를 앱 클라이언트 ID로 바꿉니다. ID 토큰의 경우 tokenUse 필드를 **“id”**로 업데이트합니다. 사용 가능한 파라미터 목록은 GitHub 웹사이트에서 aws-jwt-verify를 참조하십시오.

다른 프로그래밍 언어를 사용하는 경우 JWT 웹사이트의 jwt.io 라이브로리 또는 OpenID 웹사이트의 OpenID Connect 라이브러리를 참조하십시오. 코드 예제는 GitHub 웹사이트에서 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하십시오.

Cognito는 ID 토큰, 액세스 토큰, 새로 고침 토큰까지 최대 3개의 토큰을 반환합니다.REST API, AWS Amplify 또는 AWS SDK를 사용하여 사용자를 인증하면 3개의 토큰을 모두 받게 됩니다.

Cognito 호스팅 UI의 경우 사용하는 인증 권한 부여의 유형에 따라 받는 토큰이 달라집니다. 암시적 권한 부여를 사용하는 경우 액세스 및 ID 토큰만 받습니다. 인증 코드 권한 부여는 액세스, ID 및 새로 고침 토큰을 반환합니다. 클라이언트 자격 증명 권한 부여는 액세스 토큰만 반환합니다.

액세스 및 ID 토큰에는 헤더, 페이로드, 서명이 포함됩니다. 클라이언트는 새로 고침 토큰을 디코딩하거나 확인할 수 없습니다.

다음은 샘플 ID 토큰 헤더입니다. 헤더에는 키 ID(“kid”)와 토큰 서명에 사용되는 알고리즘(“alg”)이 포함됩니다. RS256 알고리즘은 SHA-256 기반의 RSA 서명입니다.

{
  "kid": "key_id_example=",
  "alg": "RS256"
}

다음은 사용자에 대한 정보와 토큰 생성 및 만료 타임스탬프가 포함된 페이로드의 예제입니다.

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "audience_example",
  "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"
}

서명은 해시 및 암호화된 헤더와 페이로드의 조합입니다.

Cognito는 각 사용자 풀에 대해 2개의 RSA 키 페어를 생성합니다. 각 페어의 프라이빗 키는 ID 토큰 또는 액세스 토큰에 암호화 방식으로 서명하는 데 사용됩니다. 퍼블릭 키는 다음 위치의 주소에서 찾을 수 있습니다.

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

참고: region을 사용자 풀이 있는 AWS 리전으로 바꾸고 userPoolId를 사용자 풀 ID로 바꾸십시오.

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"
    }]
}

Cognito JWT의 서명을 확인하려면 토큰 헤더와 일치하는 키 ID로 퍼블릭 키를 검색합니다. 다양한 라이브러리를 사용하여 토큰의 서명을 확인하고 만료 및 사용자 이름과 같은 값을 추출합니다.

토큰이 만료되지 않았는지 확인하는 것이 바람직합니다. 또한 페이로드의 대상(“aud”)이 Amazon Cognito 사용자 풀에서 생성한 앱 클라이언트 ID와 일치하는지 확인하십시오.aws-jwt-verify 라이브러리는 이러한 값을 자동으로 확인합니다. 자세한 내용은 GitHub 웹사이트에서 aws-jwt-verify를 참조하십시오.

캐시 퍼블릭 키

JWKS 엔드포인트의 퍼블릭 키는 거의 교체되지 않으므로 토큰을 확인할 때마다 엔드포인트에서 퍼블릭 키를 다운로드할 필요가 없습니다. 대신 퍼블릭 키를 다운로드하고 JWT 토큰 검증 로직을 사용하는 로컬 머신에 캐시하십시오.

**“kid”**는 퍼블릭 키의 고유 식별자입니다. JWT 토큰을 확인하려면 로컬 캐시를 확인하여 토큰 헤더의 **“kid”**가 캐시에 있는지 확인하십시오. 캐시가 없는 경우 JWKS 엔드포인트에서 퍼블릭 키를 다운로드하고 캐시를 업데이트하십시오.

다양한 방법을 사용하여 토큰의 만료 또는 취소 상태를 확인할 수 있습니다.

새로 고침 토큰을 해지하고 액세스 토큰을 무효화할 수 있지만 ID 토큰은 해지할 수 없습니다. JWT 검증기 라이브러리는 토큰의 만료를 확인하지만 라이브러리는 토큰의 해지 상태를 확인하지 않습니다. 해지 상태 검사에는 서버 측 검사가 필요합니다.

관련 정보

사용자 풀 JSON 웹 토큰(JWT) 이해하기

AWS CLI를 사용하여 Amazon Cognito에서 JWT 토큰을 해지하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 23일 전
댓글 없음

관련 콘텐츠