JWT 디코더

JSON Web Token을 붙여넣으면 헤더와 페이로드를 보기 좋게 정리된 JSON으로, exp, iat, nbf 시각을 날짜로 보여 주고 토큰의 만료 여부도 알려 줍니다. 비밀 키나 공개 키로 서명을 로컬에서 검증할 수도 있습니다.

헤더

페이로드

클레임

서명

서명 검증

브라우저에서만 실행되며 어떤 데이터도 업로드되지 않습니다.

사용 방법

  1. 전체 토큰을 붙여넣습니다. 토큰은 점으로 구분된 세 개의 Base64URL 부분으로 이루어집니다.
  2. 디코딩된 헤더와 페이로드를 확인합니다. exp, iat, nbf 클레임은 날짜로 표시되며, 토큰이 만료되었거나 아직 유효하지 않으면 경고가 나타납니다.
  3. 서명을 검증하려면 HS256, HS384, HS512는 공유 비밀 키를 입력하고, RS, PS, ES 계열 알고리즘은 PEM 형식의 공개 키를 붙여넣습니다.
  4. 발급자, 대상, 주체 클레임이 애플리케이션에서 기대하는 값과 일치하는지 확인합니다.

JWT의 구조

JSON Web Token(RFC 7519)은 점으로 구분된 세 부분, 즉 header.payload.signature로 이루어집니다. 헤더와 페이로드는 패딩 없는 Base64URL로 인코딩된 JSON 객체입니다. 그래서 토큰은 거의 항상 여는 {"를 인코딩한 형태인 eyJ로 시작합니다. 서명은 앞의 두 부분을 토큰에 나타난 그대로 사용해 계산합니다.

  • 헤더: alg에 서명 알고리즘을 지정하고, 보통 "typ": "JWT"를 포함하며, 키를 식별하는 kid가 들어가는 경우도 많습니다.
  • 페이로드: 사용자가 누구인지, 누가 토큰을 발급했는지, 언제 만료되는지 같은 클레임을 담습니다.
  • 서명: 헤더와 페이로드가 변경되지 않았음을 증명하는 HMAC, RSA 또는 ECDSA 서명입니다.

다섯 부분으로 이루어진 토큰은 암호화된 JWE이며, 복호화 키 없이는 내용을 읽을 수 없습니다.

등록된 클레임

클레임이름의미
iss발급자(Issuer)토큰을 생성하고 서명한 주체
sub주체(Subject)토큰이 가리키는 대상, 보통 사용자 ID
aud대상(Audience)토큰을 사용할 서비스
exp만료 시각(Expiration time)이 시각 이후에는 토큰을 거부해야 함
nbf유효 시작 시각(Not before)이 시각 이전에는 토큰을 거부해야 함
iat발급 시각(Issued at)토큰이 생성된 시각
jtiJWT ID재전송 공격 탐지에 쓰이는 고유 식별자

시각은 NumericDate 값으로, 1970년 1월 1일 UTC부터 경과한 초 단위 값이며 밀리초가 아닙니다. 디코더는 이 값을 읽기 쉬운 날짜로 표시하고 사용자 기기의 시계와 비교합니다.

디코딩은 검증이 아닙니다

페이로드는 암호화된 것이 아니라 인코딩만 되어 있으므로 누구나 JWT를 디코딩할 수 있습니다. 따라서 비밀번호나 기타 비밀 정보는 절대 넣지 마십시오. 신뢰는 올바른 키로 서명을 확인할 때만 얻을 수 있으며, 토큰을 받는 서버는 다음 사항도 지켜야 합니다.

  • 예상한 알고리즘만 허용하고, 서명되지 않은 토큰을 나타내는 "alg": "none"은 거부합니다.
  • 토큰 헤더가 HMAC과 RSA 중 하나를 선택하게 해서는 안 됩니다. 그러면 공격자가 공개 키를 HMAC 비밀 키로 사용해 위조 토큰에 서명할 수 있습니다.
  • 모든 요청에서 exp, nbf, iss, aud를 확인합니다.

이 페이지의 선택적 검증 기능은 브라우저에 내장된 Web Crypto API를 사용합니다. 디코딩과 검증은 사용자의 기기에서 이루어지며 어떤 데이터도 업로드되지 않습니다. 일반적인 원칙으로, 신뢰할 수 없는 웹사이트에는 운영 환경의 서명 키나 실제 사용 중인 토큰을 절대 붙여넣지 마십시오.

자주 묻는 질문

이 디코더에 JWT를 붙여넣어도 안전합니까?

토큰은 브라우저의 JavaScript로 디코딩되고 검증되며 서버로 전송되지 않습니다. 다만 만료되지 않은 토큰은 가진 사람에게 비밀번호처럼 작동하므로, 스크린샷이나 로그를 공유할 때는 테스트용 토큰이나 만료된 토큰을 사용하는 것이 좋습니다.

비밀 키 없이 JWT를 디코딩할 수 있습니까?

예. 헤더와 페이로드는 단순히 Base64URL로 인코딩된 JSON이므로 키 없이도 읽을 수 있습니다. 비밀 키나 공개 키는 서명을 검증할 때만 필요합니다.

디코더에 토큰이 만료되었다고 표시되는 이유는 무엇입니까?
토큰의 exp 클레임이 사용자 기기의 현재 시각보다 이전이기 때문입니다. 토큰이 아직 유효해야 한다면 시스템 시계와 발급자가 설정한 토큰 유효 기간을 확인하십시오.
어떤 서명 알고리즘을 검증할 수 있습니까?

공유 비밀 키로는 HS256, HS384, HS512를, PEM 형식의 공개 키로는 RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512를 검증할 수 있습니다.

"alg": "none"은 무슨 뜻입니까?

RFC 7518에 정의된, 서명이 비어 있는 보호되지 않은 JWT를 나타냅니다. 이런 토큰은 누구나 만들거나 변경할 수 있으므로 서명된 토큰을 기대하는 서버는 반드시 이를 거부해야 합니다.