Refresh Token 정리

YulHee Kim·2021년 9월 27일
3

OAuth

목록 보기
2/2

💻 Refresh Token이란

Resource Server(Resource Server + Authorization Server)에서 발급받은 Access Token은 수명이 있습니다. 제 3자에게 탈취당할 경우 보안에 취약하다는 점 때문에 수명이 있지만, 이 유효기간이 짧다면 그만큼 사용자는 로그인을 자주 해서 새롭게 토큰을 발급받아야 하므로 불편합니다. 또한 유효기간을 늘리면 토큰을 탈취당했을 때 보안에 더 취약해집니다.

그래서 등장한 것이 Refresh Token입니다. access token의 유효기간을 짧게하여 보안도 높이고, 편의성도 챙기는 방법입니다.

Refresh Token은 Access Token과 똑같은 형태의 JWT입니다. 처음에 로그인을 완료했을 때 Access Token과 동시에 발급되는 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 발급해주는 열쇠가 됩니다.

💻 Refresh Token 프로세스

  1. 클라이언트가 권한을 획득 후, Authorization Server에서 Access Token과 Refresh Token을 발급받습니다.

  2. 그러면 클라이언트는 API를 호출할 때마다 발급받은 Access Token을 활용하여 Resource Server에 요청을 하고, Resource Server는 보호되고있는 자원을 제공합니다.

  3. 그러다 어느날 클라이언트가 Access Token을 통해 Resource Server에 접근했는데, Invalid Token Error가 발생합니다. 이 에러는 Access Token의 유효기간이 만료되었다는 것입니다.

  4. 클라이언트는 보관하고 있던 Refresh Token을 사용하여 Authorization Server에서 Access Token을 다시 발급받습니다. 이때 Refresh Token도 다시 발급해주는 곳도 있습니다.

💻 Google - Refreshing an access token

구글 문서 예제를 통해 한번 더 이해해보겠습니다.
요청 폼

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=**your_client_id**&
client_secret=**your_client_secret**&
refresh_token=**refresh_token**&
grant_type=refresh_token

클라이언트 id, secret, refresh_token과 grant_type을 refresh_token으로 http 폼 형태로 구글에 전송하면,

구글은 아래와 같이 json 포맷으로 응답 을 준다.

응답 결과

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

access_token을 재발급해주며 유효기간도 확인할 수 있습니다.


생코 강의를 들으니 흐름이 더 잘이해됐다. 토큰 인증 방식에 장점이 참 많은거 같아서 토큰 인증 시스템, JWT 등을 조만간 한번 더 정리해보고 실제로 구현도 해봐야겠다.


[참고]

profile
백엔드 개발자

1개의 댓글

comment-user-thumbnail
2022년 4월 13일

Refresh Token은 Access Token과 똑같은 형태의 JWT입니다.

access token, refresh token가 JWT는 아닌데 혼동이오는 문장인거 같아요

답글 달기