JWT.io: 아무것도 설치하지 않고 인증 토큰을 즉시 디코딩하기

· nologin.tools
tools review development security

Hero image

많은 개발자들이 놀라는 사실이 하나 있어요. 인증 서버에서 받는 JWT는 기본적으로 암호화되지 않아요. 단지 서명만 되어 있을 뿐이에요. 즉, 헤더와 페이로드는 누구나 읽을 수 있는 평범한 Base64 인코딩 텍스트예요. 토큰의 무결성을 보장하는 건 오직 서명뿐이고, 이 서명이 변조되지 않았음을 증명해요.

이걸 알고 나면, 모든 개발자가 JWT 내용을 빠르게 확인할 방법을 갖고 있어야 한다고 생각하겠죠. 하지만 현실에서는 새벽 2시에 이상한 401 Unauthorized 에러가 뜨면, 대부분의 사람들이 새 파일을 열고 atob() 를 작성하고 점으로 나누고 JSON을 수동으로 파싱하려 해요. 훨씬 빠른 방법이 있는데도 말이에요.

JWT.io가 바로 그 빠른 방법이에요. 딱 한 가지 일을 잘 해요. JWT를 붙여넣으면 즉시 내용을 확인하고, 서명을 검증하고, 구조를 이해할 수 있어요. 계정 불필요, 설치 불필요, 디코딩은 모두 브라우저에서 이루어져요.

JSON Web Token이란?

도구를 보기 전에, 실제로 무엇을 디코딩하는지 이해하는 게 도움이 돼요.

JSON Web Token은 두 당사자 사이에서 클레임을 표현하기 위한 간결하고 URL 안전한 문자열이에요. 실제로는 로그인 후 서버가 건네주는 것으로, 이후 모든 요청에 신원 증명으로 포함시켜요. 대부분의 REST API와 싱글페이지 앱이 이를 사용해요.

JWT는 점으로 구분된 세 부분으로 구성돼요.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • 헤더 (첫 번째 세그먼트): 알고리즘과 토큰 타입 — 예: {"alg": "HS256", "typ": "JWT"}
  • 페이로드 (두 번째 세그먼트): 실제 클레임 — 사용자 ID, 역할, 만료 시간, 앱이 담는 모든 것
  • 서명 (세 번째 세그먼트): 앞 두 세그먼트에 대한 HMAC 또는 RSA 서명

헤더와 페이로드는 Base64URL 인코딩되어 있을 뿐, 암호화되지 않아요. 토큰을 가로채는 누구든 이 두 부분을 읽을 수 있어요. 변조를 막는 건 서명이에요. 비밀 키 없이는 유효한 서명을 위조할 수 없어요.

그래서 개발 및 디버깅 중에 JWT를 빠르게 읽을 수 있는 게 중요해요. 페이로드에 올바른 클레임이 있는지, 만료(exp) 타임스탬프를 확인하고, 알고리즘이 백엔드의 기대와 일치하는지 검증하고 싶으니까요.

JWT.io 사용법

jwt.io를 방문하면 바로 디버거로 이동해요. 랜딩 페이지도, 마케팅도, 회원가입 유도도 없어요. 왼쪽에는 인코딩된 토큰을 붙여넣는 큰 텍스트 영역이 있고, 오른쪽에는 디코딩된 헤더, 페이로드, 서명 검증 섹션을 보여주는 세 개의 컬러 패널이 있어요.

왼쪽 패널에 JWT를 붙여넣으면 디코딩된 결과가 즉시 나타나요. 패널은 색상으로 구분돼요. 헤더 부분은 빨간/핑크색, 페이로드는 보라색, 서명은 파란색으로, 입력의 점으로 구분된 각 세그먼트의 색상과 일치해요.

페이로드 패널에는 한눈에 읽을 수 있도록 포맷된 JSON으로 클레임이 표시돼요.

{
  "sub": "user_8f3a2c",
  "email": "[email protected]",
  "role": "admin",
  "iat": 1742568000,
  "exp": 1742654400
}

