ahnnyung ,/Spring

[Spring Security] Access Token & Refresh Token

hi,ho 2020. 12. 15. 14:53
반응형

시작하기에 앞서 Access Token이란?

사적 리소스(private resource)에 접근하는 REST API에 대한 모든 요청에 토큰이 포함되어 있는지, 또 해당 토큰이 유효한지의 여부를 검증함으로써 인증 절차(로그인)를 수행할 때 사용하는 토큰을 Access Token이라 부릅니다.

 

이러한 Access Token은 수명이 있다. 수명이 끝나면 해당 토큰을 이용하여 API 서버에 데이터를 요청했을 때 API 서버는 더 이상 정보를 제공하지 않는다. 그럼 어찌해야하는가? Access Token을 재발급 받아야한다.

 

그러나 그때마다 사용자에게 다시 로그인을 하여 Access Token을 발급받아라~ 하기에는 무리가 있다. 주변을 보아도 아무리 오랜 시간 로그인을 유지하면서 지속적으로 사이트를 사용하여도 로그아웃 돼버리는 사이트는 없다.

 

그렇다고 Access Token의 수명을 길게하거나 무한정으로 해버린다면 악의를 품은 공격자가 이를 악용할 가능성이 커진다. (극단적으로 Access Token의 유효기간이 5초라고 하면, 확실히 공격자가 이 토큰을 가지고 뭔가 한다는 건 힘든 일일 것이다.)

 

따라서 Access Token의 수명은 너무 짧지 않은 시간으로 유지시키되, 그렇다고 빈번하게 로그아웃이 일어나지 않게 해야 한다.

 

바로 이러한 경우에 손쉽게 새로운 Access Token을 발급받을 수 있는 방법이 Refresh Token이다.

 

다음은 The OAuth 2.0 AUthorization Framework에 대한 설명이 들어있는 표준문서인 RFC 6749 문서의 RT에 대한 설명이 있는 부분의 그림이다.

 

만료된 Access Token을 Refreshing하는 과정

보통의 Spring 프로젝트라면 AuthorizationServerResourceServer를 같은 API 서버단으로 구현하는 경우가 있을 것이다. 그러한 경우는 AuthorizationServer를 Security단으로, ResourceServerRestController단으로 생각하고 흐름을 파악하자.

 

Client가 로그인(과정 A)을 통해 권한을 획득할 때 Access Token과 함께 RT을 발급(과정 B) 받는다.

그러면 Client는 Access TokenRefresh Token을 모두 저장하고 있다가 API를 호출(과정 C)할 때에는 Access Token을 제출하여 자원(데이터)을 받아오게 된다.(과정 D)

시간이 흘러 마찬가지로 Access Token을 이용하여 자원을 받아오려고 하는데(과정 E), Invalid Token Error가 뜨면서(과정 F) Access Token의 수명이 다한 것을 알게 된다.

그럴 때 바로 보관하고 있었던 Refresh TokenAuthorizationServer에 전달(과정 G)하면서 새로운 Access Token을 발급(과정 H) 받게 된다. (그림에 Optional Refresh Token이라 적혀있는 이유는 새로운 Access Token를 발급받을 때 Refresh Token도 새롭게 갱신할 수 있다는 의미이다.)

 

 

 

 

다음은 Refresh Token에 대한 예제가 나와있는 구글 공식 문서다. 링크

 

Google Identity Using OAuth 2.0 to Access Google APIs 중 일부

POST방식으로 client_id값, client_secret값, refresh_token값, grant_type값을  포함하여 AuthorizationServer로 보내게 되면, AuthorizationServer새로운 Access Token을 발급해 주게 된다.

반응형