JWT 디코더

JSON Web Token 디코딩 및 검사

예시 시도

JWT 토큰

로컬에서 실행 · 시크릿 붙여넣기 안전
이것도 써보세요:JWT Encoder

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

HeaderPayloadSignature
Header
json
{
  "alg": "HS256",
  "typ": "JWT"
}
Payload
json
{
  "sub":  "user123",
  "name": "Alice",
  "role": "admin",
  "iat":  1717200000,
  "exp":  1717203600
}

JWT 디코더를 사용하는 이유

원시 JWT는 무작위 텍스트처럼 보입니다. 이 도구는 Header와 Payload를 즉시 포맷된 JSON으로 렌더링하여 코드 한 줄 없이 클레임을 검사하고, 만료 시간을 확인하며, 알고리즘 선택을 감사할 수 있습니다.

🔍
클레임 즉시 확인
Payload의 모든 클레임 — sub, iss, aud, exp, 커스텀 역할, 권한 — 을 한 번의 클릭으로 포맷하여 확인합니다.
🔓
비밀 키 불필요
Header와 Payload는 공개 정보이며, Signature만 비밀이 필요합니다. 이 도구는 서명 키 없이 두 가지 모두를 디코딩합니다.
⏱️
만료 및 타임스탬프 파싱
Unix 타임스탬프(exp, iat, nbf)는 자동으로 사람이 읽을 수 있는 날짜로 변환되어 토큰 만료 여부를 즉시 확인할 수 있습니다.
🔒
브라우저에서 완전히 실행
모든 처리는 로컬에서 이루어지며 — 토큰 데이터는 어떤 서버에도 전송되지 않습니다. 디버깅 중 프로덕션 토큰과 함께 안전하게 사용할 수 있습니다.

표준 JWT 클레임 참조

RFC 7519는 7개의 등록된 클레임 이름을 정의합니다. 이는 필수가 아니지만 상호 운용성을 위해 강력히 권장됩니다. Payload에 임의의 커스텀 클레임을 추가할 수 있습니다.

클레임설명타입
iss발급자토큰을 발급한 주체를 식별합니다 — 예: 인증 서버 URL 또는 애플리케이션 이름.string
sub주제JWT가 대상으로 하는 주체를 식별합니다 — 일반적으로 사용자 ID 또는 서비스 계정.string
aud대상의도된 수신자를 식별합니다. 수신 측은 자신의 식별자와 일치하는지 검증해야 합니다.string | string[]
exp만료 시간이 시간 이후에는 토큰을 수락해서는 안 되는 Unix 타임스탬프. 도난된 토큰의 피해를 제한하기 위해 항상 설정하십시오.number
nbf유효 시작 시간이 시간 이전에는 토큰을 수락해서는 안 되는 Unix 타임스탬프. 미래 날짜 토큰 예약에 유용합니다.number
iat발급 시간토큰이 발급된 Unix 타임스탬프. 토큰 경과 시간 계산에 사용됩니다.number
jtiJWT ID토큰의 고유 식별자. 서버 측에서 사용된 JTI 값을 저장하고 확인하여 토큰 취소를 가능하게 합니다.string

JWT 서명 알고리즘

Header 클레임 alg는 토큰에 서명한 알고리즘을 선언합니다. 선택은 보안, 성능, 그리고 서드파티 서비스가 개인 키 없이 토큰을 검증할 수 있는지에 영향을 미칩니다.

알고리즘계열키 유형비고
HS256HMACSymmetric가장 일반적. 공유 비밀 — 비밀을 가진 누구든지 서명하고 검증할 수 있습니다.
HS384HMACSymmetric더 강력한 HMAC 변형; 적당한 성능 비용.
HS512HMACSymmetric가장 강력한 HMAC 변형.
RS256RSAAsymmetric가장 널리 사용되는 비대칭 알고리즘(Google, Auth0, Okta). 공개 키로 개인 키 없이 검증 가능.
RS384RSAAsymmetric보안이 강화된 RS 변형.
RS512RSAAsymmetric가장 강력한 RS 변형.
ES256ECDSAAsymmetric타원 곡선 — RSA보다 짧은 서명, 모바일과 IoT에서 인기.
PS256RSA-PSSAsymmetricRSA-PSS: PKCS1v1.5 기반 RS256보다 더 현대적이고 안전함.
none서명 없음 — 치명적으로 위험. 프로덕션에서 alg: none 토큰을 절대 수락하지 마십시오.

보안 고려 사항

JWT 디코딩은 항상 안전합니다. 적절한 서명 검증 없이 JWT를 신뢰하는 것은 안전하지 않습니다. 애플리케이션에서 토큰을 사용할 때마다 이 규칙을 명심하십시오.

항상 안전
  • 개발자 도구 또는 이 도구에서 JWT 디코딩 및 검사
  • exp, iat, nbf를 사용하여 토큰 수명 이해
  • 디버깅을 위해 Payload 클레임 로깅(민감한 개인정보 제외)
  • alg 헤더를 읽어 토큰 서명 방법 이해
