What is the purpose of a “Refresh Token”?
問題:我有一個與 YouTube Live Streaming API 集成的程序。我以每 50 分鐘的時間間隔,使用刷新令牌(refresh token)獲取一個新的訪問令牌(Access Token)。 我的問題是,為什麼 OAuth 要設計雙重 token?
當我通過 YouTube 進行身份驗證時,它給了我一個刷新令牌。然後我使用這個刷新令牌大約每小時獲取一個新的訪問令牌。 如果我有刷新令牌,我總是可以使用它來獲取新的訪問令牌,因為它永遠不會過期。所以我不認為這比從一開始就給我一個訪問令牌更安全。
回答
簡單地説,刷新令牌用於獲取新的訪問令牌。
為了清楚地區分這兩個令牌並避免混淆,以下是 OAuth 2.0 授權框架中給出的功能:
- 訪問令牌由授權服務器在資源所有者的批准下頒發給第三方客户端。客户端使用訪問令牌訪問由資源服務器託管的受保護資源。刷新令牌是用於獲取訪問令牌的憑據。
- 刷新令牌由授權服務器頒發給客户端,用於在當前訪問令牌失效或過期時獲取新的訪問令牌,或者獲取具有相同或更窄範圍的附加訪問令牌。
出於安全原因,refresh_token 只與授權服務器交換,而 access_token 與資源服務器交換。這降低了“訪問令牌有效期為一小時,刷新令牌有效期為一年或撤銷前有效”與“訪問令牌有效直至撤銷而無需刷新”中長期存在的 access_token 泄漏的風險。
刷新令牌至少有兩個用途。首先,刷新令牌是一種“證明”,表明 OAuth2 客户端已經從用户那裏獲得了訪問其數據的許可,因此可以再次請求新的訪問令牌,而無需用户通過整個 OAuth2 流程。其次,與長期訪問令牌相比,它有助於增加整個安全流程。
刷新令牌作為不影響用户體驗的一種方式
讓我們用一個例子來談談第一個目的。假設您是一名用户,正在使用想要與您的 YouTube 帳户數據進行交互的第三方客户端網絡應用程序。一旦您授予客户端應用程序使用您的 YouTube 數據的權限,您是否希望客户端應用程序在其 YouTube 令牌過期時再次提示您獲得許可?如果 YouTube 令牌到期時間非常短(例如 5 分鐘),會發生什麼?
如果客户端應用程序至少每 5 分鐘提示您一次許可,那會有點煩人! OAuth2 針對這個“問題”提出的解決方案是刷新令牌。通過使用刷新令牌,訪問令牌可以保持短暫的生命週期(這在訪問令牌以某種方式泄露或被盜的情況下是可取的),並且刷新令牌可以保持長期(更)生命週期,從而允許客户端獲得新的訪問權限令牌過期時無需用户再次許可。
但是為什麼要刷新令牌呢?如果重點是不讓用户使用權限請求,那麼為什麼客户端不能簡單地説“嘿,授權服務器,我想要另一個訪問令牌。而是,“嘿授權服務器,這是我過期的令牌,給我一個新的!”。刷新令牌作為一種“證明”,證明客户端在某個原始時間點被用户授予訪問權限。該“證明”採用由授權服務器數字簽名的刷新令牌的形式。通過客户端提供刷新令牌,授權服務器可以驗證客户端在過去的某個時間點收到了用户的許可,並且客户端不必再次提示用户。
刷新令牌作為提高安全性的一種手段
然而,這提出了一個問題,“好吧,如果刷新令牌被泄露或被盜,或者只是被惡意客户端應用程序保留而沒有應用户的要求將其刪除,會發生什麼?攻擊者能不能繼續使用刷新令牌無限期地(或直到它過期)獲得有效的訪問令牌?這個問題導致討論我提到的第二個目的,刷新令牌有助於更安全的流程。
訪問令牌出現的問題是,一旦獲得,它們只會呈現給資源服務器(例如 YouTube)。因此,如果訪問令牌被盜或泄露,您如何告訴資源服務器不要信任該令牌?好吧,你真的不能。唯一的方法是更改授權服務器上的私有簽名密鑰(首先對令牌進行簽名的密鑰)。
另一方面,刷新令牌需要頻繁地提交給授權服務器,因此如果一個令牌被泄露,那麼撤銷或拒絕整個刷新令牌是微不足道的,而不必更改任何簽名密鑰。
access token (the one that expires soonest) is stored in local storage
refresh token only stored in memory for security reasons
that is why if you refresh after first time period, you have to log in