토큰 유효기간과 리프레시 토큰은 인증 시스템에서 중요한 역할을 합니다. 각각의 개념을 설명해 드리겠습니다.
토큰 유효기간(Token Expiration):
토큰 유효기간은 JWT 등의 토큰이 유효한 시간을 나타냅니다.
토큰이 발급된 후에는 이 유효기간 동안만 사용할 수 있으며, 유효기간이 지나면 토큰은 더 이상 유효하지 않습니다.
리프레시 토큰(Refresh Token):
리프레시 토큰은 주로 액세스 토큰(Access Token)의 유효기간이 만료되었을 때, 새로운 액세스 토큰을 발급하기 위한 수단으로 사용됩니다.
보통 액세스 토큰은 유효기간이 짧게 설정되어 있기 때문에, 유효기간이 만료되면 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 얻습니다.
리프레시 토큰은 일반적으로 액세스 토큰보다 긴 유효기간을 갖고 있습니다.
리프레시 토큰의 필요성
가령 토큰의 유효기간이 하루라면, 하루동안 그 토큰으로 모든 요청을 인증 받을 수 있습니다. 이러한 상황은 토큰을 쓰더라도 보안에 매우 취약해지겠죠. 하루동안 내가 아닌 다른 사람이 토큰을 사용해도 서버는 전혀 알 수 없는 것이니까요.
그렇다면 토큰의 유효기간이 10분이라고 생각해봅시다. 이 경우에는 사용자가 서비스를 사용하는 동안에 10분에 한 번씩 로그인을 해야할 수도 있습니다. 이러한 서비스가 있다면 아마 불편해서 사용하지 않겠죠.
이러한 불편한 점들을 해결하기 위해 필요한 것이 리프레시 토큰입니다. 리프레시 토큰은 액세스 토큰과 별개의 토큰입니다. 사용자를 인증하기 위한 용도가 아닌 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하기 위해 사용합니다. 액세스 토큰의 유효기간을 짧게 설정하고 리프레스 토큰의 유효 기간을 길게 설정하면 공격자가 액세스 토큰을 탈취해도 몇 분 뒤에는 사용할 수 없는 토큰이 되므로 더 안전해집니다.
인증요청: 클라이언트가 서버에게 인증을 요청합니다
액세스 토큰 & 리프레시 토큰 응답: 서버는 클라이언트에서 전달한 정보를 바탕으로 인증 정보가 유효한지 확인한 뒤, 액세스 토큰과 리프레시 토큰을 만들어 클라이언트에게 전달합니다.
리프레시 토큰 저장: 서버에서 생성한 리프레시 토큰을 DB에도 저장합니다.
토큰 정보와 함께 요청: 인증을 필요로 하는 AP를 호출할 때 클라이언트에 저장된 액세스 토큰과 함께 API를 요청합니다.
토큰 유효성 검사 & 응답: 서버는 전달받은 액세스 토큰이 유효한 지 검사한 후 클라이언트에서 요청한 내용을 처리힙니다.
만료된 토큰 정보와 함께 토큰 발급 요청: 시간이 지나고 클라이언트에서 원하는 정보를 얻기 위해 서버에게 API 요청을 보냅니다.
토큰 만료 응답: 만료된 토큰이면 유효하지 않기 때문에 토큰이 만료되었다는 에러를 전달합니다.
리프레시 토큰과 함께 토큰 발급 요청: 클라이언트는 이 응답을 받고 저장해둔 리프레시 토큰과 함께 새로운 액세스 토큰을 발급하는 요청을 전송합니다.
리프레시 토큰 조회 & 유효성 검사: 서버는 이 응답을 받고 저장해둔 리프레시 토큰이 유효한지, DB에서 리프레시 토큰을 조회한 후 저장해둔 리프레시 토큰과 같은지 확인합니다.
새로운 액세스 토큰 응답: 만약 유효한 리프레시 토큰이라면 새로운 액세스 토큰을 생성한 뒤 응답합니다. 이후 클라이언트는 4번과 같이 다시 API를 요청합니다.