討論 OAuth 2 的 token 更新策略

更新於 發佈於 閱讀時間約 6 分鐘
raw-image

這篇是最近在想 OAuth 2 token 更新策略的一些思考,篇名曰「討論」,因為自己也不確定這些想法是不是所謂的最佳實踐,歡迎讀者留言討論。

在 OAuth 2 的各種 flow 中,最終大多會取得兩種 token,access token 和 refresh token,作為代表用戶的令牌存取服務及資源,這兩種 token 的特性如下:

Access Token

  • 代表用戶存取服務。
  • 有效期短。
  • 因為有效期短,比較不用擔心被竊,一般可以存放在 cookie、local storage、session storage、記憶體等處。

Refresh Token

  • 用於更新 access token 和 refresh token。
  • 除了更新 token 外無法用於存取服務。
  • 有效期長。
  • 因為有效期長,需要較妥善的保存,一般建議存放在具有 HttpOnly 屬性的 cookie 內,但也還是有些人放在 local storage。

Token 更新

因為 access token 效期短,為了塑造良好的用戶體驗,不要讓用戶頻繁登入,我們必須在客端 app 上利用 refresh token 更新 token,一般而言,更新 token 時不僅會取得新的 access token,也會取得新的 refresh token。

基於前面的條件,我們可以設想出第一版的更新策略。

更新策略第一版

raw-image

說明如下:

  1. 用戶點了連結或按了某個按鈕。
  2. 進入藍色區域,檢查 access token 效期,如果一切順列,直接進入綠色方塊,拿 access token 向服務端要內容或執行某些事務。
  3. 如果客端根本就沒有 access token,那就進入黃色區域,拿 refresh token 換回一對新的 access token 和 refresh token。
  4. 如果客端的有 access token,但卻過期了,那一樣拿 refresh token 去換一對新的回來。
  5. 如果 refresh token 失敗,表示 refresh token 也是過期的,那就只好請用戶重新登入。
  6. 如果客端自己知道 refresh token 過期,那也是請用戶重新登入。

在這看似有點亂又不太亂的策略中,客端 app 需要管理 access token 和 refresh token 的狀態,也就是知道他們的有效期,但還記得嗎,refresh token 是 HttpOnly 的 cookie,JS 讀不到。

況且不論我知不知道 refresh token 的有效與否,都得走入「Refresh token」這一步,只差在是我主動發現 refresh token 過期而導向登入頁,或是直接走進「Refresh token」方塊,失敗再導向登入頁。站在用戶的角度,他是感受不到這兩條路的差異的,一切都只發生在主客端程式的對話中,基於以上,我們可以把黃色區域整塊拿掉:

raw-image

於是簡化成第二版。

更新策略第二版

raw-image

第二版清爽多了,也減少客端 app 的邏輯,不用去管 refresh token 還有沒有,只管 access token 存不存在、有沒有過期, 不存在、過期了,就去「Refresh token」方塊跑一下,成功就成功,失敗就帶用戶重新登入。

同樣的,如果藍色方塊有問題都跑去「Refresh token」,那何不連藍色方塊都省掉:

raw-image

於是我們有了第三版。

更新策略第三版

raw-image

第三版的邏輯不由分說,無須任何判斷 token 存在、有效的邏輯,不關心狀態,只無腦更新,錯了就抓用戶去重新登入。

第三版夠傻瓜也夠聰明,但未必可行,紅色方塊右上的小圖示說明他們是要走網路的,無腦更新,表示服務端必須回應,如果客端 app 人很多,那相當於對服務端發動 DDoS 攻擊,要嘛就是服務端被打爆,要嘛就是用戶被封鎖。

這種作法主客端交互開銷巨大,對服務端來說,要考慮的是 token 的生成效率,token 的主流選擇是 JWT,JWT 是以 Base64 和 HS256 為基礎算出來的,也就是說服務端需要高效率的 Base64 與 HS256 解編碼演算方案,每種語言都有多樣的 Base64、HS256 編解碼器,也可以利用 APM 監控 refresh token 端點的負載,再視需要做優化。

Access Token 悖論

同場加映 access token 悖論。

前面提過 accsss token 有效期短,較能承受外流的風險,例如一個效期僅一分鐘的 access token,就算外流了,多半也不太恐慌,因為一分鐘後失效了,反之,另一個效期短達一天的 access token 外流,那我們可能會緊張一下。

基於上述的設定,我們可以認定效期越短,安心感越大,因此想要安心感無限大,那效期就要無限短,短到趨近於零,但這樣就失去它的功能了,或許我們可以改用「次數」的觀點看效期,從原本的時間效期改為次數效期,也就是所謂的 one-time token,但 access token 還有一個無狀態的特性,該如何無須管理它的狀態又讓它僅能使用單次,答案或許是類似區塊鍊的技術。


