JWT 디코더
JSON Web Token 디코딩 및 검사
JWT 토큰
JWT(JSON Web Token)란 무엇인가?
JSON Web Token(JWT)은 RFC 7519에 정의된 간결하고 URL 안전한 토큰 형식입니다. 클레임 집합을 JSON 객체로 인코딩한 후 서명하고 — 선택적으로 암호화하여 — 수신자가 데이터가 변조되지 않았음을 검증할 수 있도록 합니다. JWT는 REST API, 싱글 사인온 시스템, 마이크로서비스 인가에서 무상태 인증의 사실상 표준입니다.
JWT 구조: Header · Payload · Signature
모든 JWT는 점으로 구분된 세 개의 base64url 인코딩 세그먼트로 구성됩니다. Header와 Payload는 누구나 읽을 수 있는 일반 JSON이며, Signature는 올바른 키로만 검증할 수 있는 암호화 값입니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}JWT 디코더를 사용하는 이유
원시 JWT는 무작위 텍스트처럼 보입니다. 이 도구는 Header와 Payload를 즉시 포맷된 JSON으로 렌더링하여 코드 한 줄 없이 클레임을 검사하고, 만료 시간을 확인하며, 알고리즘 선택을 감사할 수 있습니다.
표준 JWT 클레임 참조
RFC 7519는 7개의 등록된 클레임 이름을 정의합니다. 이는 필수가 아니지만 상호 운용성을 위해 강력히 권장됩니다. Payload에 임의의 커스텀 클레임을 추가할 수 있습니다.
| 클레임 | 설명 | 타입 |
|---|---|---|
| iss | 발급자 — 토큰을 발급한 주체를 식별합니다 — 예: 인증 서버 URL 또는 애플리케이션 이름. | string |
| sub | 주제 — JWT가 대상으로 하는 주체를 식별합니다 — 일반적으로 사용자 ID 또는 서비스 계정. | string |
| aud | 대상 — 의도된 수신자를 식별합니다. 수신 측은 자신의 식별자와 일치하는지 검증해야 합니다. | string | string[] |
| exp | 만료 시간 — 이 시간 이후에는 토큰을 수락해서는 안 되는 Unix 타임스탬프. 도난된 토큰의 피해를 제한하기 위해 항상 설정하십시오. | number |
| nbf | 유효 시작 시간 — 이 시간 이전에는 토큰을 수락해서는 안 되는 Unix 타임스탬프. 미래 날짜 토큰 예약에 유용합니다. | number |
| iat | 발급 시간 — 토큰이 발급된 Unix 타임스탬프. 토큰 경과 시간 계산에 사용됩니다. | number |
| jti | JWT ID — 토큰의 고유 식별자. 서버 측에서 사용된 JTI 값을 저장하고 확인하여 토큰 취소를 가능하게 합니다. | string |
JWT 서명 알고리즘
Header 클레임 alg는 토큰에 서명한 알고리즘을 선언합니다. 선택은 보안, 성능, 그리고 서드파티 서비스가 개인 키 없이 토큰을 검증할 수 있는지에 영향을 미칩니다.
| 알고리즘 | 계열 | 키 유형 | 비고 |
|---|---|---|---|
| HS256 | HMAC | Symmetric | 가장 일반적. 공유 비밀 — 비밀을 가진 누구든지 서명하고 검증할 수 있습니다. |
| HS384 | HMAC | Symmetric | 더 강력한 HMAC 변형; 적당한 성능 비용. |
| HS512 | HMAC | Symmetric | 가장 강력한 HMAC 변형. |
| RS256 | RSA | Asymmetric | 가장 널리 사용되는 비대칭 알고리즘(Google, Auth0, Okta). 공개 키로 개인 키 없이 검증 가능. |
| RS384 | RSA | Asymmetric | 보안이 강화된 RS 변형. |
| RS512 | RSA | Asymmetric | 가장 강력한 RS 변형. |
| ES256 | ECDSA | Asymmetric | 타원 곡선 — RSA보다 짧은 서명, 모바일과 IoT에서 인기. |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS: PKCS1v1.5 기반 RS256보다 더 현대적이고 안전함. |
| none | — | — | 서명 없음 — 치명적으로 위험. 프로덕션에서 alg: none 토큰을 절대 수락하지 마십시오. |
보안 고려 사항
JWT 디코딩은 항상 안전합니다. 적절한 서명 검증 없이 JWT를 신뢰하는 것은 안전하지 않습니다. 애플리케이션에서 토큰을 사용할 때마다 이 규칙을 명심하십시오.
- –개발자 도구 또는 이 도구에서 JWT 디코딩 및 검사
- –exp, iat, nbf를 사용하여 토큰 수명 이해
- –디버깅을 위해 Payload 클레임 로깅(민감한 개인정보 제외)
- –alg 헤더를 읽어 토큰 서명 방법 이해
- –서버 측에서 서명 검증 없이 Payload의 클레임 신뢰
- –alg: none 토큰 수락 — 이는 서명이 전혀 없음을 의미
- –고보안 애플리케이션에서 액세스 토큰을 localStorage에 저장(httpOnly 쿠키 선호)
- –민감한 권한이 있는 토큰의 exp를 먼 미래로 설정
일반적인 사용 사례
코드에서 JWT 디코딩
Header와 Payload는 base64url 인코딩되어 있습니다 — 인코딩을 역으로 돌리기만 하면 됩니다. base64url은 +를 -로, /를 _로 대체하고 = 패딩을 생략합니다. Signature만 비밀 키가 필요합니다.
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .