개인정보 보호: 이 도구는 브라우저에서 완전히 실행됩니다. 네트워크 요청이 발생하지 않습니다. 토큰 데이터는 기기에만 남습니다.

JSON Web Token(JWT)이란?

JSON Web Token(JWT)은 당사자 간에 JSON 객체로 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다. JWT는 웹 API에서 인증 및 정보 교환에 일반적으로 사용됩니다. 토큰은 디지털 서명되어 무결성을 확인할 수 있지만 — 기본적으로 페이로드는 Base64 인코딩만 되어 있으며 암호화되지 않습니다.

JWT는 점(.)으로 구분된 세 부분으로 구성됩니다: Header(알고리즘 및 토큰 유형), Payload(클레임/데이터), Signature(토큰이 변조되지 않았는지 확인하는 데 사용).

JWT 표준 클레임

  • iss (Issuer) — 토큰을 생성하고 서명한 주체
  • sub (Subject) — 토큰이 나타내는 대상 (보통 사용자 ID)
  • aud (Audience) — 토큰의 수신 대상
  • exp (Expiration Time) — 토큰 만료 시간 (Unix 타임스탬프)
  • iat (Issued At) — 토큰 발급 시간
  • nbf (Not Before) — 이 시간 이전에는 토큰이 유효하지 않음
  • jti (JWT ID) — 토큰의 고유 식별자

JWT 보안 팁

  • JWT 페이로드에 민감한 데이터를 저장하지 마세요 — 페이로드는 Base64 인코딩만 되어 있으며 암호화되지 않습니다. 누구나 디코딩할 수 있습니다.
  • 항상 서버 측에서 서명을 확인하세요 — JWT를 디코딩했다고 유효한 것은 아닙니다. 항상 비밀 키로 서명을 확인하세요.
  • 만료 시간을 짧게 유지하세요 — 긴 세션에는 리프레시 토큰을 사용하세요. 짧은 수명의 액세스 토큰(15-60분)은 노출을 제한합니다.
  • "none" 알고리즘을 피하세요 — 일부 취약한 구현은 서명되지 않은 토큰을 허용합니다. 항상 특정 알고리즘을 강제하세요.
  • HTTPS만 사용하세요 — 가로채기를 방지하기 위해 암호화된 연결로만 JWT를 전송하세요.

프로덕션을 위한 JWT 보안 모범 사례

JSON Web Token은 인증에 널리 사용되지만, 부적절한 구현은 심각한 보안 취약점을 만듭니다. 프로덕션 시스템에서 JWT를 배포할 때 다음의 검증된 사례를 따르세요.

토큰 저장: JWT를 어디에 보관할 것인가

  • HttpOnly 쿠키 (권장): JWT를 HttpOnly, Secure, SameSite=Strict 쿠키에 저장합니다. 이렇게 하면 JavaScript 접근이 차단되어 XSS 기반 토큰 탈취가 방지됩니다. 브라우저가 각 요청마다 자동으로 쿠키를 전송합니다.
  • localStorage (피해야 함): 앱이나 서드파티 스크립트의 XSS 취약점이 있으면 localStorage를 읽어 토큰을 탈취할 수 있습니다. 프로덕션 애플리케이션에서는 민감한 토큰을 localStorage에 저장하지 마세요.
  • sessionStorage: 탭을 닫으면 지워지므로 localStorage보다 약간 안전하지만, 세션 중에는 여전히 XSS 공격에 취약합니다.
  • 메모리 내 (SPA): JavaScript 변수에 토큰을 저장합니다. XSS에 대해 가장 안전하지만, 페이지 새로고침 시 토큰이 사라지므로 리프레시 토큰을 통한 자동 재인증이 필요합니다.

