JWT 디코더 (JWT Decoder)
무료 JWT 디코더로 JWT 토큰을 온라인에서 즉시 디코딩. 헤더, 페이로드, 서명, 만료, 클레임 확인. 100% 브라우저 기반 — 토큰이 기기를 떠나지 않음. 가입·추적 없음.
JWT란 무엇인가요?
JSON Web Token, 줄여서 JWT('jot'으로 발음)는 두 당사자 사이에 클레임을 전달하는 간결하고 URL-안전한 토큰 형식입니다. RFC 7519에 정의되어 있으며, OAuth 2.0 액세스 토큰, OpenID Connect ID 토큰, 현대 인증 공급자(Auth0, Okta, Clerk, Supabase, Firebase)의 API 키, 마이크로서비스 아키텍처의 서비스 간 토큰 등에서 지배적인 자격 증명 형식으로 사용됩니다.
"JSON Web Token(JWT)은 HTTP Authorization 헤더나 URI 쿼리 매개변수처럼 공간이 제한된 환경을 위한 간결한 클레임 표현 형식입니다." — RFC 7519, Section 1
JWT는 점(.)으로 연결된 세 개의 Base64URL 인코딩된 JSON 객체입니다: header.payload.signature. 헤더는 토큰이 어떻게 서명되었는지를 설명합니다(alg 클레임 — 예를 들어 HS256 또는 RS256 — 과 보통 'JWT'인 typ 클레임). 페이로드는 클레임을 담습니다. iss, sub, aud, exp, iat 같은 등록된 클레임과, 발급자가 필요로 하는 사용자 정의 클레임(role, scope, email, tenant ID)을 담습니다. 서명은 발급자의 비밀 키나 개인 키를 사용해 헤더와 페이로드에 대해 계산된 암호학적 증거로, 수신자가 변조를 탐지할 수 있게 해줍니다.
결정적으로 JWT는 인코딩되었을 뿐, 암호화된 것은 아닙니다. 토큰을 가진 누구나 페이로드를 읽을 수 있습니다. 디코딩은 Base64URL과 JSON 파싱일 뿐입니다. 보안 보장은 서명에서 나옵니다. 공격자는 JWT를 읽을 수 있지만, 서명 키 없이는 서명 검증을 통과하는 다른 JWT를 만들 수 없습니다. 그래서 JWT는 네트워크 상에서 전달하기에는 안전하지만, 비밀을 담기에는 안전하지 않습니다.
JWT 디코더는 서명에 손대지 않고도 토큰에 무엇이 들어 있는지, 즉 알고리즘, 클레임, 만료를 그대로 보여줍니다. '이 토큰이 만료되었나?', '이 사용자의 역할이 무엇인가?', '어떤 발급자가 이 토큰을 만들었나?', '거부해야 할 alg:none 토큰인가?'와 같은 질문에 가장 빠르게 답할 수 있는 방법입니다. 이 도구의 모든 디코딩은 로컬 브라우저에서 실행되므로 실제 운영 환경 토큰을 붙여넣어도 안전합니다.
JWT 작업은 종종 다른 개발 도구와 함께 진행됩니다. 잘못된 토큰을 디버깅할 때 Base64URL로 감싸진 세그먼트를 디코딩하거나, 프록시에서 캡처한 Authorization 헤더를 URL 디코딩하거나, exp 클레임을 사람이 읽을 수 있는 날짜로 수동 변환해야 할 수도 있습니다. 운영 환경에서 JWT가 어떻게 서명, 검증, 순환되는지에 대한 더 자세한 설명은 Base64 기초 가이드를 참고하세요. Base64URL은 모든 JWT가 기반으로 하는 토대입니다.
// Decode a JWT in the browser — header & payload only
function decodeJwt(token) {
const [h, p, s] = token.split('.');
const pad = (seg) => seg + '==='.slice((seg.length + 3) % 4);
const decode = (seg) => JSON.parse(
atob(pad(seg).replace(/-/g, '+').replace(/_/g, '/'))
);
return { header: decode(h), payload: decode(p), signature: s };
}
const { header, payload } = decodeJwt(token);
console.log(header); // → { alg: 'HS256', typ: 'JWT' }
console.log(payload); // → { sub: 'user_123', exp: 1999999999, ... }
// Expiration check
const expired = payload.exp * 1000 < Date.now(); 주요 기능
JWT 즉시 디코딩
붙여넣는 즉시 JWT가 실시간으로 디코딩됩니다 — 헤더, 페이로드, 서명이 그 자리에서 파싱됩니다. Decode 버튼도, 서버 왕복도 없습니다.
만료 감지
exp 클레임을 자동으로 읽어 토큰이 만료된 경우 빨간색 배지를 표시하고, 정확한 만료 일시를 로컬 시간대로 보여줍니다.
알고리즘 무관
모든 JWS 알고리즘 — HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512, EdDSA, alg:none — 을 디코딩합니다.
100% 로컬
디코딩은 네이티브 atob와 JSON.parse를 통해 브라우저에서 실행됩니다. 토큰이 업로드되지 않아 운영 환경 자격 증명에도 안전합니다.
클레임 인식 표시
RFC 7519에 등록된 클레임(iat, exp, nbf, iss, aud, sub, jti)을 강조 표시하여 인증 문제를 한눈에 찾을 수 있습니다.
원클릭 복사
헤더 JSON, 페이로드 JSON, 원시 서명을 클릭 한 번으로 클립보드에 복사할 수 있어 버그 리포트와 테스트에 완벽합니다.
예시
HS256 토큰 (유효)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsIm5hbWUiOiJBbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcxNTAwMDAwMCwiZXhwIjoxOTk5OTk5OTk5fQ.4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "user_123",
"name": "Alice",
"role": "admin",
"iat": 1715000000,
"exp": 1999999999
} HMAC-SHA256로 서명된 토큰으로 subject, role, 미래 만료 시각을 포함합니다. 세션 인증에 가장 흔하게 쓰이는 JWT 구성입니다.
RS256 토큰 (만료)
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS0yMDI1LTAxIn0.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJhdWQiOiJhcGkuZXhhbXBsZS5jb20iLCJzdWIiOiI5MDA4NzE2NSIsImlhdCI6MTYwMDAwMDAwMCwiZXhwIjoxNjAwMDAzNjAwLCJzY29wZSI6InJlYWQ6dXNlciB3cml0ZTpwb3N0In0.signature_placeholder
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-2025-01"
}
{
"iss": "https://auth.example.com",
"aud": "api.example.com",
"sub": "90087165",
"iat": 1600000000,
"exp": 1600003600,
"scope": "read:user write:post"
} RSA로 서명된 OAuth 스타일 액세스 토큰입니다. 헤더의 kid(키 ID)와 이미 만료되었음을 보여주는 exp 클레임에 주목하세요.
OIDC ID 토큰
eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJzdWIiOiIxMTA1MDIyNTExNTU4OTkwNzY2Mzk1IiwiYXpwIjoiY2xpZW50LWlkIiwiYXVkIjoiY2xpZW50LWlkIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpYXQiOjE3MTUwMDAwMDAsImV4cCI6MTk5OTk5OTk5OSwibm9uY2UiOiJhYmMxMjMifQ.signature
{
"alg": "ES256",
"typ": "JWT"
}
{
"iss": "https://accounts.google.com",
"sub": "110502251155899076639",
"azp": "client-id",
"aud": "client-id",
"email": "alice@example.com",
"email_verified": true,
"iat": 1715000000,
"exp": 1999999999,
"nonce": "abc123"
} ECDSA 서명, 이메일 클레임, 재생 공격 방지를 위한 nonce를 포함하는 OpenID Connect ID 토큰입니다.
Alg: none 토큰 (서명 없음)
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJkZWJ1Zy11c2VyIiwiaWF0IjoxNzE1MDAwMDAwfQ.
{
"alg": "none",
"typ": "JWT"
}
{
"sub": "debug-user",
"iat": 1715000000
} alg:none을 사용하는 서명 없는 토큰입니다. 운영 환경에서 이를 수용하는 것은 대표적인 JWT 취약점이므로, 서버 측에서 alg:none은 반드시 거부해야 합니다.
사용 방법
- 1
JWT를 붙여넣어 디코딩하기
점으로 구분된 세 부분을 포함한 전체 토큰을 디코딩할 수 있도록 입력 상자에 붙여넣으세요. 디코더는 브라우저에서 즉시 실행되므로 버튼을 누를 필요가 없습니다.
- 2
디코딩된 헤더, 페이로드, 상태 읽기
디코딩된 헤더에서 알고리즘과 토큰 유형을, 디코딩된 페이로드에서 클레임을, 상단의 만료/발급 시각 칩을 읽으세요. 만료된 토큰은 빨간색으로 표시됩니다.
- 3
디코딩 결과 복사하기
각 패널의 Copy 버튼으로 디코딩된 헤더 JSON, 디코딩된 페이로드 JSON, 원시 서명을 복사하세요. 토큰은 어디에도 전송되지 않았으며, 디코딩은 브라우저에서 로컬로 이루어졌습니다.
Common Errors
alg:none 수용
서명 없는 JWT는 누구나 위조할 수 있습니다. 운영 환경에서는 alg:none을 절대 허용하지 말고, verify 호출에 항상 명시적인 알고리즘 목록을 전달하세요.
jwt.verify(token, secret) // library default may allow 'none'
jwt.verify(token, secret, { algorithms: ['RS256'] }) exp 클레임 누락
exp가 없는 JWT는 영원히 유효합니다. 토큰이 한 번이라도 유출되면 자연스러운 폐기 시점이 없어집니다. 항상 토큰 유형에 맞는 만료 시각을 설정하세요.
{ "sub": "user_123", "role": "admin" } // no exp { "sub": "user_123", "role": "admin", "exp": 1715003600 } 페이로드에 비밀 저장
JWT 페이로드는 암호화되지 않으며 토큰을 가진 누구나 읽을 수 있습니다. 비밀번호, API 키, 잘리지 않은 PII를 JWT 페이로드에 절대 넣지 마세요.
{ "sub": "user_123", "password": "hunter2" } { "sub": "user_123", "role": "admin" } // payload stays minimal 주요 사용 사례
- Authorization Bearer 토큰 디코딩
- Authorization: Bearer 헤더의 JWT 토큰을 디코딩하여 백엔드가 수신하는 클레임, audience, 만료를 확인하세요.
- OAuth 2.0 및 OIDC 토큰 디코딩
- OAuth 2.0 및 OpenID Connect 통합 과정에서 인가 서버(Auth0, Okta, Google, Keycloak)가 반환한 액세스 토큰과 ID 토큰을 디코딩하세요.
- 만료된 세션 진단
- 거부된 토큰이 만료된 것인지, 잘못된 audience를 사용하는지, 시계 편차 문제가 있는지 1초 안에 확인하세요.
- 키 순환 점검
- 헤더의 kid(키 ID)를 읽어 JWKS 순환이 예상된 키로 서명된 토큰을 배포하고 있는지 검증하세요.
- 보안 리뷰
- 코드 리뷰와 모의 침투 중 alg:none으로 서명된 토큰, 누락된 exp, 페이로드로 유출되는 PII를 찾아내세요.
- 마이크로서비스 토큰 확인
- 메시 내부의 서비스 간 토큰을 디코딩해 다운스트림 호출이 어떤 scope와 subject로 인가되는지 확인하세요.
기술 세부 사항
- RFC 7519 준수
- RFC 7519(JWT), RFC 7515(JWS), RFC 7518(JWA)을 따르는 JWS 토큰을 처리하며, 등록된 모든 알고리즘의 디코딩을 지원합니다.
- Base64URL 디코딩
- RFC 4648에 정의된 URL-안전 Base64 알파벳(+, / 대신 -, _)을 사용하며, 패딩 허용 파싱을 제공합니다.
- 브라우저 네이티브, 의존성 없음
- 브라우저의 atob, TextDecoder, JSON.parse를 기반으로 하며, 외부 라이브러리도, 네트워크 호출도, 원격 측정도 없습니다.
모범 사례
- 검증 없이 신뢰하지 말기
- 디코더는 클레임을 보여줄 뿐 증명하지 않습니다. 어떤 클레임이든 신뢰하기 전에 반드시 발급자의 키로 서버 측에서 서명을 검증하세요.
- 운영 환경에서 alg:none 거부
- JWT 라이브러리를 알고리즘 명시적 허용 목록으로 구성하세요. alg:none은 절대 허용하지 말고, 키 순환 중 alg 불일치를 경계하세요.
- 페이로드 가볍게 유지
- 식별자와 수명이 짧은 클레임만 JWT에 넣고, 덩치 큰 데이터는 불투명한 세션 ID 뒤에 두세요. 큰 토큰은 요청마다 대역폭 비용을 발생시킵니다.
자주 묻는 질문
JWT 토큰은 어떻게 온라인에서 디코딩하나요?
header.payload.signature)를 모두 포함한 완전한 JWT를 위 디코더에 붙여넣으세요. 디코딩은 브라우저에서 즉시 수행됩니다. 헤더와 페이로드는 Base64URL로 디코딩되어 읽기 쉬운 JSON이 되고, 서명은 원시 문자열로 표시됩니다. 상태 행에 서명 알고리즘, 발급 시각, 만료가 표시되어 만료된 토큰을 한눈에 알아볼 수 있습니다. JWT를 수동으로 디코딩하려면 토큰을 점으로 나누고, 앞의 두 세그먼트를 Base64URL로 디코딩한 뒤 JSON으로 파싱하면 됩니다. 페이로드는 인코딩되었을 뿐 암호화되지 않았기 때문에 토큰을 가진 사람은 누구나 클레임을 읽을 수 있습니다. 이 디코더는 운영 환경 토큰에도 안전합니다. 기기 밖으로 아무것도 나가지 않기 때문입니다 — 네트워크 요청 없음, 로깅 없음, 추적 없음. JWT(JSON Web Token)란 무엇인가요?
이 JWT 디코더에서 제 토큰은 안전한가요?
JWT 디코더는 어떻게 동작하나요?
이 도구로 JWT 서명을 검증할 수 있나요?
iat, exp, nbf, iss, aud, sub, jti는 무엇인가요?
JWT가 만료되었는데 왜 디코더는 여전히 디코딩하나요?
JWT, JWS, JWE의 차이는 무엇인가요?
왜 alg:none이 위험한가요?
alg:none을 사용하는 JWT는 서명이 없으므로, 누구나 임의의 사용자인 것처럼 토큰을 만들 수 있습니다. 초창기 JWT 라이브러리는 alg:none을 기본으로 수용했는데, 이로 인해 공격자가 서명을 제거하고 alg를 none으로 설정해 관리자 토큰을 위조하는 유명한 인증 우회 취약점이 발생했습니다. 성숙한 JWT 라이브러리는 이제 명시적으로 허용하지 않는 한 alg:none을 거부하며, 인증된 요청에 대해 이를 수용해서는 절대로 안 됩니다. 이 디코더는 디버깅 중 alg:none 토큰을 확인하는 것은 정당하기 때문에 여전히 보여주지만, 운영 환경에서 받은 그러한 토큰은 모두 적대적으로 간주해야 합니다. 이 JWT 디코더는 어떤 알고리즘을 지원하나요?
JWT를 localStorage에 저장해야 하나요, 쿠키에 저장해야 하나요?
Node.js, Python, Go에서 JWT를 어떻게 디코딩하나요?
jsonwebtoken.decode(token), 검증은 jsonwebtoken.verify(token, key). Python: 읽기는 PyJWT.decode(token, options={'verify_signature': False}), 검증하려면 키를 전달합니다. Go: 읽기 전용은 jwt.ParseUnverified(token, claims), 검증은 jwt.Parse(token, keyFunc). 어떤 언어에서든 운영 코드에서 options={'verify_signature': False}로 검증을 생략해서는 안 됩니다. 이 웹 도구가 디버깅을 위해 의도적으로 그렇게 하는 것이며, 인증이 아니라 확인 용도일 때만 안전합니다. JWT의 최대 크기는 얼마인가요?
토큰을 붙여넣었는데 'Invalid JWT format'이 뜹니다. 무엇이 잘못된 건가요?
header.payload.signature처럼 정확히 점으로 구분된 세 부분으로 이루어집니다. 흔한 원인은 (1) 페이로드 부분만 실수로 복사한 경우, (2) 중간에 공백이나 줄바꿈이 섞여 들어간 경우, (3) 전송 중 토큰이 잘린 경우(터미널 줄바꿈에서 흔함), (4) 토큰이 JWE여서 형식이 header.encryptedKey.iv.ciphertext.tag(다섯 부분)인 경우, (5) 토큰이 URL 인코딩되어 있어 먼저 URL 디코딩해야 하는 경우입니다. API가 반환한 원시 값을 확인하세요. 대부분의 에디터는 마우스를 올리면 보이지 않는 문자를 표시합니다. 비밀 키 없이도 JWT를 디코딩할 수 있나요?
Postman에서는 동작하는 JWT가 백엔드에서 거부됩니다. 어떻게 디버깅하나요?
RS256만 허용하도록 구성된 라이브러리에서는 HS256 토큰이 실패합니다. (4) kid — 키 순환을 사용한다면 헤더의 키 ID가 JWKS에 존재하나요? (5) 서명 — 올바른 비밀 키/공개 키를 사용했나요? 이 디코더는 (1), (2), (3), (4)를 헤더와 페이로드 뷰에 노출하므로 이들을 빠르게 배제할 수 있습니다. 관련 도구
모든 도구 보기 →MD5 해시 생성기 · 파일 체크섬 도구
보안 도구
MD5, SHA-256, SHA-1, SHA-512 해시를 온라인에서 무료로 생성합니다. 브라우저에서 텍스트나 파일을 해싱하고 체크섬을 검증하며 결과를 복사할 수 있습니다.
무작위 비밀번호 생성기 (Random Password Generator)
보안 도구
강력한 무작위 비밀번호를 즉시 만드는 무료 온라인 도구. 길이와 문자 종류를 지정해 최대 50개까지 일괄 생성하고 엔트로피 분석을 확인할 수 있습니다.
UUID 생성기 · 디코더 (UUID Generator & Decoder)
보안 도구
무료 UUID 생성기. v1, v4, v5, v7 UUID를 즉시 생성하고 검증합니다. 최대 50개 일괄 생성 가능하며 100% 브라우저 기반 온라인 도구로 회원 가입이 필요 없습니다.
진법 변환기 (Number Base Converter)
변환 도구
2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.
Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
이미지 압축기 · JPEG, PNG, WebP 온라인 압축
변환 도구
JPEG, PNG, WebP 이미지를 온라인에서 최대 80% 압축합니다. 브라우저 안에서만 처리되며 업로드 없이 20장 일괄 처리, 품질 조절, 전후 비교를 무료로 지원합니다.