Backend/Spring

[Spring] jwt 로그아웃을 구현하는 방법

fladi 2023. 8. 7. 22:23
728x90

 

서론

jwt로 로그인은 구현한 적이 많지만, 로그아웃을 구현해본 적이 없다는 걸 깨달았다!

로그아웃 시에는 프론트쪽에서 jwt토큰을 버리면 되는 게 아닌가 생각했지만, 프론트와 얘기를 하다보니 로그아웃을 통해 토큰을 무효화 시키는 것도 필요하다는 걸 알았다. 그래서 jwt 로그아웃을 구현하는 방법들을 적어보려고 한다.

 

jwt토큰은 쿠키나 세션과 달리 강제로 만료시킬 수 없다. 디비 저장없이 토큰을 만료시키는 방법은 유효시간이 끝날 때까지 기다리는 것밖에 없다. 그러므로 서버에서 로그아웃을 구현하려면 다른 아이디어가 필요하다.

 

 

 

로그아웃을 구현하는 4가지 방법

1. 토큰의 유효시간을 아주 짧게 설정

  • 사용자가 로그아웃을 누르기 전에 유효시간이 다 되게 만드는 방법ㅋㅋ
  • 유효시간이 다 되면 자동으로 로그아웃 되는 효과가 있다
  • 토큰 유효시간이 너무 빨리 끝나면 사용자가 화가날 수 있기 때문에 좋은 방법은 아닌 것 같다

2. 토큰 블랙리스트 사용

  • 로그아웃을 요청한 사용자들의 토큰값을 블랙리스트 데이터베이스에 저장한다
  • 토큰 유효시간이 만료된 친구들은 데이터베이스에서 삭제하면 됨
  • 모든 토큰의 정보를 저장하는 것보단 디비부담이 덜 할 것이다.

3. 모든 토큰을 db에 저장하여 토큰 로그인 상태를 검증

  • 로그인 요청 시 해당 토큰이 db테이블에 있는지 확인하고, 있으면 로그인을 진행시킨다
  • 로그아웃을 요청하면 해당 토큰을 삭제한다
  • 블랙리스트와 반대 개념이라고 생각하면 될듯
  • 디비 부담이 커져서 session대신 jwt를 사용하는 장점이 없어진다

4. 토큰을 인메모리 db에 저장

  • 모든 토큰을 Redis같은 인메모리 db에 저장하는 방법
  • 로그아웃 시 토큰 정보를 Redis에서 지운다
  • jwt 로그아웃이라고 구글링했을 때 사람들이 가장 많이 사용하는 방법인 것 같았다

 

 

이번에는 가장 간단한 방법인 토큰 블랙리스트를 사용해보려고 한다. Redis도 다음에 사용해봐야겠다.

 

728x90