현재 Kakao Cloud School Final Project에서 웹 개발을 진행 중인데 Spring Security와 함께 적절한 인증 수단으로 JWT를 함께 적용하려고 한다.
JWT는 일반적으로 클라이언트와 서버 통신 시 권한 인가(Authorization)을 위해 사용하는 토큰이다.
기본 동작 원리는 아래와 같다.
[1] 클라이언트에서 ID/PW를 통해 요청이 들어오면
[2] 서버에서 DB Table에 해당하는 ID/PW를 가진 User가 있다면, Access Token과 Refresh Token을 발급해준다.
[3] 클라이언트는 발급받은 Access Token을 Header에 담아서 서버가 허용한 API를 사용할 수 있게 된다.
Refresh Token은 새로운 Access Token을 발급하기 위한 토큰이다. 기본적으로 Access Token은 외부 유출 문제로 유효기간을 짧게 설정한다. 정상적인 클라이언트는 유효기간이 끝난 Access Token에 대해서 Refresh Token을 사용해 새로운 Access Token을 발급 받을 수 있게 된다.
따라서, Refresh Token의 유효기간은 Access Token의 유효기간 보다 길게 설정하게 된다.
Refresh Token이 유출되서 다른 사용자가 이를 통해서 새로운 Access Token을 발급 받게 되었다면?
이 경우에는, Access Token의 충돌이 발생하게 되는데, 서버측에서는 두 토큰을 모두 폐기시켜야한다. 국제 인터넷 표준화 기구인 IETF 에서는 이를 방지하기 위해서 Refresh Token도 Access Token과 같은 유효기간을 가지도록 하고, 사용자가 한 번 Refresh Token으로 Access Token을 발급 받았으면, Refresh Token도 다시 발급 받도록 하는 것을 권장하고 있다.