용어집 · API 테스트
JWT(JSON Web Token)
영어: JWT
다른 이름: JSON Web Token, 제이더블유티, 조트, JWT 토큰
정의
header.payload.signature 형태의 간결한 서명 토큰으로, 사용자 ID, 만료 시간, 대상(audience) 같은 클레임을 담는 JSON Web Token입니다.
JSON Web Token(JWT, 흔히 “조트”라고 발음)은 점으로 구분된 Base64url 인코딩 세 부분으로 이루어진 문자열입니다. 어떻게 서명했는지를 나타내는 헤더, 클레임(claim)을 담은 페이로드, 그리고 서명입니다. API는 보통 Authorization: Bearer <token> 헤더로 JWT를 받고, 서명을 검증해 데이터베이스 조회 없이 클레임을 신뢰합니다. 많은 OAuth 2.0과 OpenID Connect 제공자가 액세스 토큰과 ID 토큰을 JWT로 발급합니다.
예시
디코딩한 페이로드:
{
"iss": "https://auth.example.com",
"sub": "user_7f3a",
"aud": "orders-api",
"role": "member",
"iat": 1767225600,
"exp": 1767229200
}
iss는 발급자(issuer), sub는 주체(subject, 보통 사용자), aud는 의도된 수신자(audience), iat/exp는 Unix epoch 기준 초 단위의 발급 시각과 만료 시각입니다. Node 22에서는 라이브러리 없이 페이로드를 읽을 수 있습니다.
const [, payload] = token.split('.');
const claims = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
암호화가 아니라 인코딩
표준 서명 JWT(JWS)는 암호화된 것이 아니라 인코딩된 것입니다. 위 코드처럼 토큰을 가진 사람이라면 누구나 모든 클레임을 읽을 수 있습니다. 서명은 키를 가진 쪽이 토큰을 발급했고 변조되지 않았다는 것만 증명합니다. 따라서 토큰이 실제로 암호화된 경우(JWE, 별도의 덜 흔한 형식)가 아니라면 JWT 페이로드에 비밀 정보나 개인정보를 절대 넣지 마세요. 토큰을 디코딩하는 것은 검증하는 것과 다릅니다. 토큰을 디코딩만 하는 테스트는 진위에 대해 아무것도 확인하지 않은 것입니다.
테스트할 항목
- 만료된 토큰:
exp가 지나도록 설정하거나 기다린 뒤401을 기대합니다. - 변조된 페이로드:
role을admin으로 바꾸고 기존 서명을 유지한 채401을 기대합니다. 받아들여진다면 서버가 서명을 검증하지 않는 것입니다. alg: none: 서명이 없는 토큰은 반드시 거부되어야 합니다.- 잘못된 audience 또는 issuer: 다른 API용으로 발급된 유효한 토큰이 여기서 동작해서는 안 됩니다.
- 유효한 토큰, 잘못된 권한: 사용자는 인증되었지만 인가되지 않았으므로
401이 아니라403을 기대합니다. - 로그아웃과 폐기(revocation): JWT는 보통 만료될 때까지 유효하므로, 로그아웃이나 비밀번호 변경 후 시스템이 어떻게 처리하는지 확인하세요. 짧은 만료 시간과 리프레시 토큰을 함께 쓰는 것이 일반적인 완화책입니다.