JWT 디코더
JWT의 헤더·페이로드·서명을 파싱하여 표시합니다. 만료 시각 하이라이트 포함. 무료, 브라우저에서 처리.
- 브라우저에서 처리
- 데이터가 브라우저 밖으로 나가지 않습니다
- 무료 · 회원가입 불필요
WeChat으로 스캔하여 공유
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.
예시: 카카오 로그인 ID 토큰 확인하기
카카오 로그인에서 OpenID Connect를 켜면 액세스 토큰과 함께 ID 토큰을 받을 수 있습니다. 카카오 로그인 REST API 문서에 따르면 ID 토큰 페이로드에는 iss(https://kauth.kakao.com으로 고정), aud(앱 키), sub(회원번호), iat, exp, auth_time과, 동의한 경우 nickname 등이 들어갑니다.
아래 토큰은 같은 문서의 「ID 토큰 정보 조회」 응답 예시에 있는 회원번호와 시각을 쓰고, 닉네임 「홍길동」과 가짜 앱 키를 넣어 만든 것입니다. 실제 카카오 ID 토큰은 헤더의 alg가 RS256으로 고정이고 카카오의 키로 서명되지만, 이 예시는 누구나 다시 만들 수 있도록 데모용 비밀 키 zerotool-demo-secret-ko로 HS256 서명했습니다. 디코딩 결과는 서명 방식과 관계없이 같은 방법으로 읽힙니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2thdXRoLmtha2FvLmNvbSIsImF1ZCI6ImRlbW8tYXBwLWtleSIsInN1YiI6IjE2Njk1OSIsImlhdCI6MTY0NzE4MzI1MCwiZXhwIjoxNjQ3MTkwNDUwLCJhdXRoX3RpbWUiOjE2NDcxODMyNTAsIm5pY2tuYW1lIjoi7ZmN6ri464-ZIn0.Igz_lil9WWSiWo7SbVKQcHI96Osg4EKSVfNAMT7BxhU
Payload 영역에는 다음 JSON이 표시됩니다. 「복사」를 눌러도 날짜 주석 없이 같은 내용이 복사됩니다.
{
"iss": "https://kauth.kakao.com",
"aud": "demo-app-key",
"sub": "166959",
"iat": 1647183250,
"exp": 1647190450,
"auth_time": 1647183250,
"nickname": "홍길동"
}
iat 옆에는 Sun, 13 Mar 2022 14:54:10 GMT, exp 옆에는 Sun, 13 Mar 2022 16:54:10 GMT — EXPIRED가 표시됩니다. 한국 시간으로는 2022년 3월 13일 23:54:10에 발급되어 3월 14일 01:54:10에 만료된 토큰이고, 두 값의 차이는 7200초, 즉 2시간입니다. auth_time은 날짜 주석 대상이 아니라서 숫자만 보입니다. 날짜가 붙는 키는 exp, iat, nbf 세 개뿐입니다.
카카오 문서는 ID 토큰 정보 조회 API(https://kauth.kakao.com/oauth/tokeninfo)를 디버깅용 참고 정보를 돌려주는 API로 설명하고, 서비스는 ID 토큰의 유효성을 먼저 검증한 뒤 토큰의 사용자 정보를 활용하라고 안내합니다. 서명 검증에 쓰는 공개키는 공개키 목록(https://kauth.kakao.com/.well-known/jwks.json)에서 받습니다. 이 도구의 디코딩 결과는 그 검증을 대신하지 않습니다.
붙여넣을 때 자주 생기는 오류
토큰 요청 API 응답은 "id_token": "eyJ..." 형태의 JSON입니다. 값을 복사하면서 양쪽 큰따옴표까지 함께 붙여넣으면 상태 표시줄에 Base64URL 디코드에 실패했습니다.가 나타납니다. 따옴표를 빼고 eyJ로 시작하는 부분만 붙여넣으세요. 앞에 Bearer 가 붙어 있을 때도 같은 오류가 납니다.
긴 토큰이 화면에서 줄바꿈되어 마지막 서명 부분을 빠뜨리기도 합니다. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxNjY5NTkifQ처럼 두 부분만 넣으면 유효하지 않은 JWT: 3개 파트가 필요합니다. 실제: 2.가 표시됩니다. 위 두 경우는 300밀리초 후 자동 디코딩도 동작하지 않으므로, 오류 내용을 보려면 「디코드」를 눌러야 합니다.
제한
- 토큰 중간의 줄바꿈과 그 앞뒤의 공백·탭은 무시합니다. 로그나 메일에서 여러 줄로 나뉜 토큰도 그대로 디코딩되며 상태 표시줄에
디코딩 완료.가 나타납니다. Header나 Payload 중간에 있는 그 밖의 공백·탭은 디코드 실패로 처리합니다. - 날짜를 표시하는 것은 값이 숫자(초)인
exp,iat,nbf뿐이며, 중첩된 객체의 같은 이름 필드에도 붙습니다. 원래 숫자는 그대로 보여 주고 날짜 주석은 초 단위까지만 표시합니다. 밀리초 값을 넣으면 수만 년 뒤의 날짜가 나옵니다. - 「valid」, 「EXPIRED」, 서명 영역의 「not verified」, 「(unable to parse)」는 모든 언어 페이지에서 영어로 표시됩니다.
- 디코딩은 되지만 JSON이 아닌 부분은 「(unable to parse)」로 표시됩니다.
- 암호화된 JWE는 다섯 부분으로 이루어져 키 없이는 읽을 수 없습니다(RFC 7516 §3).
- 서명은 검증하지 않습니다. 서버에서는 발급자의 키로 서명을 검증한 뒤
exp,nbf,iss,aud를 확인해야 합니다(RFC 8725 §3). - 토큰은 어디에도 저장하지 않습니다. JWT는 로그인 자격 증명인 경우가 많아, 이 페이지는 분석·광고 스크립트를 불러오지 않습니다.
JWT에 대하여
JWT는 웹 애플리케이션의 인증·인가에 널리 쓰입니다. 사용자가 로그인하면 서버가 JWT를 발급하고, 클라이언트는 이후 요청에서 JWT를 Authorization 헤더에 넣어 보냅니다. 디버깅 중에 토큰 안의 사용자 ID, 역할, 만료 시각을 확인하고 싶을 때 이 도구를 씁니다. 원하는 클레임으로 테스트 토큰을 만들려면 JWT 생성기 / 서명 도구를 사용하세요.
FAQ
붙여넣은 JWT가 서버로 전송되거나 저장되나요?
아니요. 디코딩은 브라우저의 JavaScript로 처리하며, 토큰을 서버로 보내지도 않고 브라우저 저장소에 저장하지도 않습니다. 이 페이지는 Google Analytics와 AdSense를 불러오지 않습니다.
서명을 검증할 수 있나요?
할 수 없습니다. 서명을 검증하려면 발급자의 비밀 키나 공개 키가 필요합니다. 이 도구는 Header와 Payload를 디코딩해 보여 주고 Signature는 원본 문자열 그대로 표시하므로, 클레임 내용을 확인하는 용도로 사용하세요.
JWT의 세 부분은 무엇인가요?
JWT는 Base64URL로 인코딩한 세 부분을 점(.)으로 이은 문자열입니다. Header(서명 알고리즘과 토큰 종류), Payload(클레임), Signature(토큰이 바뀌지 않았는지 확인하는 값)로 이루어집니다.
Payload의 exp는 무엇인가요?
exp는 만료 시각 클레임이며 값은 초 단위 유닉스 타임스탬프입니다. 이 도구는 원래 숫자 옆에 읽을 수 있는 날짜를 보여 주고, 기기 시계와 비교해 valid 또는 EXPIRED를 표시합니다.
표시되는 시각이 한국 시간보다 9시간 이른 이유는 무엇인가요?
날짜 주석은 기기의 시간대와 관계없이 항상 UTC(GMT로 표기)로 표시합니다. 한국 표준시는 UTC+9이므로 9시간을 더해 읽으면 됩니다. 예를 들어 Sun, 13 Mar 2022 16:54:10 GMT는 한국 시간 2022년 3월 14일 01:54:10입니다. valid·EXPIRED 판정은 초 단위 숫자끼리 비교하므로 시간대의 영향을 받지 않습니다.