이게 뭔가요?
JWT(JSON Web Token)는 점(.)으로 구분된 세 부분 — 헤더, 페이로드, 서명 — 으로 이뤄진 인증 토큰입니다. 앞의 두 부분은 base64url로 인코딩된 JSON일 뿐이라 누구나 내용을 읽을 수 있습니다. 이 도구는 토큰을 붙여넣으면 헤더와 페이로드를 보기 좋은 JSON으로 풀어주고, exp(만료) 값을 사람이 읽는 시각으로 바꿔 만료 여부까지 표시합니다. 서명 검증은 하지 않으며, 비밀키 없이 브라우저 안에서 디코딩만 합니다.
언제 쓰나요?
로그인 토큰에 어떤 클레임(사용자 ID, 권한, 만료 시각)이 들어 있는지 확인할 때, “왜 401이 뜨지?” 하며 토큰이 만료됐는지 볼 때, 또는 백엔드가 넣어준 커스텀 클레임을 프론트에서 확인할 때 씁니다.
실무에서 자주 틀리는 점
- 디코딩 ≠ 검증. 페이로드를 읽을 수 있다고 신뢰해서는 안 됩니다. 서명 검증 없이 클레임을 믿으면 위조 토큰에 당합니다. 검증은 반드시 서버에서 비밀키로 해야 합니다.
- 민감 정보 저장. 페이로드는 누구나 읽으므로 비밀번호나 개인정보를 넣으면 안 됩니다.
- exp 단위.
exp·iat는 초 단위 Unix 타임스탬프입니다. 밀리초로 비교하면 항상 만료로 판정됩니다. - 알고리즘 none.
alg: none을 허용하는 취약한 검증 구현은 서명을 통째로 무력화합니다.
실무에서 — 401이 계속 떠서 서버 로그를 뒤졌는데, 결국 토큰의
exp가 이미 지나 있었던 게 원인이었다. 디코더에 넣어 만료 시각을 사람이 읽는 날짜로 보고 나서야 명확해졌다. 또 한번은 다른 팀 토큰의 페이로드에 사용자 이메일과 권한이 그대로 들어 있는 걸 보고, “페이로드는 누구나 읽는다”는 걸 리뷰 때 강하게 짚었다.