JWT는 서버가 인증 상태를 저장하지 않는 stateless 구조이기 때문에, 한 번 발급된 토큰이 유출되면 해당 유저의 권한으로 계속 요청이 가능하다는 단점이 있다.
| 방법 | 설명 |
|---|---|
| 1. 짧은 만료 시간 (access token) | 탈취되더라도 짧은 시간 내 만료되도록 설정 |
| 2. Refresh Token 분리 사용 | access token은 짧게, refresh token은 HttpOnly 쿠키에 저장 |
| 3. HttpOnly / Secure 쿠키 사용 | JS 접근 차단(XSS 방지), HTTPS 전송으로 중간자 공격 방지 |
| 4. SameSite 쿠키 설정 | CSRF 공격 방어 |
| 5. Token 블랙리스트 (서버에서 예외 처리) | 탈취되었거나 로그아웃한 토큰을 서버에서 차단 (비용 있음) |
| 6. 토큰 내부 정보 최소화 | 민감한 정보는 절대 넣지 않기 (예: 패스워드, 권한 전체 등) |
| 7. 발급 시 IP/UA 바인딩 | 클라이언트 환경 기반 제약으로 탈취 후 재사용 어려움 (옵션) |
→ JWT는 탈취 시 서버가 상태를 모른다는 단점이 있기 때문에, 보통은 access token을 짧게 쓰고, refresh token은 HttpOnly 쿠키에 저장해서 보완합니다. 필요에 따라 서버 측 블랙리스트나 IP 바인딩도 적용할 수 있습니다.