스파르타 내일배움캠프에서 진행하는 심화 프로젝트 일지를 작성합니다.
이번 프로젝트에서 로그인을 JWT 방식으로 구현했다. 그리고 로그아웃을 구현한 팀원의 코드를 확인해보니 다음과 같았다.
//로그아웃
@GetMapping("/logout")
public ResponseEntity logout(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate(); // 등록된 세션을 삭제한다.
}
return new ResponseEntity("로그아웃 되었습니다.", HttpStatus.OK);
}
JWT 방식이지만 세션의 값을 지워서 로그아웃을 구현했고 의문이 들었다.
JWT의 가장 큰 장점은 다른 DB를 사용할 필요 없이 사용자 인증에 대한 정보가 토큰 자체에 포함되어있어 별도의 인증 저장소가 없다는 점(stateless)이라고 생각한다. 이로 인해서 비용적인 면이나 트래픽에 대한 부담 면에서 장점이라고 보는데 JWT를 썼지만 로그아웃을 위해 Session 저장소를 연결하게 된 것이다.
JWT의 stateless라는 특성이 장점이지만 단점이 되게 되었다.
stateless 해서 JWT 토큰을 관리할 시스템이 없어 이를 해결하기 위한 또 다른 방법을 도입해야만 했고 우리 팀은 JWT를 사용했지만 session까지 추가로 사용한 것이다.
그리고 이건 좋은 방법이 아니다. 단도직입적으로 그럴거면 JWT 왜 써?,,라는 게 내 입장이다.
session 없이 이 문제를 해결하는 방법은 몇 가지 있다.
1. 토큰의 생명 주기를 굉장히 짧게 하는 방법으로 해당 시간이 지나면 새로운 토큰 생성
2. 시스템에서 최근에 만료된 토큰을 저장
하지만, 이 방법을 사용한다고 해도 결국 redis와 같은 인증을 관리하는 곳이 필요하게 되고 JWT의 장점이 발휘되지 못한다.
결론은 JWT는 장점과 단점이 확고하기 때문에 서비스에 따라 사용을 할지말지 신중하게 결정해야하고 규모가 아주 큰 서비스가 아니라면 session 방식이 더 유효할 수 있다는 점을 명심해야한다.
https://yceffort.kr/2021/05/drawback-of-jwt