JWT는 웹 애플리케이션에서 가장 흔한 인증 토큰 형식입니다. 로그인할 때마다 API는 사용자의 신원, 권한 및 종종 개인 정보를 담은 JSON Web Token을 발급합니다. 문제가 발생할 때 — 만료된 세션, 거부된 요청, 팀원이 “이 토큰에 뭐가 들어있어?“라고 물을 때 — 첫 번째 본능은 이를 디코딩하는 것입니다.
대부분의 온라인 JWT 디코더는 작동합니다. 문제는 토큰을 그들에게 신뢰할 수 있느냐입니다.
JWT에 실제로 들어있는 것
JWT는 점으로 구분된 세 개의 base64url 인코딩된 문자열입니다:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJBbGljZSIsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
첫 두 부분을 디코딩하면 JSON을 얻습니다:
// Header
{
"alg": "HS256",
"typ": "JWT"
}
// Payload
{
"sub": "12345",
"name": "Alice",
"iat": 1516239022
}
서명은 토큰이 비밀을 가진 사람에 의해 발급되었음을 증명하는 암호화 해시입니다. 누구나 페이로드를 디코딩할 수 있습니다 — 그것이 보안 경계가 아닙니다. 보안 경계는 서명을 검증할 수 있는지 여부입니다.
디코딩 대 검증
이 구별이 중요합니다:
- 디코딩 = JSON을 base64 디코딩하여 읽을 수 있게 합니다. 비밀 불필요. 누구나 할 수 있습니다.
- 검증 = 알려진 비밀로 서명을 확인하여 토큰이 변조되지 않았음을 확인합니다. 비밀이 필요합니다.
대부분의 온라인 디코더는 디코딩만 합니다. 헤더와 페이로드를 표시하지만 비밀을 요청하지 않습니다 — 검증하는 것이 아니라 표시만 하기 때문입니다.
디버깅의 경우(이 토큰에 어떤 클레임이 있는지, 언제 만료되는지), 디코딩만으로 충분합니다. 인증의 경우 검증이 필요합니다 — 그리고 이를 제어하는 인프라에서 이루어져야 합니다.
확인해야 하는 표준 JWT 클레임
JWT를 디코딩할 때 이러한 등록된 클레임을 확인하십시오:
| 클레임 | 의미 | 확인할 사항 |
|---|---|---|
exp |
만료 시간 (Unix 타임스탬프) | 미래인지 확인 |
nbf |
시작 전 (Unix 타임스탬프) | 과거인지 확인 |
iat |
발급 시점 (Unix 타임스탬프) | 토큰이 얼마나 오래되었는지 |
iss |
발급자 | 인증 서버와 일치하는지 |
aud |
대상 | API와 일치하는지 |
sub |
주제 (사용자 ID) | 예상 사용자인지 |
“유효한” 토큰이 실패하는 가장 흔한 이유: 만료되었습니다. exp를 먼저 확인하십시오.
브라우저에서 JWT를 디코딩하는 방법
이를 위해 제3자 도구가 필요하지 않습니다. JWT는 세 개의 base64url 문자열일 뿐입니다. 하지만 디코딩 명령을 외우고 싶지 않다면 브라우저 기반 디코더가 토큰을 업로드하지 않고 동일한 작업을 수행합니다:
- 디코더에 JWT를 붙여넣습니다
- 디코딩된 헤더, 페이로드 및 서명을 봅니다
exp클레임을 확인하여 토큰이 만료되었는지 확인합니다- 헤더의 알고리즘이 예상과 일치하는지 확인합니다
DevSpeedTools의 JWT 디코더는 완전히 브라우저에서 실행됩니다. 네트워크 요청 없음, 업로드 없음, 로그 없음. 개발자 도구 → 네트워크를 열고, 토큰을 붙여넣고, 기계를 떠나는 것이 없는지 확인하십시오.
검증이 필요할 때 (디코딩만으로는 불충분한)
인증 문제를 디버깅하고 토큰이 유효한지 — 단순히 내용이 아니라 — 알아야 한다면 서명을 검증해야 합니다. 이는 인증 서버가 사용하는 동일한 비밀 또는 공개 키로 이루어져야 합니다.
웹사이트에 비밀을 붙여넣지 않는 옵션:
- Node.js:
jsonwebtoken.verify(token, process.env.JWT_SECRET) - Python:
jwt.decode(token, key, algorithms=['HS256']) - Go:
token, err := jwt.Parse(tokenString, keyFunc) - CLI:
jwt-cli(Rust) 또는pyjwt의 원라이너
프로덕션 비밀을 온라인 도구에 붙여넣지 마십시오. 토큰은 비밀이 아닙니다. 내용은 종종 그렇습니다.
핵심 요약
- 빠른 검사를 위해 브라우저 기반 디코더를 사용하십시오. 업로드 없음, 유출 없음.
- 검증을 위해 CLI 또는 자체 코드를 사용하십시오. 웹사이트에 비밀을 절대 붙여넣지 마십시오.
exp를 먼저 확인하십시오 — 만료된 토큰이 대부분의 “토큰이 작동하지 않아요” 문제의 원인입니다.