일반적인 JWT 취약점과 완화 방법

  • 알고리즘 혼동 공격: 공격자가 alg 헤더를 RS256에서 HS256으로 변경하고 공개 키로 토큰에 서명합니다. 항상 서버 측에서 알고리즘을 검증하고 예상치 못한 알고리즘 값을 거부하세요.
  • 토큰 만료 시간이 너무 긴 경우: 액세스 토큰은 15~30분 내에 만료되어야 합니다. 단명 액세스 토큰과 서버 측에 안전하게 저장되는 장기 리프레시 토큰(7~30일)을 함께 사용하세요.
  • Audience/Issuer 검증 누락: 한 서비스의 토큰이 다른 서비스에서 수락되는 것을 방지하기 위해 항상 aud(audience)와 iss(issuer) 클레임을 검증하세요.
  • 토큰 폐기 기능 없음: JWT는 상태 비저장입니다 — 한 번 발급되면 만료될 때까지 유효합니다. 로그아웃, 비밀번호 변경, 계정 침해에 대응하기 위해 토큰 차단 목록(Redis 사용)을 구현하세요.

JWT vs 세션 기반 인증

JWT는 상태 비저장 API, 마이크로서비스 아키텍처, 서버 측 세션 저장이 비실용적인 모바일 앱에 이상적입니다. 세션 기반 인증은 즉각적인 폐기가 필요하고 토큰 갱신 로직을 관리하고 싶지 않은 전통적인 서버 렌더링 웹 앱에 더 적합합니다. 많은 프로덕션 시스템은 하이브리드 접근 방식을 사용합니다: 마이크로서비스 간에는 JWT, 사용자 대면 프론트엔드에는 세션 쿠키입니다.

JWT에 대한 자주 묻는 질문

브라우저에서 JWT 토큰을 디코딩하는 것은 안전한가요?

네, JWT 디코딩은 항상 안전합니다. 헤더와 페이로드는 암호화가 아닌 Base64URL 인코딩만 되어 있기 때문입니다. 토큰을 가진 누구나 내용을 읽을 수 있습니다 — 이것은 의도된 설계입니다. 이 도구는 브라우저에서 완전히 JWT를 디코딩하며, 토큰은 어떤 서버로도 전송되지 않습니다. 이것이 JWT 페이로드에 비밀번호, 개인 키 또는 민감한 비밀을 저장하면 안 되는 이유이기도 합니다.

비밀 키 없이 JWT 서명을 검증할 수 있나요?

아니요. JWT 서명 검증에는 비밀 키(HS256과 같은 HMAC 알고리즘의 경우) 또는 공개 키(RS256, ES256의 경우)가 필요합니다. 키 없이 헤더와 페이로드를 항상 디코딩할 수 있지만, 토큰이 변조되지 않았는지 확인할 수는 없습니다. 서명 검증은 서버 측에서 이루어져야 합니다. 이 도구는 검사를 위해 디코딩된 토큰 내용을 보여주며, 서명 유효성을 확인하지는 않습니다.

JWT 토큰이 예상치 않게 만료되는 이유는 무엇인가요?

JWT 토큰은 exp 클레임을 포함합니다 — 토큰 만료 시점을 나타내는 Unix 타임스탬프입니다. 현재 시간이 이 값을 초과하면 토큰이 거부됩니다. 이것은 보안을 위한 의도된 설계입니다. 여기서 exp 값을 확인하여 토큰이 언제 만료되는지 파악하세요. 토큰이 너무 빨리 만료되면 서버와 클라이언트 간의 시계 오차를 확인하세요 — 몇 분의 차이만으로도 문제가 발생합니다. NTP를 사용하여 서버 시계를 동기화하세요.

JWT 토큰 서명에 어떤 알고리즘을 사용해야 하나요?

대부분의 애플리케이션에는 RS256(RSA + SHA-256)이 권장됩니다. 비대칭 키를 사용하기 때문입니다 — 개인 키로 서명하고 공개 키로 검증하므로 공개 키를 안전하게 공유할 수 있습니다. HS256(HMAC + SHA-256)은 더 간단하지만 토큰을 검증하는 모든 서비스와 비밀 키를 공유해야 합니다. "none" 알고리즘은 절대 사용하지 마세요 — 일부 취약한 구현은 서명되지 않은 토큰을 허용하며, 이는 심각한 보안 결함입니다.

관련 개발자 도구