왜 만들었나요
토큰이 점 두 개로 이어진 긴 문자열이라, 사용자 ID가 뭐로 들어갔는지 만료가 언제인지 그냥 봐서는 하나도 안 보였습니다. 디버깅할 때마다 콘솔에 코드를 쳐서 풀어 보는 게 번거로워 JWT 디코더를 만들었습니다.
로그인 토큰을 붙여넣으면 안에 든 정보를 읽을 수 있는 형태로 풀어 줍니다. 만료 시각도 사람이 읽는 날짜로 바꿔 보여 줍니다. 같은 화면의 인코더 탭에서는 반대로 토큰을 만들 수도 있습니다.
로딩 중...
토큰이 점 두 개로 이어진 긴 문자열이라, 사용자 ID가 뭐로 들어갔는지 만료가 언제인지 그냥 봐서는 하나도 안 보였습니다. 디버깅할 때마다 콘솔에 코드를 쳐서 풀어 보는 게 번거로워 JWT 디코더를 만들었습니다.
Note
붙여넣은 토큰은 서버로 전송되지 않습니다. JWT 디코더는 토큰을 푸는 일까지 전부 브라우저 안에서 처리해, 실제 로그인 토큰을 넣어도 기기 밖으로 나가지 않습니다.
입력창에 토큰을 통째로 붙여넣습니다. 앞에 Bearer 가 붙어 있다면 그 부분은 빼고 eyJ로 시작하는 값부터 넣어 주세요. + / = 가 섞여 있으면 JWT가 아니라 일반 Base64(다른 방식으로 바꿔 놓은 문자열)라는 안내가 뜹니다.

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

반대로 토큰을 만들려면 위쪽 인코더 탭으로 넘어갑니다. 알고리즘을 고르고 페이로드 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 를 확인해 보세요. 만료 시간이 너무 짧게 설정된 경우일 수 있습니다.
로그인 상태를 담아 서버와 앱이 주고받는 토큰입니다. 서버가 발급하고, 이후 요청마다 이 토큰을 보내 "누구인지"를 증명합니다.
토큰 가운데 조각으로, 실제 정보가 담긴 부분입니다. 사용자 ID·권한·만료 시각 등이 들어갑니다. 암호화되어 있지 않다는 점이 중요합니다.
토큰이 중간에 고쳐지지 않았음을 확인하는 값입니다. 서버만 아는 비밀키로 만들기 때문에, 내용을 고치면 서명이 맞지 않아 서버가 거부합니다.
아니요, 필요하지 않습니다. JWT의 헤더와 페이로드는 암호화(Encryption)된 것이 아니라 단순히 Base64URL 방식으로 인코딩(Encoding)된 텍스트입니다. 따라서 시크릿 키나 프라이빗 키가 없어도 누구나 디코딩 도구를 이용해 내부의 데이터를 평문으로 읽어볼 수 있습니다.
JWT는 데이터의 '기밀성'이 아니라 '무결성'을 보장하기 위한 기술입니다. 내용 자체는 누구나 읽을 수 있으므로 비밀번호나 개인 식별 정보 같은 민감한 데이터를 페이로드에 넣으면 매우 위험합니다. 보안이 필요한 데이터는 토큰에 담지 않고, 서명을 통해 토큰이 중간에 변조되지 않았음을 증명하는 데 목적을 두어야 합니다.
정상적인 JWT는 항상 점(.)을 기준으로 3개의 파트로 나뉘어 있어야 하며, Base64URL 문자셋(알파벳, 숫자, 하이픈(-), 언더스코어(_))만 포함해야 합니다. 복사 과정에서 공백이 섞였거나, 일반 Base64 인코딩 결과물인 '+', '/', '=' 문자가 포함되어 있는지 확인해 보세요.
페이로드의 exp 값과 지금 시각을 비교하면 됩니다. exp가 지금보다 작으면 이미 만료된 토큰입니다. 시각이 숫자로 담겨 있어 알아보기 어려운데, 그 숫자를 유닉스 타임 변환기에 넣으면 날짜와 시각으로 바뀝니다. 로그인이 자꾸 풀린다면 iat(발급 시각)과 exp를 함께 확인해 만료 시간이 너무 짧게 설정된 것은 아닌지 살펴보세요.
자주 보이는 것은 exp(만료 시각), iat(발급 시각), sub(누구의 토큰인지, 보통 사용자 ID), iss(누가 발급했는지), aud(어디에 쓰라고 만든 것인지)이고, 서비스에 따라 role이나 scope처럼 권한 정보가 함께 담기기도 합니다. 이름은 표준으로 정해진 것도 있고 서비스가 임의로 넣는 것도 있어서, 모르는 항목이 보이면 그 서비스의 문서를 확인해야 합니다.
마지막 업데이트: