JWT를 액세스/리프래시 토큰을 만들어보자 -(3) 로그아웃과 블랙리스트를 구현하자

Alex·2025년 3월 2일
0

Plaything

목록 보기
117/118

JWT의 장점은 StateLess함을 구현할 수 있다는 것이지만
로그아웃, 탈취 등의 문제를 고려하면 완전히 Stateless함을 유지하기는 어렵다.

해킹된 것으로 의심되는 토큰이나, 로그아웃 후 액세스 토큰을 DB나 레디스에 저장을 하고 계속 JWT 토큰이 들어올 때마다 확인을 해야하기 때문이다.

다만, 그렇다고 해서 JWT 보안을 고려하지 않을 수는 없다.

그렇다면, 이제 로그아웃시 블랙리스트를 어떻게 활용할 수 있을지 알아보자.

우선, 로그아웃을 하면 레디스에 저장해놓은 리프래시 토큰을 무효화시킨다. 해당 리프래시 토큰으로 액세스 토큰을 재발급하지 못하도록 막아야 한다.

또, 여기서 더 나아가 액세스 토큰을 블랙리스트로 등록해둘 수도 있다. 로그아웃을 했는데, 기존 액세스 토큰으로 세션을 활용할 수 있다는 것은 말이 안된다.

액세스 토큰을 보통 10분 정도로만 유효시간을 설정해두어서 조금 과할 수도 있다는 의견도 있다. 그래도 레디스를 사용하면 TTL로 시간을 설정해둘 수 있으니, 그렇게까지 이정도는 크게 문제가 되지 않을 거라고 판단한다.

방법은 굉장히 간단하다.
레디스에 저장해둔 리프래시 토큰을 더는 쓰지 못하게 삭제해두고,
액세스 토큰을 블랙리스트로 저장해둔다.

그리고, 나중에 액세스 토큰으로 접근을 할 때 액세스 토큰이 블랙리스트에 저장이 됐는지를 확인한다.

참고로 jwt 토큰 예외는 시큐리티 예외에 자꾸 catch 되는 구조같아서
내가 별도로 응답을 작성해서 전달해주고 있다.

이제 다음편에서는 회원 탈퇴 기능을 만들어야 하는데
이때 구글과 애플 모두 Oauth2 연동 해제를 위한 revoke과정이 필요하다.
그 과정을 다룰 계획이다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글