반응형
Intro
토이프로젝트 설계 중 사용자 인증을 세션으로 할지, JWT로 할지 선택해야 했다.
둘의 장단점이 명확해서 어느것을 고르기가 힘들었고, 결정의 기준이 된 두 기술의 특징, 장점, 단점을 정리해봤다.
Session
특징: 인증 정보를 서버에서 관리한다.
장점
- 서버에서 사용자 인증 상태를 관리하기 쉽다.
- 로그아웃 시 세션을 만료시키기만 하면 끝난다.
단점
- 세션 ID 및 인증 정보를 서버에 저장해야 한다.
- Client가 Request를 보낼 때마다 세션 정보를 메모리 또는 DB에서 가져와야 한다.
- 서버 컨테이너가 여럿일 경우 이들간의 동기화를 위해 세션 클러스터링이나 스티키 세션 기법을 사용해야 한다.
- 동기화하지 않는다면 외부 DB에 세션 정보를 저장해야 한다. 주로 Redis와 같이 속도가 빠른 In-Memory DB를 사용한다.
JWT
특징: Client에서 인증 정보가 담긴 토큰을 관리한다. 이런 특징을 Stateless라고 한다.
장점
- 서버에 연결을 위한 정보를 저장하지 않아도 된다.
- 토큰 자체에 인증 정보가 담겨있기 때문에, 서버 컨테이너가 여럿이더라도 동기화 없이 인증받을 수 있다.
- Refresh Token 사용 시 DB에 저장해야 하지만, Refresh 요청 시에만 필요하기 때문에 읽어오는 빈도 수가 훨씬 적다.
단점
- 서버에서 임의로 토큰을 거부(로그아웃) 할 수 없다. 거부하도록 구현할 수는 있지만, Request마다 거부된 토큰인지 확인해야 하며, 그럴 경우 JWT를 사용함으로써 얻는 장점들이 모두 퇴색된다.
결론
프로젝트에 로그아웃 기능이 필요하기 때문에 세션을 사용하기로 결정했다.
JWT를 사용하는 큰 장점이 서버에 인증정보를 저장하지 않는다는 것인데,
로그아웃을 위해 블랙리스트를 DB에 저장하고, 서버끼리 블랙리스트를 동기화하며, Request마다 블랙리스트를 체크하면서까지 JWT를 쓸 이유는 없다는 생각이 들었다.
인터넷에 Spring + React 프로젝트를 검색하면 죄다 JWT를 사용한 프로젝트만 나온다.
세션으로 구현하기 위해 기나긴 삽질의 시간이 필요할것 같다.
이 글은 고민을 정리한 글이기 때문에 주관적인 생각이 다소 포함되어있으며, 잘못된 내용이 포함되어있을 수 있습니다.
잘못된 부분이나 해결방안은 댓글로 남겨주시면 감사하겠습니다.
반응형
'Study > 고민' 카테고리의 다른 글
[비교] DTO Class vs Record (1) | 2022.11.30 |
---|---|
[비교] Tree 구조 API 디자인 (0) | 2022.10.29 |