JWT 디코더

JWT 헤더와 페이로드를 브라우저 안에서 디코드합니다. 서명 검증은 하지 않습니다.

Loading…

모든 처리는 브라우저 내부에서 실행됩니다 — 파일·입력은 서버로 전송되지 않습니다.

사용법

JWT(점으로 연결된 3개 base64url세그먼트)를 붙여넣으면 헤더와 페이로드가 정렬된 JSON으로 표시됩니다. 페이로드에 "exp" 클레임이 있으면 만료 일시가 페이로드 옆에 표시되고, 시각이 지난 경우 빨간 "expired" 배지가 붙습니다.

이 도구는 디버깅용 뷰어이며 검증기가 아닙니다. 서명 세그먼트는 존재 여부만 확인하고 키로 검증하지 않습니다. 변조된 토큰도 그대로 디코드됩니다. 백엔드나 인증 프로바이더(Auth0·Cognito·Firebase·Keycloak 등)가 토큰에 무엇을 넣었는지 개발·트러블슈팅 중에 확인하는 용도로 쓰고, 서명 검증은 서버 측에서 적절한 라이브러리로 수행하세요.

예제

일반적인 액세스 토큰 확인

입력
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
출력
// header
{
  "alg": "HS256",
  "typ": "JWT"
}

// payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

alg는 서명 알고리즘 이름이고 typ은 거의 항상 JWT입니다. iat는 Unix초로 표기된 발급 시각이므로 필요하면 타임스탬프 컨버터로 변환하세요.

만료된 토큰 디버깅

입력
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyXzQyIiwiZXhwIjoxNjAwMDAwMDAwfQ.x
출력
// payload
{
  "sub": "user_42",
  "exp": 1600000000
}

expired (2020-09-13)

API가 401을 돌려줄 때 토큰을 디코드해 보면 원인이 바로 드러나는 경우가 많습니다. exp가 과거이거나, 발급 서비스의 시계가 어긋났거나입니다.

잘못된 형식의 토큰 감지

입력
eyJhbGciOiJIUzI1NiJ9.this-is-not-base64.sig
출력
Failed to decode segments

로그에서 토큰이 잘렸거나, URL인코딩이 이중으로 걸렸거나, "Bearer " 프리픽스를 붙인 채 복사한 경우에 자주 발생합니다. 프리픽스를 빼고 다시 붙여 넣으세요.

자주 묻는 질문

JWT 서명도 검증하나요?

아니요. 서명 검증에는 발급자의 비밀 키 또는 공개 키가 필요한데, 범용 웹 도구는 그 키를 가질 수 없습니다. 이 디코더는 헤더와 페이로드 내용만 보여줍니다. 검증은 서버 측 라이브러리(jsonwebtoken·jose·PyJWT 등)에서 올바른 키로 수행하세요.

입력한 토큰이 서버로 전송되나요?

아니요. 디코드는 atob와 TextDecoder를 사용해 브라우저 안에서 완결됩니다. 토큰은 페이지 밖으로 나가지 않습니다. 그래도 운영 토큰은 신중히 다루세요. 어떤 도구든 붙여 넣는 행위는 클립보드 기록이나 스크린샷을 통해 유출될 경로를 하나 더 만드는 것입니다.

어떤 JWT 알고리즘을 지원하나요?

전부 지원합니다. 디코더가 알고리즘을 무시하기 때문입니다. HS256·RS256·ES256·EdDSA 무엇이든, 헤더와 페이로드는 base64url로 인코딩된 JSON일 뿐입니다. 알고리즘이 의미를 갖는 시점은 검증 단계뿐입니다.

JWE(암호화 토큰)도 디코드되나요?

아니요. JWE는 3개가 아니라 5개 세그먼트를 가지며, 페이로드는 base64로 인코딩된 JSON이 아니라 암호화되어 있습니다. 복호화에는 키와 JOSE라이브러리가 필요합니다. 실무에서 "JWT"라고 부르는 것의 대부분은 JWS(서명만, 암호화 없음)이며 이쪽은 이 도구로 다룰 수 있습니다.

만료 일시 표시가 예상과 다른 이유는?

JWT의 exp는 UTC기준 Unix초이며, 밀리초도 아니고 로컬 타임존도 아닙니다. 배지는 UTC날짜를 표시합니다. 서버가 밀리초로 발급하는 경우(비표준이지만 흔한 실수) 연도가 1970으로 표시됩니다. 발급 측을 고쳐야 한다는 신호입니다.

관련 개념

JWT는 base64url로 인코딩된 3개 세그먼트(헤더·페이로드·서명)를 점으로 연결한 형식입니다. 헤더는 서명 알고리즘(alg)과 토큰 종류를 알립니다. 페이로드는 클레임의 JSON객체로, 등록된 클레임(iss = 발급자, sub = 주체, aud = 수신자, exp = 만료, iat = 발급 시각)에 더해 발급 측이 추가하는 임의의 커스텀 클레임이 들어갑니다. 서명은 헤더에서 선언한 알고리즘으로 헤더+페이로드에 대해 계산됩니다.

base64url은 일반 base64와 두 글자(+/ 대신 -_)가 다르고 패딩을 생략합니다. 그래서 JWT를 일반 base64디코더에 붙여 넣으면 대체로 실패합니다. JWT는 암호화되지 않습니다. 토큰을 가진 사람은 누구나 내용을 읽을 수 있습니다. 페이로드에 비밀 정보를 넣지 마세요. 서명은 페이로드가 변조되지 않았음을 보장할 뿐 내용의 비밀성은 보장하지 않습니다. 암호화가 필요하다면 JOSE패밀리에 JWE가 정의되어 있습니다(이 도구로는 다룰 수 없음).

관련 글

관련 도구