JWT 파서
JSON Web Token(JWT)을 파싱·디코딩하고 내용을 표시합니다.
JWT를 헤더와 페이로드로 나누어 클레임 목록으로 보여 줍니다. 서명은 검증하지 않고, 토큰에 어떤 값이 들어 있는지 확인하는 용도입니다.
사용 순서
- JWT 입력란에 점(.)으로 세 부분이 나뉜 토큰을 붙여 넣습니다.
- Header 카드에서 alg와 typ 값을 확인합니다. alg에는 알고리즘 설명이 함께 나옵니다.
- Payload 카드에서 sub, exp, iat 같은 클레임을 확인합니다.
- exp, nbf, iat는 날짜로 바꾼 값이 괄호 안에 함께 나오므로 만료 시각을 바로 볼 수 있습니다.
예시
{"alg":"HS256","typ":"JWT"} 헤더와 {"sub":"1234567890","name":"John Doe","admin":true} 페이로드로 만든 토큰을 넣으면 alg는 HS256 (HMAC using SHA-256), sub는 1234567890 (Subject)으로 나옵니다. admin은 등록된 클레임이 아니라서 설명 없이 표시됩니다.
한계
서명을 검증하지 않으므로 위조된 토큰도 그대로 디코딩됩니다. 등록된 클레임 이름에만 설명을 붙이고 나머지는 설명 없이 표시합니다. 날짜 값은 브라우저의 로컬 시간대로 보여 주므로 기기마다 다르게 보일 수 있습니다. 중첩된 객체는 세 칸 들여쓰기 JSON으로 표시됩니다.
보안 주의
페이로드에는 사용자 식별자, 이메일, 권한 목록이 평문으로 들어 있습니다. 운영 환경에서 발급된 토큰을 붙여 넣으면 그 토큰이 브라우저 기록과 화면에 남으므로, 만료됐거나 테스트용인 토큰만 넣으세요. 디코딩 결과를 신뢰 판단의 근거로 삼으면 안 됩니다.
배경 지식
JWT는 header.payload.signature 세 부분을 Base64URL로 인코딩해 점으로 이은 토큰입니다. 헤더는 서명 알고리즘과 토큰 종류를, 페이로드는 클레임(주체, 만료 시각, 권한 등)을 담습니다. 서명은 발급자가 비밀키나 개인키로 앞의 두 부분에 서명한 값입니다. 서버는 서명을 검증해 토큰이 위조되지 않았음을 확인하며, 디코딩만으로는 이 사실을 알 수 없습니다.
Base64URL은 Base64에서 +와 /를 -와 _로 바꾸고 패딩 등호를 생략한 형식입니다. URL과 헤더에 그대로 넣을 수 있도록 만들어졌습니다. 그래서 일반 Base64 디코더로 읽으면 문자가 맞지 않아 실패할 수 있습니다. 클레임 이름은 RFC 7519와 IANA 등록 목록에 정의되어 있으며, 이 도구는 그 목록을 기준으로 설명을 붙입니다.
자주 묻는 질문
JWT의 exp 값은 밀리초인가요, 초인가요?
초 단위의 Unix 시간입니다. 이 도구는 값에 1000을 곱해 날짜로 바꿉니다. 발급 측이 밀리초로 값을 넣었다면 날짜가 수십 년 뒤로 보이므로, 그 경우에는 발급 코드를 확인해야 합니다.
디코딩 결과로 토큰이 만료됐는지 판단할 수 있나요?
날짜 표시로 짐작할 수는 있지만 공식 판단은 아닙니다. 서버는 현재 시각과 exp뿐 아니라 허용 오차, 발급자, 대상(aud) 값까지 함께 보므로 디코딩 결과만으로 유효성을 판단하면 안 됩니다.
alg가 none이면 어떤 의미인가요?
서명이나 MAC을 하지 않은 토큰이라는 뜻입니다. 이 도구는 none을 No digital signature or MAC performed로 설명합니다. 서버가 none을 받아들이면 위조가 가능해지므로, 서명 없는 토큰은 거부되어야 합니다.