JWT 디코더
JSON Web Token(JWT)을 디코딩하여 헤더 및 페이로드 내용을 확인합니다.
JSON Web Token(JWT)이란 무엇이며 왜 디코더가 필요한가요?
JSON Web Token(JWT)은 두 당사자 간에 속성(Claims)을 안전하게 전송하기 위한 간결하고 독립적인 방식의 공개 표준(RFC 7519)입니다. JWT는 JSON 객체를 사용하여 정보를 표현하며, 디지털 서명 또는 암호화(JWS/JWE)를 통해 데이터의 무결성을 보장합니다.
JWT는 일반적으로 마침표(.)로 구분된 세 부분(Header.Payload.Signature)으로 구성됩니다. 헤더(Header)는 토큰의 유형과 사용된 서명 알고리즘(HS256, RS256 등)을 정의합니다. 페이로드(Payload)는 사용자 ID, 권한 등 실제 전송하려는 데이터(Claims)를 담고 있습니다. 마지막으로 서명(Signature)은 토큰이 전송 도중 변조되지 않았음을 증명합니다. 중요한 점은 JWT가 암호화된 것이 아니라 Base64Url로 인코딩된 것이라는 점입니다. 즉, 토큰을 가진 누구나 그 안의 데이터를 읽을 수 있습니다. ProUtil의 JWT 디코더는 개발자가 토큰 내부의 사용자 정보, 만료 시간, 권한 등을 쉽고 빠르게 검사할 수 있도록 설계되었습니다. 특히 모든 처리가 사용자 브라우저 내에서만 이루어지므로, 민감한 인증 토큰이 외부 서버로 유출될 걱정 없이 안전하게 디버깅할 수 있습니다.
JSON Web Token을 검사하고 디버깅하는 방법
토큰 확보: HTTP Authorization 헤더나 브라우저의 로컬 스토리지에서 전체 JWT 문자열을 복사합니다.
토큰 입력: 복사한 문자열을 "암호화된 토큰" 필드에 붙여넣습니다. ProUtil은 긴 토큰 문자열도 문제없이 처리합니다.
헤더 분석: 분리된 Header 섹션에서 서명 알고리즘(alg)과 토큰 타입(typ)을 확인합니다.
페이로드 데이터 확인: Decoded Payload를 통해 사용자 속성, 발행자(iss), 대상자(aud) 및 커스텀 클레임을 검토합니다.
만료 시간(exp) 체크: 페이로드 내부의 exp 클레임을 찾아 토큰이 현재 유효한 상태인지, 아니면 만료되었는지 확인합니다.
서명 구조 식별: 서명(세 번째 세그먼트)의 존재 여부를 확인하여 토큰의 무결성 구조가 올바른지 파악합니다.
가독성을 위한 포맷팅: 가독성 높게 정렬된 JSON 뷰를 통해 복잡하게 중첩된 데이터 구조를 한눈에 파악합니다.
민감 정보 관리: JWT 페이로드는 누구나 디코딩할 수 있으므로, 암호나 민감한 개인정보가 토큰에 포함되어 있지 않은지 확인합니다.
오류 메시지 피드백: 토큰 형식이 잘못되었거나 잘린 경우, 오류 패널을 통해 즉각적인 원인을 파악합니다.
보안 우선 디버깅: 개별 복사 버튼을 사용하여 필요한 정보만 로컬 디버깅 로그나 문서에 안전하게 옮겨 적습니다.
엔지니어를 위한 고급 JWT 검사 기능
JWT 디코딩 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IktpbSIsImlhdCI6MjAyNn0.abc123_signature
{
"sub": "1234567890",
"name": "Kim",
"iat": 2026
}JWT 보안 및 구현 시 주의해야 할 오류
잘못된 토큰 형식
유효한 JWT는 반드시 마침표(.)로 구분된 세 부분으로 구성되어야 합니다. 이 형식을 지키지 않으면 표준 디코딩이 불가능합니다.
Base64Url 패딩 오류
JWT는 Base64의 "=" 패딩을 생략합니다. 수동으로 패딩을 추가하거나 토큰이 중간에 잘린 경우 디코딩에 실패할 수 있습니다.
민감한 정보 노출
페이로드는 암호화된 것이 아니므로 비밀번호나 개인식별정보(PII)를 담는 것은 보안상 매우 위험합니다.
만료된 토큰 (exp)
토큰의 exp 클레임이 현재 시간보다 과거라면 해당 토큰은 만료된 것이며, 서버에서 401 오류를 반환하게 됩니다.
알고리즘 변조 공격
헤더의 "alg" 값이 서버의 예상과 다를 경우 보안 위협이 될 수 있습니다. 알고리즘 대체 공격을 항상 경계해야 합니다.
None 알고리즘 주의
알고리즘이 "none"으로 설정된 토큰은 서명 검증을 우회할 수 있으므로, 현대적인 시스템에서는 이를 즉시 거부해야 합니다.
JWT에 대한 심층 질문 및 답변
Q.온라인에서 내 JWT를 디코딩하는 것이 안전한가요?
ProUtil은 모든 디코딩 로직을 로컬 브라우저에서 실행합니다. 입력하신 토큰은 서버로 전송되지 않으므로 개인정보 유출 걱정 없이 안심하고 사용하셔도 됩니다.
Q.HS256과 RS256의 차이점은 무엇인가요?
HS256은 대칭키 알고리즘으로, 하나의 비밀키로 서명과 검증을 모두 수행합니다. RS256은 비대칭키 알고리즘으로, 개인키로 서명하고 공개키로 검증합니다. 분산 시스템에서는 RS256이 보안상 더 유리합니다.
Q.JWT 내부 데이터를 수정하고 다시 서명할 수 있나요?
데이터를 수정하는 것은 쉽지만, 수정 후 서명을 다시 하려면 원래 토큰을 발행할 때 사용했던 비밀키(Secret)가 필요합니다. 키가 없다면 수정된 토큰은 유효하지 않은 것으로 처리됩니다.
Q.JWT는 암호화되어 있나요?
아니요, 기본적으로 JWT(JWS)는 서명만 된 상태이지 암호화된 것이 아닙니다. 내부 데이터는 Base64Url로 인코딩되어 누구나 읽을 수 있으므로 민감한 정보는 담지 말아야 합니다.
Q.왜 일반 Base64가 아닌 Base64Url을 사용하나요?
Base64Url은 `+`, `/` 기호를 `-`, `_`로 바꾸어 URL에서 문제없이 사용할 수 있도록 만든 방식입니다. 또한 패딩 기호(`=`)를 생략하여 토큰 길이를 줄입니다.
Q.JWT에 절대 담으면 안 되는 정보는?
사용자 비밀번호, 주민번호, 신용카드 번호와 같은 민감한 데이터는 절대 포함하면 안 됩니다. JWT는 데이터의 무결성을 보장할 뿐 비밀성을 보장하지는 않기 때문입니다.
Q.JWT 만료는 어떻게 처리하나요?
페이로드의 `exp` 클레임을 통해 만료 시간을 설정합니다. 서버는 이 시간을 체크하여 유효하지 않은 토큰을 거부하며, 일반적으로 리프레시 토큰(Refresh Token)을 함께 사용하여 세션을 갱신합니다.
Q.JWT의 "클레임(Claim)"이란 무엇인가요?
토큰에 담긴 정보의 한 조각을 의미합니다. 발행자(iss), 만료시간(exp), 대상(aud)과 같은 표준 클레임과 사용자가 직접 정의한 커스텀 클레임이 있습니다.
Q.페이로드가 커지면 성능에 영향이 있나요?
네. JWT는 매 요청마다 헤더에 담겨 전송되므로 페이로드가 커지면 네트워크 비용이 증가합니다. 꼭 필요한 최소한의 데이터만 담는 것이 성능 최적화의 핵심입니다.
Q.JWT를 즉시 무효화(Revoke)할 수 있나요?
기본적으로 JWT는 무상태(Stateless)라 만료 전까지는 유효합니다. 즉각 무효화가 필요하다면 서버 측에서 블랙리스트를 관리하거나 별도의 저장소를 활용해야 합니다.
Q.로컬 스토리지와 쿠키 중 어디에 저장하는 게 좋나요?
로컬 스토리지는 사용이 편하지만 XSS 공격에 취약합니다. HttpOnly 속성이 설정된 인코딩 쿠키는 XSS로부터 안전하지만 CSRF 방어 대책이 추가로 필요합니다.
Q.서명 검증을 생략하면 어떤 문제가 생기나요?
서명 검증을 하지 않으면 공격자가 페이로드 내부의 사용자 권한(예: admin: true)을 마음대로 조작할 수 있게 되어 심각한 보안 침해 사고가 발생할 수 있습니다.
Q.헤더의 "kid"는 무엇을 의미하나요?
Key ID의 약자로, 여러 개의 키를 사용하는 환경에서 어떤 키를 사용하여 토큰을 서명했는지 식별하기 위해 사용합니다. 키 로테이션 시 유용합니다.
Q.JWT 크기 제한이 있나요?
기술적 사양에는 제한이 없으나, 실제로는 브라우저나 서버의 HTTP 헤더 크기 제한(보통 8KB~16KB)에 걸릴 수 있습니다. 이 범위를 넘으면 요청이 거부될 수 있습니다.
Q.서명이 "Invalid"라고 뜨는 이유는?
토큰 내용이 전송 중 변조되었거나, 검증에 사용한 비밀키가 틀렸을 때 발생합니다. 또한 토큰 형식이 깨진 경우에도 서명 검증에 실패하게 됩니다.
Q.ProUtil은 오픈 소스인가요?
네! ProUtil은 모든 개발자가 기여할 수 있는 오픈 소스 프로젝트입니다. GitHub에서 소스 코드를 확인하고 프라이버시 정책을 직접 검증하실 수 있습니다.