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의 남은 유효 시간만큼

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 기반 인증 구조를 유지하면서도 토큰 무효화를 안전하게 구현할 수 있었다는 점에서 큰 보안적 이득이 있었다.