리프레시 토큰은 액세스 토큰이 만료되었을 때, 사용자의 로그인 세션을 유지하기 위해 사용하는 토큰이다. 액세스 토큰은 보안상의 이유로 짧은 만료 시간을 가지지만, 리프레시 토큰은 그보다 훨씬 긴 만료 시간을 가진다.그럼 여기서 액세스 토큰은 뭔데?
액세스 토큰은 사용자가 서버에 접근하기 위해 필요한 키와 같은 역할을 한다. 사용자가 로그인을 하면 서버는 사용자의 인증 정보를 기반으로 액세스 토큰을 생성하고 이를 사용자에게 전달한다. 사용자는 이후 서버에 요청을 보낼 때마다 이 액세스 토큰을 함께 보내서 자신을 인증한다.
액세스 토큰이 만료되면 사용자는 다시 로그인을 해야 한다. 하지만 매번 액세스 토큰이 만료될 때마다 사용자에게 로그인을 요청하는 것은 사용자 경험을 저하시킨다. 이럴 때 리프레시 토큰을 사용하면 사용자는 로그아웃하거나 장기간 비활동 상태가 아니라면 로그인을 유지할 수 있다.
스프링 시큐리티와 JWT를 사용하여 리프레시 토큰을 구현할 수 있다. 사용자가 로그인을 하면 액세스 토큰과 리프레시 토큰을 함께 발급한다. 그리고 사용자는 액세스 토큰을 사용하여 자원에 접근하고, 액세스 토큰이 만료되면 리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급받는다.
@PostMapping("/token")
public ResponseEntity<TokenResponse> token(@RequestBody TokenRequest tokenRequest) {
return ResponseEntity.ok(authService.createToken(tokenRequest));
}
위 코드에서는 사용자가 리프레시 토큰을 전송하면 새로운 액세스 토큰을 발급하는 엔드포인트를 구현하였다.
가장 중요한 액세스 토큰과 리프레시 토큰의 주요 차이점은 사용 목적과 만료 시간이다.