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

3분 분량
0

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 웹 토큰(JWT)에 들어 있는 Amazon Cognito 사용자 세부 정보를 확인하려면 토큰을 디코딩한 후 서명을 확인합니다.

해결 방법

AWS에서는 JWT를 확인하는 데 사용할 수 있는 다음 라이브러리를 출시했습니다. https://github.com/awslabs/aws-jwt-verify

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!");
}

사용자가 로그인하면 Amazon Cognito 사용자 풀이 JWT를 반환합니다. JWT는 사용자에 대한 정보를 포함하고 base64url로 인코딩된 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를 사용하여 공개 키를 검색합니다. 그런 다음 aws-jwt-verify와 같은 라이브러리 또는 jwt.io 또는 OpenID Foundation에서 권장하는 라이브러리를 사용하여 토큰 서명을 검증하고 만료 및 사용자 이름과 같은 값을 추출할 수 있습니다.

서명 외에도 다음을 확인하는 것이 가장 좋습니다.

  • 토큰이 만료되지 않았는지.
  • 페이로드에 지정된 대상('aud')이 Amazon Cognito 사용자 풀에 생성된 앱 클라이언트 ID와 일치하는지 확인합니다.

aws-jwt-verify 라이브러리는 사용자를 대신하여 이러한 검사를 수행합니다. Lambda를 사용하여 Amazon Cognito JWT를 디코딩하고 확인하는 방법에 대한 자세한 코드 예시는 Amazon Cognito JWT 토큰 디코딩 및 확인을 참조하세요.


관련 정보

JSON 웹 토큰 확인

사용자 풀에서 토큰 사용

AWS 공식
AWS 공식업데이트됨 2년 전
댓글 없음

관련 콘텐츠