📓뉴스피드 API Github
JWT 로그아웃 기능
최초 설계
- 프론트엔드 없이 백엔드만 구현하던 초기에는 Access 토큰을 제어하기 어렵다고 판단
- 따라서 Refresh 토큰만 쿠키와 DB에서 삭제하는 방식으로 로그아웃을 처리하였다
문제점
- 토큰의 역할이 불명확해짐
- Access 토큰은 원래 인증/인가에 사용되어야 하며
- Refresh 토큰은 Access 토큰 재발급에만 사용되어야 함
- 그러나 초기 설계에서는 Refresh 토큰이 인증에도 사용되는 구조가 되어 보안적으로 부적절했다
- 인증 흐름의 혼란성
- 실질적으로 인증이 Refresh 토큰 중심으로 동작하여, 만료, 유효성, 로그아웃 처리 등에서 의도치 않은 동작이 발생할 수 있는 구조였다
해결
- 토큰 저장 위치 분리
- Access 토큰:
Authorization 헤더에 저장
- Refresh 토큰: 쿠키에 저장
- 인증 방식 개선
- 인증 및 인가는 Access 토큰만 사용
- 필터에서 Access 토큰의 유효성, 만료, 무효 여부를 검사
- 로그아웃 처리 방식 변경
- Refresh 토큰
- 클라이언트의 쿠키에서 제거
- 서버의 DB에서도 삭제
- Access 토큰
- 로그아웃 시 해당 토큰을 Blacklist DB에 저장
- 이후 인증 필터에서 Blacklist에 등록된 토큰인지 검사
- 등록되어 있다면 유효하지 않은 토큰으로 간주하여 인증 실패 처리