🔥 JWT(Json Web Token) 정리
https://www.jwt.io/introduction#how-json-web-tokens-work
1️⃣ 개요
JWT(Json Web Token) 는 클라이언트와 서버 간에 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식입니다.
이는 RFC 7519 에 정의된 개방형 표준(Open Standard) 입니다.
JWT는 JSON 형식의 데이터를 Base64URL로 인코딩하고, 디지털 서명(Signature) 을 통해 위변조를 방지합니다.
2️⃣ JWT의 구조
JWT는 .
(점) 으로 구분된 3개의 부분으로 구성됩니다.
xxxxx.yyyyy.zzzzz
구분 | 이름 | 설명 |
---|---|---|
1 | Header | 토큰의 타입(JWT)과 서명 알고리즘(HS256, RS256 등)을 명시 |
2 | Payload | 사용자 정보나 클레임(Claims)을 포함 |
3 | Signature | Header와 Payload를 비밀키로 서명하여 위변조 방지 |
예시
// Header (헤더) Header: { "alg": "HS256", "typ": "JWT" } // Payload (페이로드) - 클레임(Claim) Payload: { "sub": "1234567890", // 주제 (Subject) "name": "John Doe", // 사용자 이름 "admin": true, // 역할 "iat": 1516239022, // 발행 시간 (Issued At) "exp": 1516242622 // 만료 시간 (Expiration) } // Signature (서명) Signature: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
결과
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9. TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
3️⃣ JWT의 동작 방식
1. 사용자가 로그인 요청을 전송
2. 서버는 사용자의 인증 정보(아이디, 비밀번호 등)를 검증
3. 인증에 성공하면 JWT 토큰을 생성하여 클라이언트에게 발급
4. 클라이언트는 이후 요청마다 Authorization 헤더에 토큰을 포함
Authorization: Bearer <JWT_TOKEN> ## 예시 Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiIxIiwidW5pcXVlX25hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZGVtby5jb20iLCJMb2dpblRpbWUiOiIyMDI1LTEwLTEyVDIyOjEwOjMwLjY3NDg3ODVaIiwicm9sZSI6WyJBZG1pbiIsIlVzZXIiXSwibmJmIjoxNzYwMzA3MDMwLCJleHAiOjE3NjAzMTA2MzAsImlhdCI6MTc2MDMwNzAzMCwiaXNzIjoibHljb3M3NTYwLmNvbSIsImF1ZCI6Ik15QXVkaWVuY2UifQ.Vo2eV6JLLJLg_qBvfalPZI87n8UVQRCn5mAAhRjDnuU
5. 서버는 요청을 받을 때마다 JWT 토큰의 유효성(Signature 및 만료 시간) 을 검증
6. 유효한 경우 요청을 처리하고, 그렇지 않으면 401 Unauthorized 응
4️⃣ JWT의 장점과 단점
장점 | 설명 |
---|---|
✅ 확장성 | 세션을 서버 메모리에 저장하지 않아도 되므로, 서버 확장에 유리 |
✅ 무상태성 | 서버가 사용자 상태를 기억하지 않아도 됨 (Stateless) |
✅ 범용성 | 웹, 모바일, API 등 다양한 환경에서 동일한 인증 방식 사용 가능 |
단점 | 설명 |
---|---|
⚠️ 토큰 무효화 어려움 | 만료 전까지 유효 → 즉시 로그아웃 구현 어려움 |
⚠️ 보안 주의 필요 | 비밀키 유출 시 전체 시스템 위험, XSS/CSRF 취약 |
⚠️ 크기 문제 | 세션 ID보다 커서 네트워크 트래픽 증가 가능, 매 요청마다 JWT 토큰 전송 → 트래픽 증가 |
5️⃣ JWT의 주요 Claim
Claim | 설명 |
---|---|
iss | 토큰 발급자 (Issuer) |
sub | 토큰 제목 / 사용자 식별자 (Subject) |
aud | 토큰 대상자 (Audience) |
exp | 만료 시간 (Expiration Time) |
nbf | 이 시간 이전에는 유효하지 않음 (Not Before) |
iat | 토큰 발급 시간 (Issued At) |
jti | JWT 고유 식별자 (JWT ID) |
6️⃣ Refresh Token 전략
Access Token의 수명이 짧기 때문에, Refresh Token을 사용해 재발급하는 구조가 일반적입니다.
구분 | 역할 |
---|---|
Access Token | 짧은 만료 시간(5~30분) → 요청 인증용 |
Refresh Token | 긴 만료 시간(1~14일) → 새로운 Access Token 발급용 |
1. 로그인 시 Access Token + Refresh Token 발급
2. Access Token 만료 시 Refresh Token으로 갱신 요청
3. 서버는 Refresh Token 검증 후 새로운 Access Token 발급
4. Refresh Token 탈취 시 위험하므로 DB나 Redis에 저장해 관리
⚠️ Refresh Token 탈취 시 장기 인증이 노출될 수 있으므로, IP / User-Agent 기반 검증 또는 토큰 회전(Token Rotation) 권장
7️⃣ JWT 사용 시 보안 주의사항
✅ HTTPS 필수 사용 (평문 노출 방지)
✅ Authorization 헤더 사용 (쿠키보다 안전)
✅ 짧은 만료 시간 + Refresh Token 병행
✅ 민감정보(비밀번호 등)는 Payload에 절대 포함 금지
✅ IP, User-Agent 등 부가 정보 검증 가능
✅ HttpOnly Cookie + Secure 옵션으로 XSS 방지
✅ 서명키(secret) 는 .env 또는 KeyVault 등 안전한 저장소 사용
✨ 결론
JWT는 확장성과 무상태성을 제공하는 강력한 인증 수단이지만, 보안 관리(비밀키, 만료, 저장 위치 등) 가 핵심입니다.
실제 운영환경에서는 Access/Refresh Token 분리 + HTTPS + 짧은 만료를 조합해 안전하고 효율적인 인증 시스템을 구축해야 합니다.