상황 : 만료되지 않은 Access Token과 Refresh Token
JWT 토큰 기반의 인증-인가 방식에서 로그아웃을 구현하던 도중, 만료되지 않은 인증 토큰을 어떻게 처리해줘야하나? 하는 고민이 들었다. Access Token의 만료 기간이 3시간인데, 사용자가 1시간 사용했다가 로그아웃을 하는 상황을 가정해보자. 해당 Access Token은 더 이상 사용할 수 없어야 하지만, 유효 시간은 2시간이 남아있다. Refresh Token의 경우에도 마찬가지이다. 이런 경우 어떻게 처리해줘야 할지 고민이 들었고, 찾다 보니 Redis에 토큰을 저장해둠으로써 문제를 해결한 사례가 있었다.
해결 : 블랙리스트 만들기
Redis를 활용해 이미 사용을 다 한(=로그아웃 된) 토큰을 저장하는 블랙리스트를 만든다.
로그아웃 된 Access Token과 Refresh Token을 Redis에 담아두고 요청마다 블랙리스트에 포함된 토큰이라면 에러 코드를 보내준다.
해당 토큰들의 만료 기간을 토큰 발급 시의 유효기간으로 설정해두고, 유효기간이 지나면 Redis에서 삭제가 되게 구현한다.
장점
토큰 탈취 시 보안을 확보할 수 있다. 토큰은 탈취에 대한 위험이 항상 존재하기 때문에, 해당 방법으로 토큰 방식의 근본적인 문제점을 해결할 수 있다.
단점
이렇게 되면 세션 인증 방식과 개념 상으로 차이가 없어진다. 토큰을 사용하는 장점 - DB Connection Pool을 줄여 성능 개선 - 이 사라지게 된다.
결론
블랙리스트는 이미 JWT 토큰 인증 방식이 적용된 상태에서의 보완책이 될 수 있다는 의의가 있다. 단점에서 언급했던 토큰의 장점은 Redis의 빠른 읽기/쓰기 성능으로 충분히 커버가 가능하다.
한편, Redis를 사용해서 인증/인가를 구현한다면 굳이 토큰 방식을 채택하지 않고 세션 방식을 채택하는 게 나을 것 같다는 생각도 들었다. 찾아보니 분산 환경에서 레디스 세션 방식을 채택하는 사례들도 있었다.
참고자료
Spring Security + jwt로 로그인/로그아웃 구현하기
[우테코] JWT 방식에서 로그아웃, Refresh Token 만들기(1): JWT의 Stateless한 특징을 최대한 살리려면?
[Spring] Spring에서 Session 저장소로 Redis 사용하기(feat. Redis Session Clustering)
'웹 개발 > Auth' 카테고리의 다른 글
| [Spring Security] 필터 단에서 예외 발생 시 적절한 응답 보내주기 (2) | 2025.07.17 |
|---|---|
| SSO(Single Sign-On) (0) | 2025.06.11 |
| Basic Auth (0) | 2025.03.20 |