Menu

JWT 디코더

JSON Web Token을 파트별로 분석·검증.

마지막 업데이트

알고리즘
인코딩됨JSON Web Token 붙여넣기
디코딩됨
헤더와 페이로드가 여기에 표시됩니다 — 토큰은 브라우저를 벗어나지 않습니다.

JWT 디코더란?

JWT 디코더는 JSON Web Token을 헤더, 페이로드, 시그니처 세 부분으로 쪼갠 뒤, 앞의 두 부분을 Base64URL로 디코딩해 JSON 형태로 보여줍니다. 로그인 흐름이나 권한 처리, 세션 클레임, 토큰 만료 문제를 디버깅할 때 정말 자주 쓰는 도구죠.

JWT를 디코딩한다고 해서 그 토큰을 *신뢰할 수 있다는 뜻은 아닙니다*. 헤더와 페이로드는 설계상 누구나 읽을 수 있도록 되어 있어요. 암호화된 게 아니라 단순히 Base64URL로 인코딩됐을 뿐입니다. 토큰이 진짜 발급자가 서명한 것인지, 중간에 조작되지 않았는지 확인하는 건 "검증" 단계입니다.

JWT는 header.payload.signature 형태로 생겼습니다. 각 부분은 Base64URL로 인코딩되어 점(.)으로 구분되죠. 헤더에는 어떤 서명 알고리즘을 썼는지가 적혀 있고, 페이로드에는 클레임(누구의 토큰인지, 언제 만료되는지, 어떤 권한이 있는지)이 담겨 있고, 시그니처는 서버가 토큰이 변조되지 않았다는 걸 증명하는 데 쓰입니다.

JWT를 디코딩하면서 배우게 되는 것들

  • JWT는 점으로 구분된 세 개의 Base64URL 인코딩 조각, 즉 header.payload.signature 구조입니다.
  • sub, role, iat, nbf, exp 같은 흔한 클레임은 사용자 식별, 권한, 발급 시각, 만료 시각을 나타냅니다.
  • 디코딩된 페이로드는 누구나 수정할 수 있고, 변조 여부를 잡아내는 건 오직 시그니처뿐입니다.

JWT 디코딩 단계별 가이드

  1. 토큰 전체를 붙여 넣기

    입력창에 JWT를 통째로 붙여 넣으세요. xxxx.yyyy.zzzz처럼 점으로 연결된 세 개의 Base64URL 조각이어야 합니다.

  2. 헤더 확인하기

    헤더에는 서명 알고리즘(alg)과 토큰 타입이 적혀 있습니다. 특히 "alg": "none"은 조심하세요. 서명이 없는 토큰이라는 뜻이라 절대 신뢰하면 안 됩니다.

  3. 페이로드의 클레임 살펴보기

    페이로드는 모든 클레임이 들어 있는 JSON입니다. sub(사용자 ID), exp(만료), iat(발급 시각)을 비롯해, 앱에서 추가한 role이나 tenant 같은 커스텀 클레임도 함께 확인해 보세요.

  4. 만료 시각 체크하기

    exp의 Unix 타임스탬프를 날짜로 변환해 보세요. 이미 지난 시간이라면 토큰은 만료된 것이고, 제대로 동작하는 API라면 거부할 겁니다.

  5. 시그니처 검증하기 (선택 사항)

    비밀키 또는 공개키를 가지고 있다면 검증기에 함께 넣어 시그니처가 유효한지 확인할 수 있습니다. 시그니처 검증을 통과한 경우에만 토큰의 내용을 믿어도 됩니다.

표준 JWT 클레임

아래는 JWT 명세(RFC 7519)에 정의된 등록 클레임들입니다. 어떤 애플리케이션이든 여기에 자기만의 커스텀 클레임을 추가해서 같이 쓸 수 있어요.

클레임이름의미
issIssuer (발급자)이 토큰을 만들고 서명한 주체
subSubject (주체)이 토큰의 대상 — 보통 사용자 ID
audAudience (대상)이 토큰을 사용할 대상자/서비스
expExpiration (만료)이 시각 이후로는 토큰이 유효하지 않음 (Unix 타임스탬프)
nbfNot Before (사용 시작 시각)이 시각 이전에는 토큰을 받아들이면 안 됨
iatIssued At (발급 시각)토큰이 생성된 시각
jtiJWT ID고유 식별자 — 토큰 폐기(블랙리스트) 처리에 유용
algAlgorithm (헤더)서명 알고리즘: HS256, RS256, ES256

