[table-now] AccessToken 블랙리스트 기반 토큰 무효화 기능 구현

2025. 4. 22. 10:06·Dev Projects

🔍 성능 개선 / 코드 개선 요약

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

 

저작자표시 비영리 변경금지 (새창열림)

'Dev Projects' 카테고리의 다른 글

[table-now] 의사결정 기록 - 외부 연동 시스템 예외 처리 강화 리팩토링  (0) 2025.05.23
[table-now] S3 이미지 업로드 - Presigned Url 방식으로 구현하기  (1) 2025.05.23
[table-now] Refresh Token 저장소를 Redis로 교체하며 인증 구조 고도화하기  (0) 2025.04.21
[table-now] 소셜 로그인(Kakao, Naver) 통합 구현기  (1) 2025.04.21
[Spring Data JPA_일정 관리 앱 Develop] 필수 & 도전 기능 구현 기록 🖋️  (1) 2025.02.13
'Dev Projects' 카테고리의 다른 글
  • [table-now] 의사결정 기록 - 외부 연동 시스템 예외 처리 강화 리팩토링
  • [table-now] S3 이미지 업로드 - Presigned Url 방식으로 구현하기
  • [table-now] Refresh Token 저장소를 Redis로 교체하며 인증 구조 고도화하기
  • [table-now] 소셜 로그인(Kakao, Naver) 통합 구현기
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    bootstrap
    GROUP BY
    dp
    greedy
    백트래킹
    다이나믹프로그래밍
    java
    sql
    programmers
    Google Fonts
    DFS
    CSS
    시뮬레이션
    자료구조
    BOJ
    HTML
    Firebase
    프로그래머스
    jQuery
    Subquery
    javascript
    완전탐색
    백준
    join
    BFS
    mysql
    그리디
    jpa
    websocket
    jwt
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[table-now] AccessToken 블랙리스트 기반 토큰 무효화 기능 구현
상단으로

티스토리툴바