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/ES512 |
ECDSA 공개 키 |
PS256/PS384/PS512 |
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)로 감싸거나, 민감한 데이터를 페이로드에 넣지 마세요.
관련 도구
보색 찾기
어떤 입력에 대해서도 보색을 찾습니다. HSL 반대 색, 분할 보색 쌍, 그리고 접근성 있는 조합 제안을 반환합니다.
Webpack 설정 생성기
순수 JavaScript, React, Vue용 webpack 5 webpack.config.js를 만드세요. TypeScript, Babel, CSS 또는 Sass, 이미지, HtmlWebpackPlugin, 개발 서버, npm install 명령까지 함께 제공합니다.
HEX → ASCII 변환기
16진 바이트 시퀀스를 ASCII 텍스트로 변환합니다. 프로토콜 디버깅, 리버스 엔지니어링, CTF 챌린지에 좋습니다.
텍스트 파일 인코딩 변환기
깨진 문자를 고치기 위해 텍스트를 UTF-8, UTF-16, Latin-1, Windows-1252 등 여러 인코딩 사이에서 변환하세요.
XML 포매터
일관된 들여쓰기로 XML 문서를 정렬 출력하고, 정확한 줄 번호로 적격성 오류를 잡아냅니다.
SVG를 CSS로 변환하는 도구
원본 SVG 마크업을 올바르게 인코딩된 `background-image: url("data:image/svg+xml,...")` 규칙으로 변환해 스타일시트에 바로 붙여넣을 수 있습니다.
이 도구는 다른 언어로도 제공됩니다
- مُفكّك JWT [AR]
- JWT-Dekoder [DE]
- JWT-decoder [NL]
- Dekoder JWT [PL]
- Decoder JWT [ID]
- Mã giải mã JWT [VI]
- Décodeur JWT [FR]
- JWT-avkodare [SV]
- JWTデコーダ [JA]
- Decodificador JWT [PT]
- ตัวถอดรหัส JWT [TH]
- Decodificador JWT [ES]
- JWT Decoder [EN]
- Decoder JWT [IT]
- Декодировщик JWT [RU]
- JWT Dekoderi [TR]
- JWT 解码器 [ZH]