프로젝트를 하며 JWT를 사용하게 되고, JWT를 공부하려다 보니 쿠키와 세션까지 공부하고 글을 작성하게 되었다. 그러고 나서 JWT를 파며 글을 작성하다가 엑세스 토큰, 리프레시 토큰이라는 것에 대해서 또 알게되었고, 이것도 중요해 보이니 꼭 짚고 넘어가야겠다는 생각을 했다. 그래서 이번 글에서는 JWT를 더 파서 엑세스 토큰과 리프레시 토큰에 대해 파보고 글을 쓰려한다.
기존 JWT - Access Token만 사용
JWT에는 몇가지 단점이 있다. 그 중 하나는 토큰을 타인에게 탈취당했을 때 그 토큰이 만료될 때까지 무력화시킬 방법이 없다는 것이다.
이를 보완하고 강화하기 위한 대안으로 Access Token & Refresh Token을 사용한다.
JWT는 발급 후 삭제가 안된다. 그래서 Access Token에 유효시간을 부여하는 방식으로 이 문제를 해결한다.
Refresh Token은 Access Token과 같은 JWT이다.
Access Token는 접근에 관련된 토큰이고, Refresh Token은 Access Token을 재발급할 때 사용하는 토큰이다. (Refresh Token은 Access Token보다 긴 유효기간을 가진다.)
클라이언트가 웹사이트에 로그인을 했을 때 서버는 Access Token과 Refresh Token을 발급한다.
서버는 DB에 Refresh Token을 저장하고 클라이언트는 Access Token과 Refresh Token을 클라이언트 상에 저장한다. 클라이언트는 매 요청시마다 이 두 개의 토큰을 헤더에 담아서 보낸다.
만약 클라이언트가 기간이 만료된 Access Token을 보냈을 경우, 서버는 자신이 가진 Refresh Token과 클라이언트의 Refresh Token을 비교해 같으면 Access Token을 재발급한다.
사용자가 로그아웃하면 Refresh Token을 삭제하고, 재로그인하면 서버에서 다시 재발급한다.
참고 자료 : Dev Scroll