절대 하지 말 것
  • 서버 측에서 서명 검증 없이 Payload의 클레임 신뢰
  • alg: none 토큰 수락 — 이는 서명이 전혀 없음을 의미
  • 고보안 애플리케이션에서 액세스 토큰을 localStorage에 저장(httpOnly 쿠키 선호)
  • 민감한 권한이 있는 토큰의 exp를 먼 미래로 설정

일반적인 사용 사례

인증 플로우 디버깅
브라우저 네트워크 탭의 토큰을 붙여넣어 클레임을 검사하고, 내장된 역할을 확인하며, 프로덕션 코드를 건드리지 않고 만료를 검증합니다.
서드파티 토큰 검사
Google, Auth0, Okta, Azure AD의 토큰을 빠르게 읽어 공급자가 포함하는 클레임을 확인하고 예상 스키마와 비교합니다.
API 개발 및 테스트
API 엔드포인트 작성 또는 테스트 시 인증 헤더를 디코딩하여 토큰 생성 로직이 올바른 sub, aud, scope 값을 설정하는지 확인합니다.
마이크로서비스 인가
서비스 메시에서 각 서비스는 업스트림 호출자의 JWT를 검증합니다. 토큰을 디코딩하여 어느 서비스가 토큰을 발급했고 어떤 권한을 주장하는지 추적합니다.
지원 및 인시던트 대응
사용자가 인증 오류를 보고할 때 토큰을 디코딩하여 만료 여부, 대상 오류, 필수 클레임 누락 여부를 확인합니다.
보안 감사
알고리즘 선택, 만료 창, 민감한 데이터가 암호화되지 않은 Payload에 실수로 저장되었는지 여부를 확인하여 서비스 전반의 JWT 사용을 감사합니다.

코드에서 JWT 디코딩

Header와 Payload는 base64url 인코딩되어 있습니다 — 인코딩을 역으로 돌리기만 하면 됩니다. base64url은 +를 -로, /를 _로 대체하고 = 패딩을 생략합니다. Signature만 비밀 키가 필요합니다.

JavaScript (browser)
function decodeJWT(token) {
  const [, payload] = token.split('.')
  const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
  return JSON.parse(json)
}
Node.js
const [, payload] = token.split('.')
const decoded = JSON.parse(
  Buffer.from(payload, 'base64url').toString()
)
Python
import base64, json

def decode_jwt(token):
    payload = token.split('.')[1]
    padding = '=' * (-len(payload) % 4)
    return json.loads(base64.urlsafe_b64decode(payload + padding))
CLI (bash + jq)
TOKEN="eyJhbGc..."
echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .

자주 묻는 질문

비밀 키 없이 JWT를 디코딩할 수 있나요?
네. JWT의 Header와 Payload는 단순히 base64url 인코딩된 JSON입니다 — 암호화된 것이 아닙니다. 누구든지 디코딩하고 읽을 수 있습니다. 비밀(또는 RS/ES 알고리즘의 개인 키)은 토큰이 변조되지 않았음을 확인하는 서명 검증에만 필요합니다.
JWT를 디코딩하면 서명이 검증되나요?
아니요. 디코딩은 클레임만 읽습니다. 검증은 올바른 키를 사용하여 암호화 서명을 확인하는 별도의 단계입니다. 애플리케이션에서 클레임을 신뢰하기 전에 항상 서명을 검증하십시오.
HS256과 RS256의 차이점은 무엇인가요?
HS256은 발급자와 검증자 사이에 공유되는 단일 대칭 비밀을 사용합니다 — 비밀을 가진 누구나 토큰을 생성하고 검증할 수 있습니다. RS256은 비대칭 키 쌍을 사용합니다: 개인 키로 서명하고 공개 키로 검증합니다. RS256을 사용하면 외부 서비스가 토큰을 위조하는 능력 없이 검증할 수 있도록 공개 키를 배포할 수 있습니다.
base64 디코딩이 때때로 실패하는 이유는 무엇인가요?
JWT는 base64url 인코딩을 사용하며, +를 -로, /를 _로 대체하고 = 패딩 문자를 생략합니다. 표준 base64 디코더는 +와 /가 필요하고 패딩이 필요할 수 있습니다. 수동으로 디코딩하기 전에 패딩을 추가(=로 4의 배수로)하고 문자를 교체하십시오.
프로덕션 JWT를 이 도구에 붙여넣는 것이 안전한가요?
네 — 이 도구는 브라우저에서 완전히 실행되며 어떤 서버에도 데이터를 전송하지 않습니다. 그러나 화면이나 브라우저 기록을 볼 수 있는 사람에 주의하십시오. 매우 민감한 토큰의 경우 터미널에서 로컬로 디코딩하십시오.
alg: none은 무엇을 의미하며 위험한가요?
alg: none은 토큰에 암호화 서명이 없음을 의미합니다 — 누구나 임의의 클레임으로 토큰을 만들고 alg를 none으로 설정할 수 있습니다. 일부 초기 JWT 라이브러리는 이러한 토큰을 수락하여 치명적인 취약성을 초래했습니다. 안전한 JWT 라이브러리는 명시적으로 구성되지 않는 한 항상 alg: none 토큰을 거부합니다. 이 검사를 절대 비활성화하지 마십시오.