留言
avatar-img
留言分享你的想法!
avatar-img
Leon的沙龍
15會員
64內容數
Where I go and what I get.
Leon的沙龍的其他內容
2024/04/10
Goolge OR-Tools 是一套以數學模型為基礎的求解器,相較於 OptaPlanner,OR-Tools 有更平緩的學習曲線,本文是 OR-Tools 最基礎的介紹。
Thumbnail
2024/04/10
Goolge OR-Tools 是一套以數學模型為基礎的求解器,相較於 OptaPlanner,OR-Tools 有更平緩的學習曲線,本文是 OR-Tools 最基礎的介紹。
Thumbnail
2024/04/09
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
2024/04/09
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
2024/04/09
SpiffWorkflow 是一個專門針對業務流程的流程引擎,它與商業 BPMN 產品有所區別,適合應用在自有專案中,並且需要內含稍微複雜的商業流程。例如,對於需要外部程式與前端配合才能真正讓用戶輸入決斷的場景,SpiffWorkflow 是一個適合的解決方案。
Thumbnail
2024/04/09
SpiffWorkflow 是一個專門針對業務流程的流程引擎,它與商業 BPMN 產品有所區別,適合應用在自有專案中,並且需要內含稍微複雜的商業流程。例如,對於需要外部程式與前端配合才能真正讓用戶輸入決斷的場景,SpiffWorkflow 是一個適合的解決方案。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
探索無密碼驗證機制 OIDC 及其在 API 管理平台中的應用。本文分析 OIDC 如何提升用戶體驗與安全性,並深入探討 API管理平台如何幫助企業簡化 API 管理,提高效率,並強化資安。了解這些平台如何解決 API 混亂問題,提供全面的管理解決方案。
Thumbnail
探索無密碼驗證機制 OIDC 及其在 API 管理平台中的應用。本文分析 OIDC 如何提升用戶體驗與安全性,並深入探討 API管理平台如何幫助企業簡化 API 管理,提高效率,並強化資安。了解這些平台如何解決 API 混亂問題,提供全面的管理解決方案。
Thumbnail
延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
Thumbnail
延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
Thumbnail
這次來介紹軟體世界中很常遇到的授權策略,而有沒有比較好的一種策略方式,讓開發者可以遵循一套標準呢? 答案是有的,就來介紹一下新寵兒,Open Polocy Agent吧! 首先我們先搞懂什麼是認證? 什麼又是授權? 還懵懵懂懂的朋友們可以請先參考這一篇「Authentication、Authoriz
Thumbnail
這次來介紹軟體世界中很常遇到的授權策略,而有沒有比較好的一種策略方式,讓開發者可以遵循一套標準呢? 答案是有的,就來介紹一下新寵兒,Open Polocy Agent吧! 首先我們先搞懂什麼是認證? 什麼又是授權? 還懵懵懂懂的朋友們可以請先參考這一篇「Authentication、Authoriz
Thumbnail
前一篇的「Authentication、Authorization,傻傻分不清楚?」主要在介紹認證與授權的差異之處,而本章節著重於授權這部分,也使用了經典的RBAC模型進行說明。 RBAC模型(Role-Based Access Control:基於角色的訪問控制), 認為可以抽象的表示: Who是
Thumbnail
前一篇的「Authentication、Authorization,傻傻分不清楚?」主要在介紹認證與授權的差異之處,而本章節著重於授權這部分,也使用了經典的RBAC模型進行說明。 RBAC模型(Role-Based Access Control:基於角色的訪問控制), 認為可以抽象的表示: Who是
Thumbnail
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 我們為什麼不能改
Thumbnail
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 我們為什麼不能改
Thumbnail
前言 只要把後端對外,或者網站對外,就一定會被攻擊,有自己用自己的電腦當 server 架站過就一定知道,只要一對外,每天都會收到一些隨機的攻擊,最常見就是別人在亂試 api 看能不能猜對,通常是猜不到啦,鬼知道你的 api 長什麼樣子,更別提要帶什麼參數,能猜對真的是會通靈。 儘管如此,你可能還是
Thumbnail
前言 只要把後端對外,或者網站對外,就一定會被攻擊,有自己用自己的電腦當 server 架站過就一定知道,只要一對外,每天都會收到一些隨機的攻擊,最常見就是別人在亂試 api 看能不能猜對,通常是猜不到啦,鬼知道你的 api 長什麼樣子,更別提要帶什麼參數,能猜對真的是會通靈。 儘管如此,你可能還是
Thumbnail
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
Thumbnail
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News