UltKit

JWT 디코더

JSON Web Token을 붙여 넣으면 헤더와 페이로드를 정렬된 JSON으로 읽을 수 있고, 만료 시각과 발급 시각을 날짜로 보여 주며, 토큰이 지금 유효한지도 알려 줍니다. 디코딩은 모두 브라우저 안에서 이루어지는데, 토큰이 실제로 쓰이는 인증 정보라면 이 점이 중요합니다.

0자 · 0단어 · 0줄

0자 · 0단어 · 0줄

이 브라우저 탭 안에서만 처리됩니다. 입력한 텍스트는 업로드되거나 저장되지 않습니다.

등록된 클레임

RFC 7519 §4.1에 정의된 일곱 가지 클레임 이름입니다. 모두 선택 사항이며, 시간은 1970-01-01 UTC부터의 초 단위입니다.

클레임의미
iss발급자: 토큰을 만들고 서명한 주체
sub주체: 토큰이 가리키는 사용자나 대상
aud대상: 토큰을 받을 수신자
exp만료 시각: 이 시점 이후에는 토큰을 거부
nbf유효 시작: 이 시점 이전에는 토큰을 거부
iat발급 시각: 토큰이 만들어진 때
jtiJWT ID: 재사용 공격을 막는 데 쓰는 고유 식별자

자주 쓰는 alg 값

alg 값의미
HS256SHA-256 기반 HMAC. 공유 비밀 키 하나로 서명하고 검증
RS256SHA-256 기반 RSA PKCS#1 v1.5 서명. 개인 키로 서명하고 공개 키로 검증
PS256SHA-256 기반 RSA-PSS
ES256P-256 곡선과 SHA-256 기반 ECDSA. 서명이 짧음
EdDSAEd25519 또는 Ed448 서명
none서명되지 않은 토큰. 서버는 거부해야 함

JSON Web Token의 내부 구조

JWT는 RFC 7519(2015년 5월)에 정의되어 있으며, RFC는 영어 단어 "jot"처럼 발음하라고 권합니다. 흔히 쓰는 서명된 형태는 Base64url 문자열 세 개를 점으로 이은 header.payload.signature입니다. 헤더는 alg에 HS256이나 RS256 같은 서명 알고리즘을 적고, kid에 키 ID를 담는 경우가 많습니다. 페이로드는 클레임, 즉 JSON 필드를 담습니다. sub(사용자), iss(발급자), aud(대상 수신자), 그리고 1970년 1월 1일 UTC부터의 초 단위 시간인 exp, nbf, iat 등입니다. 디코더는 이 세 시간을 내 현지 시간과 ISO 8601로 바꾸고, 토큰이 만료되었는지, 아직 유효하지 않은지, 유효 기간 안에 있는지 알려 줍니다.

Base64url은 암호화가 아니라 인코딩이므로, 토큰을 가진 사람은 누구나 이 페이지처럼 페이로드를 읽을 수 있습니다. 클레임에 비밀번호, 카드 번호 같은 비밀 정보를 절대 넣지 마세요. 점으로 구분된 부분이 다섯 개인 토큰은 암호화된 토큰인 JWE이며, 키 없이는 내용을 읽을 수 없고 디코더도 그렇게 알려 줍니다. Authorization 헤더에서 함께 복사된 앞부분의 "Bearer "는 자동으로 제거됩니다.

여기서 서명을 검증하지 않는 이유

서명은 키를 가진 누군가가 헤더와 페이로드를 만들었고 그 뒤로 바뀌지 않았음을 증명합니다. 서명을 확인하려면 그 키가 필요합니다. HS256 같은 HMAC 알고리즘이면 공유 비밀 키, RS256, ES256, EdDSA면 발급자의 공개 키입니다. 운영 환경의 서명 비밀 키를 웹 페이지에 붙여 넣는 것은 나쁜 생각이고, 키 없이 토큰을 보증하는 척하는 디코더는 잘못된 안심만 줄 것입니다. 그래서 이 도구는 서명을 보여 주기만 하고 검증하지 않습니다. 여기서 보이는 내용은 사실이 아니라 토큰이 주장하는 내용으로 받아들이세요.

검증은 기대하는 알고리즘을 고정한 채 관리되는 라이브러리를 써서 서버에서 해야 합니다. 과거의 두 가지 실수가 그 이유를 보여 줍니다. 하나는 alg "none"을 받아들여 누구나 서명 없는 토큰을 위조할 수 있게 한 것이고, 다른 하나는 RS256을 기대하는 서버가 속아서 공개 키를 HMAC 비밀 키로 삼아 HS256 서명을 검사하게 되는 알고리즘 혼동입니다. 디코더는 디버깅용입니다. 제공자가 어떤 클레임을 발급하는지 보고, 잘못된 대상을 찾아내고, exp가 1분 전에 지나 세션이 실패했다는 사실을 확인하는 데 씁니다. Base64url 조각을 그대로 읽으려면 Base64 디코더를 이용하세요.

자주 묻는 질문

실제 액세스 토큰을 JWT 디코더에 붙여 넣어도 안전한가요?
이 페이지에서는 토큰이 브라우저 밖으로 나가지 않습니다. 그래도 유효한 토큰은 만료될 때까지 비밀번호처럼 작동하므로, 만료된 토큰이나 테스트 토큰을 쓰고 실제 토큰은 스크린숏과 채팅에 노출하지 마세요.
방금 발급된 토큰이 만료된 것으로 나오는 이유는 무엇인가요?
먼저 기기의 시계를 확인하세요. 일부 발급자는 액세스 토큰의 수명을 몇 분으로만 정하며, 로그에서 복사한 토큰은 보기보다 오래된 것일 수 있습니다. 반대로 exp를 초 대신 밀리초로 적으면 수천 년 뒤로 설정됩니다.
누군가 내 JWT의 페이로드를 바꿀 수 있나요?
수정해서 다시 인코딩할 수는 있지만 서명이 더 이상 일치하지 않습니다. 올바른 키와 알고리즘으로 서명을 검증하는 서버는 변조된 토큰을 거부합니다.
JWS와 JWE는 무엇이 다른가요?
JWS(RFC 7515)는 서명된 토큰으로 세 부분으로 이루어지고 누구나 읽을 수 있습니다. JWE(RFC 7516)는 암호화된 토큰으로 다섯 부분으로 이루어지며 키를 가진 사람만 페이로드를 읽을 수 있습니다.
로그아웃하면 JWT가 무효화되나요?
그것만으로는 아닙니다. 서버가 차단 목록을 두거나 세션 기록을 확인하지 않는 한 서명된 JWT는 exp까지 유효하며, 그래서 액세스 토큰은 보통 수명을 짧게 정합니다.