본문 바로가기

JWT 디코더

로그인 토큰을 붙여넣으면 안에 든 정보를 읽을 수 있는 형태로 풀어 줍니다. 만료 시각도 사람이 읽는 날짜로 바꿔 보여 줍니다. 같은 화면의 인코더 탭에서는 반대로 토큰을 만들 수도 있습니다.

로딩 중...

왜 만들었나요

토큰이 점 두 개로 이어진 긴 문자열이라, 사용자 ID가 뭐로 들어갔는지 만료가 언제인지 그냥 봐서는 하나도 안 보였습니다. 디버깅할 때마다 콘솔에 코드를 쳐서 풀어 보는 게 번거로워 JWT 디코더를 만들었습니다.

Note

붙여넣은 토큰은 서버로 전송되지 않습니다. JWT 디코더는 토큰을 푸는 일까지 전부 브라우저 안에서 처리해, 실제 로그인 토큰을 넣어도 기기 밖으로 나가지 않습니다.


사용 방법

  1. 입력창에 토큰을 통째로 붙여넣습니다. 앞에 Bearer 가 붙어 있다면 그 부분은 빼고 eyJ로 시작하는 값부터 넣어 주세요. + / = 가 섞여 있으면 JWT가 아니라 일반 Base64(다른 방식으로 바꿔 놓은 문자열)라는 안내가 뜹니다.

    JWT 디코더 디코더 탭 입력창에 eyJ로 시작하는 토큰을 붙여넣은 화면

  2. 붙여넣는 즉시 헤더와 페이로드가 JSON으로 풀려 나옵니다. 만료 시각처럼 숫자로 담긴 값은 날짜로 바꿔 함께 보여 주므로 따로 계산할 필요가 없습니다. exp 가 담겨 있으면 지금 유효한지 만료됐는지도 맨 위에 표시됩니다.

    '유효 — 만료: 2026. 7. 6. 오전 5:40:31' 표시와 HEADER·PAYLOAD JSON, 발급·만료 시각을 날짜로 바꿔 준 타임스탬프, SIGNATURE

  3. 반대로 토큰을 만들려면 위쪽 인코더 탭으로 넘어갑니다. 알고리즘을 고르고 페이로드 JSON과 서명 키를 넣으면 토큰이 바로 만들어집니다.

이렇게 나옵니다

로그인 응답으로 받은 토큰을 넣으면 이렇게 나옵니다.

넣은 것                              나온 것
eyJhbGciOiJIUzI1NiJ9.               헤더    { "alg": "HS256" }
eyJzdWIiOiIxMjM0Iiwi        →       페이로드 { "sub": "1234", "exp": 1767225600 }
ZXhwIjoxNzY3MjI1NjAwfQ.             만료 시각 (exp)  2026. 1. 1. 오전 9:00:00
_abc123signature

알아두면 좋은 것

토큰은 세 조각으로 되어 있습니다

점(.)을 기준으로 나뉩니다.

조각담긴 것
헤더어떤 방식으로 서명했는지
페이로드사용자 ID, 권한, 만료 시각 등
서명내용이 위조되지 않았음을 확인하는 값

앞의 두 조각은 암호화가 아니라 단순 변환이라, 누구나 풀어 읽을 수 있습니다. 디코더 탭이 하는 일도 그 변환을 되돌리는 것뿐입니다.

인코더 탭에서 토큰을 만들 수 있습니다

테스트용 토큰이 필요할 때는 위쪽 탭을 인코더로 바꾸면 됩니다.

항목내용
알고리즘HS256·HS384·HS512 · RS256·RS384·RS512 · ES256·ES384·ES512 (9종)
넣는 것페이로드 JSON + 서명 키
서명 키HS 계열은 비밀 문자열, RS·ES 계열은 PKCS#8 PEM 개인키
샘플 키 생성고른 알고리즘에 맞는 키를 즉석에서 만들어 줌
헤더alg·typ 만 자동으로 채워짐 — 직접 고칠 수는 없습니다

샘플 키 생성을 누르면 HS 계열은 무작위 비밀값, RS·ES 계열은 개인키를 만들어 채워 줍니다. 만들어진 토큰은 오른쪽에서 복사할 수 있습니다.

이런 경우에는

여기서 푼다고 토큰이 유효한 건 아닙니다

이 도구는 내용을 읽어 줄 뿐 서명은 확인하지 않습니다. 누군가 페이로드를 고쳐 만든 가짜 토큰도 여기서는 똑같이 풀립니다.

  • 실제 검증은 서버가 비밀키로 해야 합니다
  • 화면에 보이는 값만 믿고 권한을 판단하면 안 됩니다

토큰에 비밀을 담으면 안 됩니다

페이로드는 누구나 읽을 수 있습니다. 비밀번호·주민번호·내부 키 같은 걸 넣으면 그대로 노출됩니다. 토큰에는 식별자와 권한 정도만 담는 게 원칙입니다.

만료됐는지 어떻게 보나요

exp 값이 만료 시각입니다. 만료 시각 (exp) 줄에 2026. 1. 1. 오전 9:00:00 처럼 날짜로 바꿔 보여 주므로, 지금보다 이전이면 만료된 토큰입니다. iat는 발급 시각입니다.

자주 보는 항목들

페이로드에 흔히 담기는 값들입니다.

이름
exp만료 시각 — 이 시각이 지나면 못 씁니다
iat발급 시각
sub누구의 토큰인지 (보통 사용자 ID)
iss누가 발급했는지
aud어디에 쓰라고 만든 것인지
role, scope어떤 권한이 있는지

exp·iat·nbf 는 이 화면에서 날짜로 바꿔 주지만, 그 밖에 숫자로 담긴 시각은 유닉스 타임 변환기에 넣으면 날짜로 바뀝니다.

로그인이 자꾸 풀려요

exp 를 확인해 보세요. 만료 시간이 너무 짧게 설정된 경우일 수 있습니다.

이 도구로는 안 되는 것

  • 서명이 올바른지 검증하지 않습니다 — 내용만 풀어 보여 줍니다
  • 토큰을 무효화하거나 갱신할 수 없습니다
  • 페이로드를 고쳐 다시 서명하는 흐름은 없습니다. 인코더 탭에서 처음부터 새로 만들어야 합니다
  • 인코더 탭은 서명 키를 직접 넣어야 합니다. 실제 서버 키 없이 남의 토큰과 같은 값을 만들 수는 없습니다
  • 내부 JSON을 정렬해 보려면 JSON 포맷터를 함께 쓰세요

용어 설명

JWT

로그인 상태를 담아 서버와 앱이 주고받는 토큰입니다. 서버가 발급하고, 이후 요청마다 이 토큰을 보내 "누구인지"를 증명합니다.

페이로드

토큰 가운데 조각으로, 실제 정보가 담긴 부분입니다. 사용자 ID·권한·만료 시각 등이 들어갑니다. 암호화되어 있지 않다는 점이 중요합니다.

서명

토큰이 중간에 고쳐지지 않았음을 확인하는 값입니다. 서버만 아는 비밀키로 만들기 때문에, 내용을 고치면 서명이 맞지 않아 서버가 거부합니다.

자주 묻는 질문

JWT 토큰을 복호화(디코딩)할 때 서버의 시크릿 키나 비밀번호가 필요한가요?

아니요, 필요하지 않습니다. JWT의 헤더와 페이로드는 암호화(Encryption)된 것이 아니라 단순히 Base64URL 방식으로 인코딩(Encoding)된 텍스트입니다. 따라서 시크릿 키나 프라이빗 키가 없어도 누구나 디코딩 도구를 이용해 내부의 데이터를 평문으로 읽어볼 수 있습니다.

페이로드 내용이 누구나 볼 수 있다면 보안상 위험하지 않나요?

JWT는 데이터의 '기밀성'이 아니라 '무결성'을 보장하기 위한 기술입니다. 내용 자체는 누구나 읽을 수 있으므로 비밀번호나 개인 식별 정보 같은 민감한 데이터를 페이로드에 넣으면 매우 위험합니다. 보안이 필요한 데이터는 토큰에 담지 않고, 서명을 통해 토큰이 중간에 변조되지 않았음을 증명하는 데 목적을 두어야 합니다.

입력 창에 토큰을 넣었는데 '유효하지 않은 JWT 형식입니다'라는 에러가 뜹니다. 원인이 무엇인가요?

정상적인 JWT는 항상 점(.)을 기준으로 3개의 파트로 나뉘어 있어야 하며, Base64URL 문자셋(알파벳, 숫자, 하이픈(-), 언더스코어(_))만 포함해야 합니다. 복사 과정에서 공백이 섞였거나, 일반 Base64 인코딩 결과물인 '+', '/', '=' 문자가 포함되어 있는지 확인해 보세요.

토큰이 만료됐는지 어떻게 확인하나요?

페이로드의 exp 값과 지금 시각을 비교하면 됩니다. exp가 지금보다 작으면 이미 만료된 토큰입니다. 시각이 숫자로 담겨 있어 알아보기 어려운데, 그 숫자를 유닉스 타임 변환기에 넣으면 날짜와 시각으로 바뀝니다. 로그인이 자꾸 풀린다면 iat(발급 시각)과 exp를 함께 확인해 만료 시간이 너무 짧게 설정된 것은 아닌지 살펴보세요.

페이로드에 어떤 항목들이 담기나요?

자주 보이는 것은 exp(만료 시각), iat(발급 시각), sub(누구의 토큰인지, 보통 사용자 ID), iss(누가 발급했는지), aud(어디에 쓰라고 만든 것인지)이고, 서비스에 따라 role이나 scope처럼 권한 정보가 함께 담기기도 합니다. 이름은 표준으로 정해진 것도 있고 서비스가 임의로 넣는 것도 있어서, 모르는 항목이 보이면 그 서비스의 문서를 확인해야 합니다.

마지막 업데이트: