JWT 해독기
JWT(점으로 구분된, base64url로 인코딩된 세 부분)를 붙여넣으면 디코더가 헤더, 페이로드, 서명을 디코딩하여 보기 좋게 출력하고, 감지된 알고리즘, 로컬 시간 기준 토큰 만료 시각, 그리고 nbf(유효 시작 전), iat(발급 시각), exp(만료)가 서로 일치하는지를 함께 표시합니다. 비밀 키나 공개 키가 있다면 선택적으로 서명 검증도 할 수 있습니다.
JWT를 해독하는 방법
-
1
토큰을 붙여넣으세요
`.`(헤더.페이로드.서명)으로 구분된 세 개의 base64url 문자열.
-
2
해독된 헤더를 읽으세요
알고리즘, 유형, 키 ID(`kid`). 알고리즘은 인증에 필요한 키 유형을 나타냅니다.
-
3
페이로드를 읽으세요
표준 클레임(`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`)과 애플리케이션이 발급하는 모든 사용자 지정 클레임이 포함됩니다.
-
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까지 유효합니다. 폐기하려면 블랙리스트, 또는 짧은 만료 시간과 리프레시 토큰을 함께 사용해야 합니다. - 모든 용도에서 세션 쿠키를 대체하지는 못합니다. 서버 측에 저장하는 불투명 토큰이 더 간단하고 안전한 경우가 많습니다.
흔한 실수
- 헤더를 신뢰하기.
kid와alg는 토큰 자체에서 옵니다. 침해된 서버는 이를 임의로 설정할 수 있으므로 항상 고정된 목록과 대조해 검증하세요. nbf와iat의 오차 무시하기. 시계 오차로 인해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)로 감싸거나, 민감한 데이터를 페이로드에 넣지 마세요.
관련 도구
ASCII 표 참조
NUL, LF, DEL 같은 제어 문자를 포함해 모든 문자에 대한 10진수, 16진수, 8진수, 2진수, HTML 숫자 문자 참조를 담은 0부터 127까지의 전체 ASCII 표.
HTML 문자 참조
HTML 엔티티의 검색 가능한 목록, 각 엔티티의 이름 및 숫자 코드, 그리고 특수 문자 및 기호에 대한 1클릭 복사 기능을 제공합니다.
키보드 단축키 참고표
macOS, Windows, Linux에서 VS Code, Chrome, GNU Readline을 쓰는 Bash의 문서화된 기본 단축키를 검색합니다.
보색 찾기
어떤 입력에 대해서도 보색을 찾습니다. HSL 반대 색, 분할 보색 쌍, 그리고 접근성 있는 조합 제안을 반환합니다.
색상 틴트 생성기
기준 색의 밝은 틴트를 생성합니다. 디자인 시스템 토큰, 배경, 호버 상태를 위한 3-20단계 스케일.
이메일 검증기
이메일 주소를 검증합니다. RFC 5322 구문 검사, 실시간 MX 레코드 조회, 그리고 로컬 파트, 도메인, 길이 정보를 제공합니다. 이메일은 전송되지 않습니다.
이 도구는 다른 언어로도 제공됩니다
- JWT-avkodare [SV]
- JWT-decoder [NL]
- مُفكّك JWT [AR]
- JWT-Dekoder [DE]
- Décodeur JWT [FR]
- Decoder JWT [ID]
- JWTデコーダ [JA]
- Dekoder JWT [PL]
- ตัวถอดรหัส JWT [TH]
- Decodificador JWT [ES]
- Mã giải mã JWT [VI]
- Decodificador JWT [PT]
- Decoder JWT [IT]
- Декодировщик JWT [RU]
- JWT Dekoderi [TR]
- JWT 解码器 [ZH]
- JWT Decoder [EN]