JWT(JSON Web Token) 완벽 가이드
JWT는 RFC 7519에 정의된 토큰 형식으로, 서버와 클라이언트 간 인증·인가 정보를 안전하게 주고받는 표준입니다. 세션 ID와 달리 자체에 정보를 담고 있어 서버가 별도 저장소를 두지 않아도 검증할 수 있는 'stateless' 인증을 가능하게 합니다.
JWT 구조 (header.payload.signature)
- Header: 알고리즘과 토큰 유형.
{"alg":"HS256","typ":"JWT"} - Payload: 클레임(Claim) 정보. 사용자 ID, 권한, 만료시간 등을 담음
- Signature: 헤더와 페이로드를 비밀키로 서명한 값. 위변조를 막음
- 세 부분을 점(.)으로 연결해
aaa.bbb.ccc형식으로 표현
주요 Claim 종류 (Registered Claims)
iss(Issuer): 발급자sub(Subject): 주제 (보통 사용자 ID)aud(Audience): 대상exp(Expiration): 만료 시각 (Unix Timestamp)nbf(Not Before): 활성화 시각iat(Issued At): 발급 시각jti(JWT ID): 고유 식별자 (중복 사용 방지)
서명 알고리즘
- HS256: HMAC-SHA-256. 대칭키 방식. 단일 서비스 내부 인증에 가장 흔히 사용
- HS384/HS512: HMAC의 더 긴 해시 변종
- RS256: RSA-SHA-256. 비대칭. OAuth/OpenID Connect에서 표준
- ES256: ECDSA-SHA-256. 더 짧은 키로 동일한 보안
JWT 보안 베스트 프랙티스
- HTTPS 필수 — 토큰 탈취 방지
- Payload에 비밀번호·주민번호 등 민감정보 절대 넣지 말 것 (Base64는 암호화가 아닌 인코딩)
- 충분히 긴 Secret 사용 (HS256은 최소 256비트)
- 짧은
exp(15분~1시간) + Refresh Token 패턴 alg: none공격 방어: 라이브러리 설정에서 명시적으로 알고리즘 화이트리스트 설정- 로그아웃 처리: 서버 측 블랙리스트 또는 짧은 TTL
자주 묻는 질문 (FAQ)
Q. 입력한 Secret이 외부로 전송되나요?
A. 전송되지 않습니다. 모든 서명 계산은 브라우저의 Web Crypto API로 이루어지며, 네트워크 요청을 보내지 않습니다.
Q. RS256(비대칭 서명)도 지원하나요?
A. 본 도구는 HMAC 계열(HS256/384/512)만 지원합니다. RS256은 PEM 형식의 개인키 파싱이 필요해 별도 도구를 권장합니다.
Q. JWT는 암호화되나요?
A. 기본 JWT는 서명만 합니다. Payload는 누구나 Base64로 디코딩해 볼 수 있습니다. 암호화가 필요하면 JWE(JSON Web Encryption)을 사용하세요.
Q. 토큰을 검증하는 쪽 코드는?
A. Node.js는 jsonwebtoken, Python은 pyjwt, Java는 java-jwt, Go는 github.com/golang-jwt/jwt 같은 표준 라이브러리를 사용하세요.