Dev Projects
[table-now] AccessToken 블랙리스트 기반 토큰 무효화 기능 구현
기만나🐸
2025. 4. 22. 10:06
🔍 성능 개선 / 코드 개선 요약
블랙리스트 기반 AccessToken 무효화로 인증 보안 강화
🧩 문제 정의
JWT는 서버가 세션을 관리하지 않는 Stateless 구조입니다. 이는 장점이자 단점이 될 수 있습니다.
- 클라이언트가 가지고 있는 AccessToken은 만료 전까지 항상 유효
- 사용자가 로그아웃하거나 탈퇴해도 기존 AccessToken으로 계속 접근 가능
- 보안 취약점 발생 가능
💡 가설
JWT의 Stateless 특성상, AccessToken을 서버에서 직접 무효화할 수 없습니다.
- AccessToken을 서버에서 명시적으로 차단하려면
- 블랙리스트를 관리해야 합니다
- 인증 필터에서 요청이 들어올 때 블랙리스트에 해당 토큰이 있는지 확인하여 차단
🛠 해결 방안
✔️ 기술 선택 및 구조
- Redis 기반의 블랙리스트 저장소 구현
- 저장 방식:
- Key:
blacklist:<AccessToken>
- Value: 사유 (예: LOGOUT, REFRESH, PASSWORD_CHANGE, WITHDRAW)
- TTL: AccessToken의 남은 유효 시간만큼
- Key:
TTL을 활용해 자동 삭제되므로, 별도 만료 체크 로직 불필요
- 인증 필터인
JwtAuthenticationFilter
에서 블랙리스트 검증 로직 추가
⚙️ 구현 내용
🔑 블랙리스트 등록 대상
- 로그아웃 시
- 토큰 재발급 시
- 비밀번호 변경 시
- 회원 탈퇴 시
🔁 RefreshToken 처리
- Redis에서 삭제 (
delete(key)
) - 쿠키에서도 삭제 (
setMaxAge(0)
적용) - 컨트롤러에서 서비스 성공 후에 쿠키 삭제 수행
https://github.com/spring-team-7/table-now/pull/134
[feat] AccessToken/RefreshToken 인증 처리 개선 및 블랙리스트 기능 구현 by mannaKim · Pull Request #134 · sprin
🔗 Issue Number close #114 close #130 close #132 📝 작업 내역 AccessToken 블랙리스트 Redis 저장 구조 설계 및 등록 처리 JwtAuthenticationFilter에서 블랙리스트 여부 검증 로직 추가 로그아웃 / 토큰 재발급 / 탈
github.com
✅ 결과와 효과
🔐 로그아웃
- 로그인 시:
AccessToken 발급 + RefreshToken은 Redis와 쿠키에 저장
- 로그아웃 시:
AccessToken → Redis 블랙리스트 등록
RefreshToken → Redis + 쿠키에서 삭제
🔄 토큰 재발급
- 기존 AccessToken 블랙리스트 등록
- 기존 RefreshToken 삭제
- 신규 AccessToken + RefreshToken 발급
🔑 비밀번호 변경
- 기존 토큰 모두 폐기 (AccessToken → 블랙리스트, RefreshToken → 삭제)
🗑️ 회원 탈퇴
- 유저 삭제 + 토큰 폐기 완료
🪞 회고
- JWT의 Stateless 구조에서 발생할 수 있는 보안 허점을 실감함
- AccessToken은 만료 전까지 무효화할 수 없다는 단점을, 블랙리스트로 보완할 수 있었음
- 블랙리스트의 TTL 설정을 통해 자동 정리까지 가능하다는 점에서 Redis가 적합한 선택이었음
✅ JWT 기반 인증 구조를 유지하면서도 토큰 무효화를 안전하게 구현할 수 있었다는 점에서 큰 보안적 이득이 있었다.