우선, Access Token과 Refresh Token은 JWT(Json Web Token) 방식의 보안 강화 방식이다. JWT 토큰에 대한 설명 참고
Access Token
만을 통한 인증 방식의 문제는 만약 토큰이 탈취될 경우 보안에 취약하다는 점이다. Access Token
이 발급된 이후에는 서버에 저장되는게 아니고, 토큰을 탈취한 사람은 누구나 권한 접근이 가능해 진다. 따라서 Access Token
만을 이용한다면 보안에 매우 취약해 질 수 있다.
Access Token
의 유효기간을 짧게 한다면 토큰의 탈취를 방지하는데 어느정도 일조할 수 있겠지만, 토큰이 자주 만료되기 때문에 사용자 입장에서는 자주 로그인을 해줘야 하는 불편을 감수해야만 한다. 따라서 UX가 나빠질 수 있다. 반대로 무턱대고 UX를 위해 토큰의 유효기간을 길게하면 그만큼 토큰 탈취의 가능성이 높아져 보안 측면에서 악영향을 미칠 수 있다.
✅ 유효기간을 짧게해 보안을 높이면서 UX까지 고려하기 위한 해답으로
Refresh Token
이 등장했다.
- 사용자가 로그인을 하면 서버에서
Access Token
과Refresh Token
을 발급해서 클라이언트단으로 보내준다.
서버
는 추후 클라이언트단에서 헤더에Refresh Token
을 담아 요청할때 검증할 목적으로 Refresh Token을DB에 저장
한다.
클라이언트
쪽에서는 Access Token과 Refresh Token을웹 스토리지
에 저장한다. (대개 Access Token은 local storage, 쿠키 혹은 recoil 등의 전역 상태관리 라이브러리에 저장하고, Refresh Token은 쿠키에 저장한다.)
- 이후 사용자가
만료된 Access Token
을 보내면 서버는Unauthorized
응답을 보낸다. 이때 Refresh Token을 함께 서버로 보내는데, 서버는 받은 Refresh Token과 DB에 저장된 Refresh Token을 비교하여 이 두 토큰이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급해준다. 서버는 새로운 Access Token을 헤더에 실어서 API 요청에 대한 응답(response)을 진행한다.