직접 시도해 볼 JWT 예제

전형적인 JWT 살펴보기

토큰

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJzdHVkZW50IiwiZXhwIjoxNzEwMDAwMDAwfQ.Q3hH8yzqI2OsHJ1Lyj8jJfJPa5ZpIVlh1FhJpJbqMcs

헤더
{  "alg": "HS256",  "typ": "JWT"}
페이로드
{  "sub": "user_123",  "role": "student",  "exp": 1710000000}

헤더에는 HS256(공유 비밀키 방식)이라고 적혀 있습니다. 페이로드에는 사용자 ID, 역할, 만료 시각이 담겨 있고, 세 번째 부분이 시그니처입니다. (이 토큰은 데모용 샘플이라 실제 비밀키로는 검증되지 않습니다.)

토큰이 만료됐는지 확인하기

페이로드 클레임
{  "exp": 1710000000}

exp는 초 단위 Unix 타임스탬프입니다. 날짜로 변환해 보고 이미 지난 시각이면 그 토큰은 만료된 것이며, 제대로 만든 백엔드라면 거부합니다.

위험한 "none" 알고리즘 잡아내기

헤더
{  "alg": "none",  "typ": "JWT"}

서버가 "alg": "none"을 받아들이면 공격자가 시그니처 없이 어떤 페이로드든 위조할 수 있습니다. 운영 환경에서는 이런 헤더를 무조건 거부해야 합니다.

JWT에서 자주 하는 실수

  • 비밀번호, 시크릿, 민감한 개인정보를 페이로드에 그대로 넣기. JWT는 누구나 읽을 수 있고 암호화된 게 아닙니다.
  • 토큰을 디코딩만 하고 시그니처 검증 없이 "유효하다"고 단정하기.
  • Base64URL로 읽힌다는 것을 암호화와 혼동하기. JWT 페이로드는 일부러 누구나 읽을 수 있게 만들어진 겁니다.

JWT FAQ

JWT가 뭔가요?
JWT는 JSON Web Token의 약자입니다. 두 주체 사이에 클레임을 전달하기 위한, 서명되어 있고 URL-safe하며 컴팩트한 토큰 포맷이에요. 가장 흔한 용도는 서버와 브라우저 사이에서 로그인된 사용자를 표현하는 것입니다.
JWT는 어떻게 디코딩하나요?
JWT 디코더에 토큰을 붙여 넣거나, 점(.)을 기준으로 직접 쪼갠 뒤 앞의 두 조각을 각각 Base64URL 디코딩하면 됩니다. 헤더와 페이로드는 JSON으로 풀리고, 세 번째 조각이 시그니처예요.
JWT가 만료됐는지 어떻게 확인하나요?
페이로드의 exp 클레임을 보세요. 초 단위 Unix 타임스탬프입니다. 현재 시각이 exp보다 늦으면 그 토큰은 만료된 겁니다.
JWT는 누구나 디코딩할 수 있나요?
네. 헤더와 페이로드는 암호화된 게 아니라 Base64URL로 인코딩된 것뿐입니다. 시그니처는 토큰이 변조되지 않았다는 걸 증명할 뿐, 내용을 가려 주지는 않아요.
JWT 검증(verification)은 정확히 무슨 뜻인가요?
예상하는 비밀키나 공개키로 시그니처를 다시 계산한 뒤, 토큰에 붙어 있는 시그니처와 비교하는 과정입니다. 두 값이 일치해야 비로소 페이로드를 신뢰하고 변조되지 않았다고 볼 수 있어요.
JWT에 비밀번호를 담아도 되나요?
안 됩니다. 토큰을 가진 사람은 누구나 페이로드를 읽을 수 있으니까요. 민감하지 않은 식별자와 클레임만 담고, 보안은 짧은 만료 시간과 리프레시 토큰 조합으로 챙기는 게 정석입니다.

자세히 알아보기

다른 개발자 도구

Coddy로 코딩 배우기

시작하기