JWT 디코더란?
JWT(JSON Web Token)는 인증·인가에 널리 쓰이는 토큰 형식으로, 사용자 정보나 권한 같은 정보를 JSON 형태로 담아 안전하게 주고받기 위해 사용됩니다. 토큰 자체는 암호화가 아니라 Base64URL 인코딩되어 있을 뿐이라, 비밀키 없이도 내용을 디코딩해 확인할 수 있습니다. 이 도구는 토큰을 붙여넣는 즉시 헤더와 페이로드를 보기 좋게 정렬된 JSON으로 보여주고, 시간 관련 클레임(exp·iat·nbf)을 사람이 읽기 쉬운 한국 시간으로 변환해 표시합니다.
JWT 구조
JWT는 점(.)으로 구분된 세 부분으로 이루어집니다.
- 헤더(Header) — 토큰 타입(typ)과 서명 알고리즘(alg) 정보를 담습니다.
- 페이로드(Payload) — 실제 전달하려는 정보(클레임)를 담습니다.
sub(주체),exp(만료),iat(발급 시각),nbf(유효 시작) 등이 자주 쓰입니다. - 서명(Signature) — 헤더·페이로드를 비밀키로 서명한 값으로, 토큰이 변조되지 않았음을 보장합니다. 서명 검증에는 발급자의 키가 필요합니다.
HS256 서명 검증
이 도구는 디코딩뿐 아니라 HS256(HMAC-SHA256) 토큰의 서명 검증도 지원합니다. 비밀키 칸에 키를 넣고 검증 버튼을 누르면, 브라우저의 Web Crypto로 헤더.페이로드 문자열에 대한 HMAC을 다시 계산해 Base64URL로 바꾼 뒤 토큰의 세 번째 조각과 비교합니다. 값이 같으면 유효, 다르면 위조로 표시합니다. 헤더의 alg가 none이면 서명이 없어 신뢰할 수 없다고 경고하고, RS256·ES256 같은 비대칭 알고리즘은 공개키가 필요하므로 검증 미지원으로 안내합니다. 이때도 디코딩은 정상적으로 동작합니다. 비밀키 역시 브라우저 밖으로 나가지 않습니다.
표준 클레임
페이로드에 아래 클레임이 들어 있으면 설명 표에 자동으로 정리해 줍니다. 시간 값은 사람이 읽을 수 있는 한국 시간으로 변환해 함께 보여 주고, 만료 시각이 지났으면 경고를 붙입니다.
| 클레임 | 의미 |
|---|---|
iss | 발급자 — 토큰을 발급한 주체 |
sub | 주체 — 토큰이 가리키는 사용자나 대상 |
aud | 대상 — 토큰을 사용할 수신자 |
exp | 만료 시각 — 이 시각 이후 토큰 무효 |
iat | 발급 시각 |
nbf | 유효 시작 — 이 시각 이전에는 무효 |
jti | 토큰 고유 식별자 |
자주 하는 실수와 주의점
- 페이로드는 암호화가 아니라 인코딩일 뿐입니다. 비밀번호·주민번호처럼 노출되면 안 되는 값은 절대 넣지 마세요.
- 서명을 확인하지 않고 페이로드 내용을 믿으면 안 됩니다. 서버는 항상 서명을 검증한 뒤 클레임을 사용해야 합니다.
alg를none으로 바꿔 보내는 공격이 알려져 있습니다. 서버는 허용할 알고리즘을 고정해 두어야 합니다.exp·iat·nbf는 초 단위입니다. 밀리초 값을 넣으면 아주 먼 미래 날짜가 됩니다.- Base64URL은 표준 Base64와 달리
+와/대신-와_를 쓰고 끝의=패딩을 생략합니다. 일반 Base64 도구로 풀면 깨질 수 있습니다. - 서버와 클라이언트의 시계가 어긋나면 방금 발급한 토큰이 아직 유효하지 않다고 나올 수 있습니다. 검증할 때 몇 초 정도의 오차를 허용하는 설정이 필요합니다.
- 운영 중인 서비스의 실제 토큰은 가급적 외부 도구에 붙여넣지 말고, 필요하다면 만료된 토큰이나 테스트 토큰으로 확인하세요.
자주 묻는 질문
입력한 토큰이 서버로 전송되나요?
아니요. 모든 디코딩은 브라우저 내에서만 이루어지며 입력한 JWT 토큰은 서버로 전송되거나 저장되지 않습니다. 서명 검증에 쓰는 비밀키도 마찬가지입니다.
서명도 검증하나요?
네. HS256(HMAC SHA-256) 토큰이라면 비밀키를 입력하고 검증 버튼을 눌러 서명을 확인할 수 있습니다. 브라우저의 Web Crypto로 헤더.페이로드에 대한 HMAC을 다시 계산해 토큰의 서명과 비교하며, RS256 같은 비대칭 알고리즘은 디코딩만 지원합니다.
만료 여부는 어떻게 확인하나요?
페이로드에 exp(만료 시각) 값이 있으면 사람이 읽을 수 있는 한국 시간(KST)으로 표시되며, 현재 시각을 지난 경우 만료됨 경고가 나타납니다. iat(발급), nbf(유효 시작) 값도 함께 시간으로 변환해 보여줍니다.
토큰 내용이 그대로 보이는데 안전한가요?
JWT 페이로드는 암호화가 아니라 인코딩일 뿐이므로 누구나 디코딩해 내용을 볼 수 있습니다. 따라서 비밀번호나 개인 식별 정보 같은 민감한 값은 페이로드에 넣지 않아야 합니다.
alg가 none인 토큰은 무엇인가요?
서명이 없는 토큰입니다. 누구나 페이로드를 바꿔 만들 수 있어 신뢰할 수 없으므로 이 도구는 위조 위험으로 표시합니다. 서버는 허용할 알고리즘을 미리 고정해 두고 none을 거부해야 합니다.
exp 값이 이상한 날짜로 나옵니다.
exp, iat, nbf는 모두 초 단위 유닉스 시간입니다. 밀리초 값을 그대로 넣으면 수만 년 뒤 날짜로 해석되므로, 1000으로 나눈 초 단위 값을 사용해야 합니다.
Base64URL은 일반 Base64와 다른가요?
다릅니다. Base64URL은 URL에서 문제가 되는 더하기와 슬래시 대신 하이픈과 밑줄을 쓰고 끝의 등호 패딩을 생략합니다. 일반 Base64 디코더로 풀면 오류가 나거나 깨질 수 있습니다.
서명이 두 조각뿐인 토큰도 볼 수 있나요?
네. 점으로 구분된 조각이 두 개여도 헤더와 페이로드를 디코딩해 보여 주고 서명은 없음으로 표시합니다. 다만 서명이 없는 토큰은 검증할 수 없으므로 신뢰해서는 안 됩니다.