사용자의 정보와 권한 여부를 확인하기 위해 해당 정보를 Token에 담아 클라이언트와 서버가 주고 받는다.
문제는 Token을 타인에게 탈취당하면 타인이 Token의 주인 행세를 할 수 있는데, 서버는 탈취한 사람인지, 진짜 주인인지 구분할 수 없다.
이를 해결하기 위해 Token에 유효 기간을 설정하고, 유효 기간이 만료되면 기존 Token은 파기한 뒤 사용자에게서 다시 인증을 받아내면서 새로운 Token을 생성한다. 쉽게 말하면 Token이 만료되면 로그아웃되고, 다시 로그인하면 새로운 Token이 생성되는 것이다. 여기서 말하는 Token이 Access Token이다.
Access Token은 유효 기간이 짧다. 유효 기간을 짧게 설정하면 탈취당해도 금방 만료되기 때문에 위험성이 줄어든다는 장점이 있지만, 사용자들이 자주 로그인을 해야 한다는 문제점이 있다.
이걸 해결하는 것이 Refresh Token 이다. 이 토큰은 유효 기간이 길다.
처음에 로그인 할 때, Refresh Token과 Access Token을 동시에 발급 받는다. 시간이 지나 Access Token이 만료되면 서버는 클라이언트로부터 Refresh Token을 받아, 클라이언트 인증을 진행한다. 클라이언트가 맞다고 판단하면 새로운 Access Token을 발급해준다. 사용자가 굳이 로그아웃 & 로그인을 새로 하지 않아도 새로 토큰을 발급 받는 것이다.
➡️ 사용자는 자주 로그인을 하지 않아도 되고, 탈취 당할 위험도 적어진다.
요약
- Token을 통해 클라이언트 인증을 진행한다. 중요한 만큼 탈취 위험이 있다.
➡️ 유효기간을 설정하여 위험성을 줄인다.- Access Token은 유효 기간이 짧다.
- Refresh Token은 유효 기간이 길다.

만약 Refresh Token이 만료된다면 새로 Access Token을 요청하는 과정에서 만료 됐음을 서버가 알아내면서 사용자를 로그아웃 시킨다.
사실 Access Token만으로도 프로젝트를 구현할 수 있다. Refresh Token까지 넣으면 구현이 복잡해지며, Access Token을 새로 발급할 때 HTTP 요청 횟수가 많아진다는 단점이 있지만, 보안을 위해서라면 같이 구현하는 게 좋다.