728x90
반응형
728x90
블랙리스트란?
더 이상 유효하지 않다고 판단된 JWT 토큰을 별도의 저장소 (DB, Redis 등)에 저장해 놓고, 이 토큰이 사용되는 요청을 차단하는 방식입니다.
JWT는 기본적으로 서버가 상태를 저장하지 않기 때문에 일반적으로는 발급된 토큰이 만료되기 전까지는 유효하다고 간주됩니다. 블랙리스트를 도입함으로써 만료되기 전 토큰을 강제로 무효화할 수 있게 됩니다.
📌 Access Token 블랙리스트 전략
Access Token은 보통 짧은 만료 시간을 갖고 있으며 요청마다 첨부되어 리소스에 접근하는 데 사용됩니다.
등록 방식
- 로그아웃 시 또는 토큰 탈취가 감지되었을 때 해당 토큰을 블랙리스트에 저장
- 클라이언트가 요청을 보낼 때마다 블랙리스트를 조회하여 해당 토큰이 유효한지 확인
✅ 장점
- 탈취된 토큰이라도 블랙리스트에 등록되어 있다면 사용을 차단할 수 있음
- 유저가 로그아웃하거나 계정이 해킹된 경우 즉시 차단 가능
- 평균적으로 Access Token의 만료 시간이 짧아 DB 메모리 내 보관 시간이 짧음 → 메모리 공간 차지가 덜함
⚠️ 단점
- Access Token은 요청마다 사용되기 때문에 매 요청마다 블랙리스트 저장소에 접근해야 함 → 성능 저하
- 사용자 수가 많고 요청이 빈번할수록 블랙리스트 조회가 시스템 병목이 될 가능성이 있음
📌 Refresh Token 블랙리스트 전략
Refresh Token은 보통 긴 만료 시간을 갖고 있으며 Access Token을 갱신하는 데 사용됩니다.
등록 방식
- 로그아웃 또는 이상 행위 감지 시, 해당 Refresh Token을 블랙리스트에 등록
- 새로운 Access Token을 발급할 때만 블랙리스트를 확인하고 등록되어 있지 않다면 Access Token 발급
✅ 장점
- Refresh Token은 Access Token에 비해 비교적 덜 사용되므로 블랙리스트 확인(DB 접근) 비용이 적음
- 해킹 시에도 리프레시 과정에서 차단 가능 → 실제 만료 이전 강제 만료
⚠️ 단점
- Refresh Token이 블랙리스트에 올라갔다고 해도 이미 발급된 Access Token은 유효 → Access Token은 자연 만료
- Refresh Token의 탈취는 막을 수 있으나 Access Token이 탈취된 경우 만료 시간 전까지 차단 불가
- Access Token에 비해 만료 시간이 길기 때문에 블랙리스트 DB에 데이터로 머물게 되는 기간이 상대적으로 김 → 메모리 공간 차지가 많아질 수 있음
비교
전략 | 장점 | 단점 | 메모리 효율 | 성능 영향 |
Access Token | 탈취 대응 가능, 짧은 TTL -> 공간 효율적 | 요청마다 블랙리스트 조회 필요 | 좋음 (짧은 생명주기) | 높음 |
Refresh Token | 요청 빈도 낮음, 갱신 시만 확인 | 오래 남아 있음 -> 공간 차지 큼 | 낮음 (긴 생명주기) | 낮음 |
전략 선택 기준
🔐 보안이 매우 중요한 시스템
- Access Token 블랙리스트 적용
- 탈취 시 즉시 무효화 가능
- 사용자 로그아웃, 기기 강제 로그아웃 등 요구사항 충족
- Redis 등 인메모리 저장소로 성능 보안
- 토큰 TTL 짧게 설정
- 보안 > 성능 → 유출 시 금전적 손해가 발생할 수 있는 시스템
💻 보안보다 성능과 확장성이 더 중요한 시스템
- Refresh Token 블랙리스트 적용
- Access Token은 TTL을 짧게 설정해 자연 만료로 해결
- Refresh Token은 블랙리스트로 관리해 성능 저하 방지
- 대부분 Refresh Token 차단으로 충분한 경우
- 성능 > 보안 → 트래픽이 많은 오픈 플랫폼
💡 혼합 전략
- 기본적으로 Refresh Token만 블랙리스트 처리
- Access Token도 위험 상황에서만 블랙리스트 등록
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] Spring AOP 주의 사항 정리 (1) | 2024.11.12 |
---|---|
[Spring] Spring AOP - Pointcut (2) | 2024.11.10 |
[Spring] AOP - Aspect-Oriented Programming 개념 (0) | 2024.11.08 |
[Spring] 빈 후처리기 - BeanPostProcessor (0) | 2024.11.07 |
[Spring] ProxyFactory (1) | 2024.11.06 |