JWT는 매시간 수많은 요청을 위해 클라이언트의 JS 코드로 HTTP 통신을 통해 서버로 전달된다.
해커는 클라이언트 측에서 XSS를 이용하거나 HTTP 통신을 가로채서 토큰을 훔칠 수 있기 때문에 여러 기술을 도입하여 탈취를 방지하고 탈취되었을 경우 대비 로직이 존재합니다.
위와 같은 문제가 발생하지 않도록 Access/Refresh 토큰 개념이 등장한다.
권한에 대한 모든 요청은 Access : 생명 주기를 아주 짧게
자주 사용되는 토큰의 생명주기는 짧게(약 10분), 이 토큰이 만료되었을 때 함께 받은 Refresh 토큰(24시간 이상)으로 토큰을 재발급.
(생명주기가 짧으면 만료시 매번 로그인을 진행하는 문제가 발생, 생명주기가 긴 Refresh도 함께 발급한다.)
1. 로그인 성공시 생명주기와 활용도가 다른 토큰 2개 발급 : Access/Refresh
Access 토큰 : 권한이 필요한 모든 요청 헤더에 사용될 JWT로 탈취 위험을 낮추기 위해 약 10분 정도의 짧은 생명 주기를 가진다.
Refresh 토큰 : Access 토큰이 만료되었을 때 재발급 받기 위한 용도로만 사용되며 약 24시간 이상의 긴 생명주기를 가진다.
2. 권한이 필요한 모든 요청 : Access 토큰을 통해 요청
Access 토큰만 사용하여 요청하기 때문에 Refresh 토큰은 호출 및 전송을 빈도가 낮음.
3. 권한이 알맞다는 가정 하에 2가지 상황 : 데이터 응답, 토큰 만료 응답
4. 토큰이 만료된 경우 (프론트 측에서)Refresh 토큰으로 Access 토큰 발급
Access 토큰이 만료되었다는 요청이 돌아왔을 경우 프론트엔드 로직에 의해 “1”에서 발급 받은 Refresh 토큰을 가지고 서버의 특정 경로(Refresh 토큰을 받는 경로)에 요청을 보내어 Access 토큰을 재발급 받는다.
5. 서버측에서는 Refresh 토큰을 검증 후 Access 토큰을 새로 발급한다.