SomeeLab.tools

JWT 디코더

JSON Web Token의 헤더와 페이로드를 읽고 만료 시각을 확인합니다. 가입 없이 브라우저에서 바로 해석됩니다.

서명은 보여주기만 하고 검증하지 않습니다. 검증하려면 서명 키가 필요한데, 서명 키를 웹페이지에 넣어서는 안 되기 때문입니다. 디코딩은 누가 발급했는지를 증명해 주지 않습니다.

토큰 안에 무엇이 들어 있나

JWT는 점으로 나뉜 세 조각입니다. 앞의 두 조각은 Base64url로 인코딩된 JSON이라 누구나 읽을 수 있고, 세 번째 조각이 서명입니다.

  • 헤더 — 서명 알고리즘(alg)과 종류(typ)가 들어갑니다. 키를 여러 개 돌려 쓰는 서비스라면 어떤 키로 서명했는지 가리키는 kid도 있습니다.
  • 페이로드 — 클레임이 담깁니다. sub는 사용자 식별자, iss는 발급자, aud는 이 토큰을 받도록 정해진 대상, exp·iat·nbf는 시각입니다.
  • 서명 — 앞 두 조각을 키로 서명한 값입니다.

시각 클레임은 초 단위 정수라고 규격이 정해 두었습니다. 밀리초로 넣은 토큰은 이 도구에서 수천 년 뒤로 보이는데, 그건 토큰을 만든 쪽의 실수입니다.

디코딩과 검증은 다릅니다

여기서 내용을 읽었다는 것은 그 토큰이 진짜라는 뜻이 아닙니다. 페이로드는 잠겨 있지 않아 누구나 바꿔 쓸 수 있고, 서명이 어긋나는지는 키를 가진 쪽만 알 수 있습니다.

그래서 서버는 매 요청마다 서명을 검증해야 합니다. 이때 헤더의 alg 값을 그대로 믿어서는 안 됩니다. 검증에 쓸 알고리즘은 서버가 미리 정해 두고, algnone이거나 예상과 다르면 거절해야 합니다. 이 값을 그대로 따르는 구현은 서명 없는 토큰을 통과시키는 고전적인 취약점을 만듭니다.

페이로드에 비밀을 넣지 마세요

브라우저 개발자 도구에 토큰 한 줄만 있으면 페이로드는 그대로 드러납니다. 주민등록번호, 내부 관리자 메모, 결제 정보가 들어 있다면 그것은 이미 공개된 것입니다.

담아도 되는 것은 사용자 식별자, 권한 이름, 만료 시각처럼 상대가 봐도 무방한 값뿐입니다. 나머지는 서버에 두고 필요할 때 조회하세요.

남의 토큰을 붙여넣기 전에

이 도구는 토큰을 서버로 보내지 않습니다. 다만 유효기간이 남은 토큰은 그 자체로 로그인 자격증명이므로, 채팅방이나 이슈 트래커에 붙여넣으면 그 순간 다른 사람이 쓸 수 있게 됩니다. 실수로 공유했다면 만료를 기다리지 말고 해당 세션을 무효화하세요.