JWT 디코더 — JWT 토큰 내용 확인하기
JWT header·payload 디코딩과 만료 시각 확인 (서명 검증 없음)
브라우저에서 처리 · 서버로 전송되지 않음
이 도구는 토큰을 디코딩만 하며 서명을 검증하지 않습니다. 내용이 읽힌다는 것이 토큰이 유효하거나 신뢰할 수 있다는 뜻은 아니에요. 토큰은 브라우저 밖으로 전송되지 않습니다.
소개
JWT(JSON Web Token)는 로그인 정보 같은 클레임을 담아 주고받는 토큰입니다. 점으로 구분된 세 부분, 즉 header, payload, signature로 이루어지며 앞의 둘은 base64url로 인코딩된 JSON이라 누구나 풀어 볼 수 있습니다. 이 도구는 토큰을 풀어 내용을 예쁘게 보여 주지만 서명 검증은 하지 않습니다.
사용법
- 입력 칸에 토큰을 붙여 넣습니다. 앞에
Bearer가 붙어 있거나 줄바꿈이 들어 있어도 무시합니다. - header와 payload가 들여쓰기된 JSON으로 나타납니다. 각각 복사할 수 있어요.
- payload에 exp, iat, nbf가 있으면 사람이 읽는 날짜와 시각, “3시간 후”·“2일 전” 같은 남은(지난) 시간으로 보여 주고 만료 여부도 알려 줍니다.
- 형식이 틀리면 어느 부분이 문제인지 오류 메시지로 알려 줍니다. 점으로 나뉜 부분이 다섯 개인 암호화 토큰(JWE)은 키 없이는 읽을 수 없다고 안내합니다.
기준
- 구조는 RFC 7519(JWT)와 RFC 7515(JWS)를 따릅니다. 세 부분이 점 하나씩으로 나뉘어야 해요.
- 각 부분은 RFC 4648의 base64url(
-와_, 패딩 생략 가능)로 풀고 UTF-8로 해석합니다. - header와 payload는 JSON 객체여야 하며, 배열이나 문자열이면 오류로 처리합니다.
- exp, iat, nbf는 숫자일 때만 초 단위 시각으로 해석하고, 브라우저 언어에 맞는 형식과 ISO 8601(UTC)을 함께 보여 줍니다.
- 만료 판단은 현재 시각과 exp, nbf를 비교한 것뿐이며 서명은 검증하지 않습니다. alg가 none이거나 서명이 틀린 토큰도 그대로 풀려요.
예시
| 부분 | 내용 |
|---|---|
| 토큰 앞부분 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
| header | {"alg": "HS256", "typ": "JWT"} |
| payload | {"sub": "1234567890", "name": "John Doe", "iat": 1516239022} |
| iat | 2018-01-18T01:30:22Z |
위 토큰은 JWT 소개 자료에서 흔히 쓰는 연습용 예시입니다. payload에 {"name": "홍길동"}이 들어 있는 토큰도 한글이 깨지지 않고 풀립니다.
보안 참고
- JWT의 payload는 암호화가 아니라 인코딩일 뿐입니다. 비밀번호나 주민등록번호처럼 민감한 값을 넣으면 토큰을 가진 누구나 읽을 수 있어요.
- 서버는 토큰을 받으면 반드시 서명, alg 값, 만료 시각, 발급자를 검증해야 합니다. 이 도구의 화면 표시는 그 검증을 대신하지 않습니다.
- 디버깅이 끝난 운영 토큰은 폐기하거나 만료시키는 것이 안전합니다.
자주 묻는 질문
이 도구가 JWT 서명을 검증해 주나요?
아니요. 이 도구는 디코딩만 합니다. 내용을 읽을 수 있다는 것이 토큰이 진짜이거나 유효하다는 뜻은 아니므로, 신뢰 여부는 서버에서 비밀키나 공개키로 서명을 검증해 판단해야 합니다.
토큰을 붙여 넣어도 안전한가요?
디코딩은 브라우저 안에서만 이루어지고 토큰을 전송하지 않습니다. 그래도 운영 환경의 살아 있는 토큰은 다른 사람이 보는 화면이나 공유 문서에 붙여 넣지 않는 것이 좋습니다.
payload의 한글이 깨지지 않나요?
JWT는 base64url로 인코딩된 UTF-8 JSON이라서, 이 도구는 UTF-8로 올바르게 풀어 한글과 이모지가 그대로 보입니다.
exp 값은 어떤 시각인가요?
1970년 1월 1일 UTC부터 지난 초 단위 숫자(NumericDate)입니다. 이 도구는 이를 브라우저의 언어와 시간대에 맞춘 날짜로 보여 주고 UTC 기준 ISO 형식도 함께 표시합니다.