JWT 토큰은 유저의 신원이나 권한을 결정하는 정보를 담고 있는 데이터 조각
JWT 토큰 인증방식은 비밀키(개인키 or 대칭키)로 암호화
탈취당했을 경우 문제가 발생
💡 유효기간을 짧게 두면 사용자가 로그인을 자주 해야하므로 사용자 경험적으로 좋지 않고, 유효기간을 길게 두면 보안상 탈취 위험에서 벗어날 수 없음
해결법은 유효기간이 다른 JWT 토큰 2개(Acses Token과 Refresh Token)을 두는 것
Access Token의 유효기간은 짧음.Refresh Token의 유효기간은 김.로그인 인증에 성공한 클라이언트는 Refresh Token과 Access Token 두 개를 서버로부터 받음
클라이언트는 Refresh Token과 Access Token을 로컬에 저장
클라이언트는 헤더에 Access Token을 넣고 API 통신. (Authorization)
3.1 요청마다 Access Token과 Refresh Token을 같이 넘기고 액세스 토큰이 만료된 경우 리프레시 토큰을 검증하여 재발급 받는 방법도 존재
일정 기간이 지나 Access Token의 유효기간이 만료
4.1. Access Token은 이제 유효하지 않으므로 권한이 없는 사용자가 됨
4.2. 클라이언트로부터 유효기간이 지난 Access Token을 받은 서버는 401 (Unauthorized) 에러 코드로 응답
4.3. 401를 통해 클라이언트는 invalid_token (유효기간이 만료되었음)을 알 수 있음
헤더에 Access Token 대신 Refresh Token을 넣어 API를 재요청
Refresh Token으로 사용자의 권한을 확인한 서버는 응답쿼리 헤더에 새로운 Access Token을 넣어 응답
만약 Refresh Token도 만료되었다면 서버는 동일하게 401 error code를 보내고, 클라이언트는 재로그인해야 함
탈취자는 통신이 빈번한 Access Token을 탈취할 가능성이 높음. 탈취에 성공했더라도 Access Token의 만료 시간은 짧기 때문에 탈취자는 다시 탈취를 시도해야함. 왜냐하면 JWT Token의 만료 시간은 변경이 불가능하기 때문
Refresh Token의 통신 빈도가 적기는 하지만 탈취 위험에서 완전히 벗어난 것은 아님
Refresh Token이 탈취당하는 건 예방하기 위해서 OAuth에서는 Refresh Token Rotation을 제시
Refresh Token Rotation은 클라이언트가 Access Token를 재요청할 때마다 Refresh Token도 새로 발급받는 것이렇게 되면 탈취자가 가지고 있는 Refresh Token은 더이상 만료 기간이 긴 토큰이 아니게 되지만, 따라서 불법적인 사용의 위험은 줄어듬