오늘은 서버와 클라이언트의 인증을 구현하는데 있어서, session과 JWT의 동작방식과 차이점에 대하여 공부해보았다.
Session 기반 인증
클라이언트에서 서버로 username, password를 보낸다.
서버는 유저의 로그인정보가 일치하면, session id를 생성하여 메모리에 저장한다.
서버는 클라이언트에게 session id가 담긴 cookie를 전송한다.
클라이언트가 로그인이 되어있는동안, 클라이언트는 서버에 요청할때마다 session id를 함께 전송한다.
서버는 그 session id를 db에 있는 session id와 비교하여 일치하는 경우에 요청에 응답한다.
단점
리소스 요청이 있을때마다, 세션 저장소에 매번 조회를 해야한다.
JWT 기반 인증
유저의 로그인정보가 일치하면, 서버는 secret key를 이용하여 JWT를 생성하고 클라이언트에게 전송한다.
클라이언트는 local storage에 JWT를 저장한다.
클라이언트는 모든 요청을 보낼때마다, header에 JWT를 포함시킨다.
server는 모든 요청에 대해서 JWT를 검증하고 클라이언트에게 응답한다.
여기서 가장 큰 차이점은 유저의 state가 서버에 저장되지 않는것에 있다. 대부분의 modern web application에서는 JWT를 scalability와 mobile device 인증때문에 사용한다.
한계점
- Secret값이 탈취가 될 경우, JWT token을 생성 및 복호화 할 수 있다.
- token 자체를 누군가 탈취한다면, 해당 token으로 인증을 성공시킬 수 있게된다.
- 이를 대비해서, token의 유효기간을 짧게 두는 방법이 있는데, 이 경우 로그인을 자주 해야하는 문제가 생기고 이를 해결하기 위해 나온것이 refresh token이다. refresh token을 보냄으로써 서버에게 새로운 token을 발급받아서 로그인을 연장하는 방법이다. 하지만 refresh token또한 탈취가 될 수 있기때문에, refresh token 정보 또한 유효기간을 두어야 한다. 이를 구현하기 위해서 Redis와 같은 휘발성 DB에 저장하여 구현할 수 있다. 이 경우 server는 refresh token의 유효성을 검사하는 로직도 처리해야 하는 단점이 생긴다.