JWT 해독기

JWT(점으로 구분된, base64url로 인코딩된 세 부분)를 붙여넣으면 디코더가 헤더, 페이로드, 서명을 디코딩하여 보기 좋게 출력하고, 감지된 알고리즘, 로컬 시간 기준 토큰 만료 시각, 그리고 nbf(유효 시작 전), iat(발급 시각), exp(만료)가 서로 일치하는지를 함께 표시합니다. 비밀 키나 공개 키가 있다면 선택적으로 서명 검증도 할 수 있습니다.

JWT를 해독하는 방법

  1. 1

    토큰을 붙여넣으세요

    `.`(헤더.페이로드.서명)으로 구분된 세 개의 base64url 문자열.

  2. 2

    해독된 헤더를 읽으세요

    알고리즘, 유형, 키 ID(`kid`). 알고리즘은 인증에 필요한 키 유형을 나타냅니다.

  3. 3

    페이로드를 읽으세요

    표준 클레임(`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`)과 애플리케이션이 발급하는 모든 사용자 지정 클레임이 포함됩니다.

  4. 4

    확인 (선택 사항)

    서명이 유효함을 확인하려면 HMAC 비밀값(HS256/384/512용) 또는 공개 키(RS256, ES256 등용)를 제공해야 합니다.

JWT의 해부학

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

각 세그먼트는 표준 Base64가 아닌 Base64URL 형식으로 인코딩되어 있습니다. 헤더는 {"alg":"HS256","typ":"JWT"}와 같은 JSON 형식이며, 페이로드는 {"sub":"1234567890","name":"Alice","iat":1600000000}와 같은 JSON 형식이고, 서명은 header.payload에 대한 HMAC 또는 RSA 서명입니다.

표준 클레임(RFC 7519)

클레임 이름 설명
iss 발급자 토큰을 발급한 주체
sub 주체 토큰이 가리키는 대상
aud 대상 토큰을 사용할 수신자
exp 만료 시각 유닉스 타임스탬프. 이 시각 이후에는 거부됨
nbf 유효 시작 유닉스 타임스탬프. 이 시각 이전에는 거부됨
iat 발급 시각 토큰 생성 시점의 유닉스 타임스탬프
jti JWT ID 폐기 목록에 사용하는 고유 식별자

지원되는 알고리즘

alg 키 유형
HS256/HS384/HS512 공유 HMAC 비밀
RS256/RS384/RS512 RSA 공개 키
ES256/ES384 ECDSA 공개 키
PS256/PS384 RSA-PSS 공개 키
EdDSA / Ed25519 에드워즈 곡선
none 절대 신뢰하지 마세요, 서명이 없는 토큰

alg: none의 함정

초기 JWT 라이브러리는 "alg": "none" 토큰을 허용하고 이를 순진하게 유효한 것으로 받아들였습니다. 항상 다음을 지키세요.

  • 애플리케이션이 허용하는 알고리즘을 화이트리스트로 관리하세요.
  • alg: none을 무조건 거부하세요.
  • 검증 코드가 RS256을 기대할 때 alg: HS256을 거부하세요(“알고리즘 혼동” 공격).

JWT가 아닌 것

  • 암호화되어 있지 않습니다. 헤더와 페이로드는 base64로 인코딩되어 있을 뿐이어서 손쉽게 디코딩됩니다. JWE로 감싸지 않은 채 JWT에 비밀 정보를 넣지 마세요.
  • 기본적으로 폐기할 수 없습니다. 한 번 발급된 JWT는 exp까지 유효합니다. 폐기하려면 블랙리스트, 또는 짧은 만료 시간과 리프레시 토큰을 함께 사용해야 합니다.
  • 모든 용도에서 세션 쿠키를 대체하지는 못합니다. 서버 측에 저장하는 불투명 토큰이 더 간단하고 안전한 경우가 많습니다.

흔한 실수

  • 헤더를 신뢰하기. kidalg는 토큰 자체에서 옵니다. 침해된 서버는 이를 임의로 설정할 수 있으므로 항상 고정된 목록과 대조해 검증하세요.
  • nbfiat의 오차 무시하기. 시계 오차로 인해 iat > now가 발생할 수 있으므로 약간의 여유(30~60초)를 두세요.
  • 전체 JWT 로깅하기. 페이로드에는 사용자 ID, 이메일, 권한 등 stdout에 남아서는 안 되는 PII가 들어 있는 경우가 많습니다.
  • 약한 비밀로 HS256 사용하기. 16자 비밀은 몇 분 만에 무차별 대입으로 뚫립니다. 최소 256비트의 무작위 엔트로피를 사용하세요.

자주 묻는 질문

아니요. 디코딩은 브라우저에서 실행됩니다. 토큰은 로컬에 유지되며, 이는 JWT가 세션 데이터, 사용자 ID 및 권한 등을 포함하는 경우가 많기 때문에 매우 중요합니다.

네. 공유된 HMAC 비밀번호 또는 PEM 인코딩된 공개 키를 붙여넣으면 검증이 브라우저에서 자동으로 수행됩니다. 해당 키는 결코 사용자의 컴퓨터를 벗어나지 않습니다.

이는 해당 토큰이 서명되지 않았음을 의미합니다. 생산 환경에서는 이러한 토큰을 절대 수용하지 마십시오. 이들은 매우 쉽게 위조될 수 있습니다. 여러 주목받은 CVE들은 기본적으로 alg: none를 수용하는 라이브러리와 관련된 것이었습니다.

JWT 서명은 기밀성이 아니라 진위를 증명합니다. 헤더와 페이로드는 base64url로 인코딩되어 있어 되돌릴 수 있습니다. 기밀성을 확보하려면 JWT를 JWE(JSON Web Encryption)로 감싸거나, 민감한 데이터를 페이로드에 넣지 마세요.

관련 도구

이 도구는 다른 언어로도 제공됩니다