HTTP 프로토콜은 stateless이다.
즉, 서버로 가는 모든 request는 독립적이며 request가 끝나면 서버는 해당 request 정보를 기억하지 않는다.
따라서 로그인 같은 상태 정보 유지를 위해서 세션을 사용한다.
사용자가 ID, PW를 입력한 뒤, 서버에 로그인을 요청하면 서버는 해당 요청을 기반으로 세션을 생성한다.
세션은 DB에 저장되고, 해당 세션의 ID를 쿠키에 담아 클라이언트로 전송한다.
이제 클라이언트는 해당 서버에 요청을 보낼 때마다 쿠키에 세션ID가 담겨있으므로 로그인 유지가 가능해진다.
세션을 통한 사용자 정보 유지 방법은 사용자가 많을 수록 DB에 저장되는 세션 정보가 늘어나기 때문에 DB 리소스가 더 필요해진다.
따라서 이러한 문제를 해결하기 위해 토큰 방식이 등장한다.
토큰 방식으로 JWT가 있다.
사용자가 로그인 요청을 보내면, 서버는 DB에 세션을 생성하지 않는다.
대신 서버는 사용자의 ID를 기반으로 사인 알고리즘을 통해 사인된 정보 '토큰'을 생성한다.
생성된 토큰은 클라이언트로 전송하게 되고, 클라이언트는 이제 서버에 요청을 보낼 때 해당 토큰을 담아 요쳥을 보내 사용자 정보를 유지할 수 있다.
JWT의 저장 방법으로 쿠키, localstorage, private variable이 있다.
먼저 private variable 저장 방식은 새로고침할 때마다 JWT 값이 사라지기 때문에 매번 로그인을 수행해야한다.
또, 쿠키와 localstorage 방식은 CSRF, XSS에 의해 보안에 취약하다.
그래서 가장 좋은 방법은 refresh token을 사용하는 것이다.
refresh token을 httpOnly 쿠키로 저장하고, 새로고침될 때마다 refresh token을 request에 담아 전송한다.
그리고 새로은 access token을 발급받는다.
발급 받은 access token은 private variable에 저장할 수 있다.