JWT 디코더 (토큰 분석기)

JSON Web Token을 붙여넣으면 헤더와 페이로드를 정리된 JSON으로 보여줍니다 — 만료 시각은 사람이 읽기 쉬운 날짜로 변환됩니다. 완전 오프라인.

조회수 1,175회

작동 원리

JSON Web Token은 점으로 연결된 세 개의 Base64URL 인코딩 부분으로 이루어진 압축된 문자열입니다: header.payload.signature. Base64URL은 일반 Base64의 URL 안전 변형으로, +// 대신 -/_를 사용하고 끝의 = 패딩을 생략하므로, 결과값을 이스케이프 처리 없이 URL이나 HTTP 헤더 안에 그대로 넣을 수 있습니다. 헤더는 서명 알고리즘과 토큰 유형을 나타내는 작은 JSON 객체로, 일반적으로 {"alg":"HS256","typ":"JWT"} 형태입니다. 페이로드는 "클레임"이라 불리는 임의의 키/값 쌍으로 이루어진 JSON 객체로, 토큰이 누구를 나타내고 무엇을 할 수 있는지를 설명하며, 여기에 몇 가지 등록된 시간 클레임 — iat(발급 시각), nbf(이전에는 유효하지 않음), exp(만료 시각) — 이 모두 유닉스 타임스탬프 형태로 저장됩니다. 서명은 헤더에 명시된 알고리즘과 발급 서버만이 가지고 있는 키를 사용해 앞의 두 부분에 대해 계산됩니다.

여기에 토큰을 붙여넣으면 이 도구는 두 개의 점을 기준으로 토큰을 나누고, 헤더와 페이로드를 Base64URL로 디코딩한 뒤 각각을 들여쓰기된 JSON으로 보기 좋게 출력합니다. exp/iat/nbf 값이 있으면 추가로 사람이 읽기 쉬운 날짜로 변환되며, 토큰이 현재 만료됐는지를 한눈에 보여주는 배지가 표시됩니다.

JWT는 오늘날 대부분의 인증 시스템의 근간입니다: OAuth 2.0 액세스 토큰, OpenID Connect ID 토큰, 그리고 다양한 자체 세션 시스템이 모두 이 형식을 사용하는데, 서명만 검증할 수 있다면 데이터베이스 조회 없이도 다른 서비스가 읽을 수 있는 자기 완결적인 자격 증명을 서버가 발급할 수 있기 때문입니다. 흔히 쓰이는 알고리즘은 HS256(공유 비밀키를 사용하는 HMAC)과 RS256/ES256(비대칭 RSA 또는 타원곡선 서명으로, 발급자는 개인 키를 보관하고 누구나 짝이 되는 공개 키로 검증할 수 있음)입니다.

알아두어야 할 점

디코딩은 검증이 아닙니다. 헤더와 페이로드는 인코딩만 되어 있을 뿐 암호화된 것이 아니므로, 누구나 키 없이 읽을 수 있고 누구나 원하는 클레임을 담아 토큰을 위조할 수도 있습니다. JWT를 신뢰할 수 있게 만드는 유일한 요소는 서명이며, 서명을 검증하려면 비밀키(HMAC 알고리즘) 또는 발급자의 공개 키(RSA/ECDSA 알고리즘)가 필요합니다. 이 검증은 키를 보유한 서버에서 이루어져야 하며, 브라우저 내 도구에서는 안전하게 수행할 수 없습니다 — 비밀 키를 그곳에 노출하는 것 자체가 목적을 무너뜨리기 때문입니다. 이 디코더는 어디까지나 디버깅 보조 도구로만 취급하시고, 토큰이 진짜이거나 여전히 유효하다는 증거로는 절대 사용하지 마십시오.

붙여넣는 내용도 주의해서 다루십시오: JWT는 세션이나 인가 정보를 담고 있으므로 비밀번호처럼 취급하고, 공유 컴퓨터에서 실제 운영 환경의 토큰을 어떤 도구에도 붙여넣지 않는 것이 좋습니다. 점으로 구분된 부분이 다섯 개인 토큰은 JWE(암호화됨)이지 JWS(서명됨)가 아닙니다 — 이 디코더는 훨씬 더 흔한 서명 방식을 처리합니다. 그리고 여러분 자신의 검증 코드에서 alg 필드를 절대 맹목적으로 신뢰하지 마십시오 — 잘 알려진 공격 기법은 허술한 구현을 속여 alg: none을 받아들이게 하거나 RS256을 HS256으로 바꿔치기하게 만드는데, 이것이 서명 검증을 직접 작성한 코드가 아니라 검증된 라이브러리에 맡겨야 하는 이유입니다.

자주 묻는 질문

디코딩하면 토큰이 유효하다는 게 확인되나요?

아니요 — 디코딩은 내용을 읽을 뿐입니다. 서명 검증에는 서명 키 또는 공개 키가 필요하며 이는 서버가 할 일입니다. 누구나 원하는 페이로드로 토큰을 만들 수 있고, 오직 서명만이 진위를 증명합니다.

실제 운영 환경의 토큰을 여기 붙여넣어도 안전한가요?

이 도구는 토큰을 어디로도 전송하지 않습니다 — 디코딩은 로컬에서 이루어집니다. 그래도 운영 토큰은 비밀번호처럼 다루세요. 공유 환경에서 디버깅할 때는 만료됐거나 테스트용인 토큰을 쓰는 편이 좋습니다.

토큰이 디코딩되지 않는 이유는 무엇인가요?

점으로 구분된 세 부분을 모두 복사했는지, 줄바꿈이 섞여 들어가지 않았는지 확인하세요. 암호화된 토큰(JWE, 다섯 부분)은 키 없이는 읽을 수 없습니다 — 이 도구는 흔히 쓰이는 서명된 (JWS) 토큰을 처리합니다.

JWS와 JWE 토큰의 차이는 무엇인가요?

JWS(JSON Web Signature)는 이 도구가 디코딩하는 서명된 형식으로, 세 부분으로 이루어져 있으며 읽을 수는 있지만 변조하면 감지할 수 있습니다. JWE(JSON Web Encryption)는 다섯 부분으로 이루어지며 페이로드 자체가 암호화되어 있어 복호화 키 없이는 전혀 읽을 수 없습니다. 토큰이 여기서 디코딩되지 않고 점이 두 개가 아니라 네 개라면 JWE일 가능성이 높습니다.

exp, iat, nbf 클레임은 각각 무엇을 의미하나요?

세 값 모두 유닉스 타임스탬프(1970년 1월 1일부터 경과한 초)입니다. iat은 토큰이 발급된 시각을, nbf는 토큰이 유효해지는 가장 이른 시점을, exp는 토큰이 더 이상 유효하지 않게 되는 시점을 나타냅니다. 올바르게 동작하는 서버라면 현재 시각이 nbf-exp 범위를 벗어난 토큰은 모두 거부해야 합니다.

댓글

아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!

비슷한 도구