daily

23.05.06. Refresh token, Access token

Juhyuck 2023. 5. 6. 11:58
728x90

Refresh 토큰과 Access 토큰은 사실 익숙한 내용이다. 예전 dropbox API를 사용하고 있을 때, 언제부로 Oauth2.0으로 바뀌니 준비하라는 메일을 받았고, 그 내용이 기존 발급했던 auth key를 더이상 쓸 수 없고, access token과 refresh token을 사용하는 방식으로 바뀐다고 해서 취미로 하던 프로젝트에서 그에 맞게 코드를 수정했던 기억.

 

그 당시엔 refresh token의 expire기간이 길고, access 는 4시간인가로 짧았고, refresh는 월단위로 길었다. 사실 중요한 서비스는 아니었고, 깊게 알진 못해서 refresh token의 만료 시에 어떻게 되는지는 확실히 알아보지 못하고 시간이 지나도 refresh token이 갱신되며 문제가 없었던 것으로 기억한다. 잠깐 찾아보니, access 토큰 발행할 때, refresh 토큰 기한이 일정 이하로 된 경우, refresh 토큰도 다시 발행하는 방식을 쓰는 것 같기도 하다. 

 

 

대충 그려본 Access/Refresh 토큰의 사용 흐름

Access Token은 일반적으로 짧은 유효 기간을 가지며, 만료 시간이 지나면 더 이상 사용할 수 없다. 만약 Access Token의 유효 기간이 만료되면, 클라이언트는 새로운 Access Token을 발급받아야 한다.

 

Refresh Token은 Access Token을 갱신하기 위한 토큰이다. 일반적으로, Access Token보다 더 긴 유효 기간을 가지며, 클라이언트는 Refresh Token을 사용하여 서버에 새로운 Access Token을 요청하고, 클라이언트는 받은 Access Token을 사용하여 보호된 리소스에 접근할 수 있게 된다.

 

Refresh Token은 Access Token을 갱신하는 데 사용되는 보안 메커니즘으로, 만약 Access Token이 탈취되거나 유출되어도, Refresh Token이 노출되지 않는 한, Refresh Token을 사용하여 새로운 Access Token을 발급받을 수 있기 때문이다.

 

정리하면, Access Token은 보호된 리소스에 접근하기 위한 권한을 가지며, 유효 기간이 짧으므로 주기적으로 갱신해야 한다. Refresh Token은 Access Token을 갱신하기 위한 토큰으로, 유효 기간이 Access Token보다 더 길게 설정되어 있어, Access Token이 만료되었을 때, 새로운 Access Token을 발급받는 데 사용되는 것.


여기까지는 쉽게 이해되는 내용인데 사실 정리하면서 그리고 구현해보면서 아래 질문이 들었고,

 

Access Token과 Refresh Token 둘 다, 클라이언트에게 보내게 되면 탈취되는 위험은 동일할텐데... 왜 굳이?

 

조금 더 서치해보니 비슷한 궁금증과 이에대한 댓글이 있는 글을 찾았고, 어느정도 해소가 되었다.

 

나름 정리해보면, 

 

1. Refresh Token은 서버에 저장하므로, 탈취 여부에 대한 의심이 있는 경우 사용을 제한할 수 있다.

2. Access Token 만료 전 여유가 있는데 갱신하는 경우 탈취로 간주해서 Refresh Token을 무효화 한다던가, 

3. Refresh Token을 한번만 사용하도록 하는 방식(Refresh Token Rotation)으로 보호할 수도 있다고 한다.

 

web이 아닌 다른 application에서는 토큰을 보관하는 방식이 다를 수 있기 때문에. refresh 토큰에 대한 보안을 더 신경써서 보관하도록 만들 수도 있을 것.

 

기본적으로 Refresh Token은 로그인을 자주 안하면서도, 사용자 인가를 안전하게 하기 위해 사용한다고 정리할 수 있겠다. 즉, 사용자 경험을 좋게 하는 것과 동시에 보안을 잘 유지하기 위해 사용하는 방식인 것.

'daily' 카테고리의 다른 글

23, 19주차  (0) 2023.05.11
3-Tier, 3-Layered Architecture  (0) 2023.05.09
23.05.01. Sequelize findOne에서, 테이블 조인과 이름 변경  (0) 2023.05.01
23, 17주차  (0) 2023.05.01
23.04.29. express routes index에서의 export 이름 설정  (0) 2023.04.29