📌 Description
현재 로그인은 stateless JWT(JwtProvider)만 사용하고, 백엔드에 로그아웃 API가 없습니다.
프론트(AuthProvider.tsx)는 sessionStorage에서 토큰을 지우는 클라이언트 전용 로그아웃만 있고,
서버 쪽 토큰 무효화는 되지 않아 탈취된 토큰이 만료 전까지 계속 유효합니다.
POST /auth/logout
- Authorization: Bearer {token} 필요
- 호출한 토큰을 Redis 블랙리스트에 등록해 만료 전이라도 재사용 불가 처리
무효화 방식: Redis. 토큰의 남은 만료 시간만큼 TTL을 걸어 jti(또는 토큰 해시)를 key로 저장하고,
JwtAuthenticationFilter에서 인증 시마다 블랙리스트 존재 여부를 확인합니다. TTL 만료 시 자동 삭제되어
별도 정리 배치가 필요 없습니다.
✅ To-do
✅ 완료 기준
📒 기타
- 관련 파일:
AuthController.java, JwtProvider.java, JwtAuthenticationFilter.java, AuthProvider.tsx, app/lib/api.ts, docker-compose.yml, build.gradle
- Redis 장애 시 인증 필터 정책(fail-open vs fail-closed)은 구현 시 논의 필요
📌 Description
현재 로그인은 stateless JWT(
JwtProvider)만 사용하고, 백엔드에 로그아웃 API가 없습니다.프론트(
AuthProvider.tsx)는sessionStorage에서 토큰을 지우는 클라이언트 전용 로그아웃만 있고,서버 쪽 토큰 무효화는 되지 않아 탈취된 토큰이 만료 전까지 계속 유효합니다.
무효화 방식: Redis. 토큰의 남은 만료 시간만큼 TTL을 걸어
jti(또는 토큰 해시)를 key로 저장하고,JwtAuthenticationFilter에서 인증 시마다 블랙리스트 존재 여부를 확인합니다. TTL 만료 시 자동 삭제되어별도 정리 배치가 필요 없습니다.
✅ To-do
docker-compose.yml에 redis 서비스 추가 (postgres/minio 옆에 동일 패턴으로)build.gradle에spring-boot-starter-data-redis의존성 추가 및application.yml에 redis 접속 설정 추가JwtProvider에jticlaim 추가 (토큰 고유 식별자)RedisTemplate기반, key=jti, value=userId 등, TTL=토큰 잔여 만료시간)AuthCommandService에 로그아웃 로직 구현 (토큰에서 jti·잔여 만료시간 추출 → 블랙리스트 등록)AuthController에POST /auth/logout추가JwtAuthenticationFilter에서 매 요청마다 블랙리스트 조회 후 걸리면 인증 거부app/lib/api.ts에 로그아웃 API 호출 함수 추가AuthProvider.tsx의logout()이 백엔드 API를 먼저 호출한 뒤 sessionStorage 토큰 제거하도록 변경✅ 완료 기준
📒 기타
AuthController.java,JwtProvider.java,JwtAuthenticationFilter.java,AuthProvider.tsx,app/lib/api.ts,docker-compose.yml,build.gradle