서명 검증의 경우, HMAC 알고리즘(HS256 등)은 비밀 키를 입력하고, RS256이나 ES256은 공개 키를 붙여넣어요. 도구는 “Signature Verified” 또는 “Invalid Signature” 인디케이터를 보여줘요. 서비스 간 연동 작업 중에 정말 유용해요. 예상한 키로 토큰이 서명되었는지 확인하는 게 몇 초 만에 가능하거든요.

클라이언트 사이드 처리가 중요한 이유

인증 토큰을 무작위 웹 도구에 붙여넣는 건 실제 보안 위험이에요. 많은 “온라인 도구”들은 토큰을 서버로 전송하고, 로그를 남기고, 잠재적으로 외부에 노출시켜요. 개발자들이 신중한 건 당연해요.

JWT.io는 달라요. 모든 디코딩과 검증은 JavaScript를 사용해 브라우저에서 실행돼요. 토큰을 디코딩할 때 외부 서버로 데이터가 전송되지 않아요. 직접 확인해볼 수 있어요. 브라우저의 네트워크 탭을 열고, 토큰을 붙여넣고 지켜보세요. 네트워크 요청이 전혀 발생하지 않아요.

이건 마케팅 주장이 아니라 검증 가능한 동작이에요. 도구는 오픈 소스이고, 클라이언트 사이드 처리 아키텍처 덕분에 토큰이 내 기기에 머물러요.

그렇긴 해도 실용적인 보안 참고 사항을 기억해 두세요. 공유 또는 신뢰할 수 없는 컴퓨터에서는 민감한 사용자 데이터가 포함된 프로덕션 토큰을 어떤 웹 도구에도 붙여넣지 마세요. 개발, 스테이징, 테스트 토큰이라면 JWT.io를 완전히 안전하게 사용할 수 있어요.

지원하는 알고리즘

JWT.io는 실제 시스템에서 만날 수 있는 알고리즘의 전 범위를 지원해요.

알고리즘타입주요 사용처
HS256 / HS384 / HS512HMAC + SHA단일 서비스 앱, 공유 시크릿
RS256 / RS384 / RS512RSA 서명분산 시스템, 공개 키 검증
ES256 / ES384 / ES512ECDSA컴팩트 토큰, IoT
PS256 / PS384 / PS512RSA-PSS높은 보안 요구 사항

HMAC 알고리즘은 공유 시크릿을 제공해 서명을 검증해요. 비대칭 알고리즘(RS*, ES*, PS*)은 PEM 형식의 공개 키를 붙여넣으면 돼요. 도구가 파싱을 처리하고 즉시 결과를 표시해요.

실제 활용 사례

인증 실패 디버깅: 사용자가 보호된 경로에 접근할 수 없다고 보고할 때, 첫 번째 질문은 보통 “그들의 토큰에 실제로 뭐가 있지?”예요. JWT.io에서 디코딩하는 데 3초도 안 걸려요. 토큰이 만료되었는지, 역할 클레임이 올바르게 설정되어 있는지, 오디언스(aud)가 API의 기대와 일치하는지 확인할 수 있어요.

인테그레이션 테스트: Auth0, Okta, Cognito, Keycloak 같은 서드파티 ID 프로바이더에 연결할 때, 그들이 발행하는 토큰에는 자체 사용자 모델에 매핑해야 하는 클레임이 있을 수 있어요. 샘플 토큰을 디코딩하면 코드를 작성하기 전에 어떤 필드가 있는지 정확히 확인할 수 있어요.

학습과 온보딩: 인증이 처음인 개발자에게 JWT.io는 훌륭한 교육 도구예요. 인코딩된 문자열 옆에 디코딩된 페이로드가 표시되면 Base64URL 인코딩이 추상적인 게 아니라 구체적으로 느껴져요. 처음 사용할 때 “아하!” 모먼트가 오는 도구예요.

빠른 사전 확인: 토큰 생성 코드 변경을 배포하기 전에, 예제 출력을 JWT.io에 붙여넣어 페이로드에 올바른 필드가 올바른 형식으로 포함되어 있는지 확인하세요.

더 무거운 API 작업——요청 작성, 엔드포인트 테스트, 컬렉션 관리——을 하는 팀에는 Hoppscotch가 JWT.io와 잘 어울려요. Hoppscotch에서 인증 엔드포인트의 토큰을 가져와 JWT.io에서 클레임을 확인한 다음, 후속 요청에 그 토큰을 사용하는 식이에요. 두 도구는 브라우저만 사용하는 워크플로에서 서로를 보완해요.

접근법 비교

JWT.io가 등장하기 전에(또는 개발자가 모를 때) 몇 가지 대안이 있어요.

수동 Base64 디코딩: 토큰을 .로 분리하고, 브라우저 콘솔에서 각 세그먼트에 atob()를 실행하고, JSON을 파싱해요. 작동하지만 더 오래 걸리고, URL 안전 Base64 변형을 처리하기가 어색하며, 서명 검증도 안 돼요.

빠른 스크립트 작성: JWT 라이브러리를 가져와 검증 호출을 작성하는 건 프로덕션 코드에는 좋지만, 빠른 디버그 세션에는 과해요. 로컬 환경도 설정되어 있어야 해요.

다른 온라인 디코더: 몇 가지가 있지만, 많은 것들이 서명을 검증하지 않거나, 전체 알고리즘 범위를 지원하지 않거나, 토큰을 백엔드로 전송해요. JWT.io의 전체 알고리즘 지원, 클라이언트 사이드 처리, 명확한 시각적 출력의 조합은 이기기 어려워요.

일반적인 인코딩과 데이터 변환 작업——Base64, 16진수, URL 인코딩, 수백 가지 다른 것들——에는 IT Tools를 JWT.io와 함께 북마크할 가치가 있어요. 마찬가지로 로그인 불필요의 브라우저 기반 도구로, 일상적인 개발 작업에 유용한 다양한 유틸리티를 제공해요.

JWT 사양에 대해

JWT는 RFC 7519에 정의되어 있으며, 서명 알고리즘은 RFC 7515 (JWS)에서 다뤄요. 특정 클레임이 왜 존재하는지, 바이트 수준에서 인코딩이 어떻게 작동하는지 이해하고 싶다면, 이 문서들이 권위 있는 출처예요.

사양이 명확히 하는 한 가지가 있어요. JWT는 형식이지, 보안 프로토콜이 아니에요. JWT를 사용한다고 자동으로 인증이 안전해지지 않아요. 짧은 만료 시간, 적절한 서명 검증, alg 필드의 신중한 처리(알고리즘 혼동 공격 방지)는 모두 여전히 개발자의 책임이에요. JWT.io는 토큰을 빠르게 확인하고 검증하는 데 도움을 주지만, 중요한 버그를 방지하는 건 사양을 이해하는 거예요.

디버거 그 이상

JWT.io 사이트에는 Node.js, Python, Go, Java, Ruby, PHP, .NET 등 모든 주요 프로그래밍 언어에 대한 JWT 라이브러리 목록도 유지되고 있어요. 각 라이브러리 목록에는 지원하는 알고리즘에 대한 검증된 정보가 포함되어 있어요. 새 프로젝트를 위한 라이브러리를 선택할 때, 이 레퍼런스 페이지가 문서 사이트를 왕복하는 수고를 덜어줘요.

디버거 자체가 주요 매력이지만, 라이브러리 디렉터리는 JWT 처리를 처음부터 설정할 때 유용한 보조 리소스예요.


다음번에 불투명한 토큰 문자열을 보며 안에 뭐가 있는지 궁금할 때, jwt.io에 붙여넣어 보세요. 디코딩된 결과가 보통 10초 이내에 답을 줘요. 계정 불필요, 아무것도 설치하지 않아도 되고, 서버로 아무것도 전송되지 않아요.

더 많은 서비스가 토큰 기반 인증과 분산 시스템으로 전환하면서——공유 세션 없이 신뢰를 확립해야 하는——JWT.io 같은 도구는 가끔 참고하는 것이 아닌 일상적인 툴킷의 일부가 되고 있어요. 지금 북마크해 두세요. 생각보다 빨리 사용하게 될 거예요.