討論 OAuth 2 的 token 更新策略

更新於 2022/08/21閱讀時間約 5 分鐘
圖片來自 stevepb
這篇是最近在想 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。
基於前面的條件,我們可以設想出第一版的更新策略。

更新策略第一版

說明如下:
  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」方塊,失敗再導向登入頁。站在用戶的角度,他是感受不到這兩條路的差異的,一切都只發生在主客端程式的對話中,基於以上,我們可以把黃色區域整塊拿掉:
於是簡化成第二版。

更新策略第二版

第二版清爽多了,也減少客端 app 的邏輯,不用去管 refresh token 還有沒有,只管 access token 存不存在、有沒有過期, 不存在、過期了,就去「Refresh token」方塊跑一下,成功就成功,失敗就帶用戶重新登入。
同樣的,如果藍色方塊有問題都跑去「Refresh token」,那何不連藍色方塊都省掉:
於是我們有了第三版。

更新策略第三版

第三版的邏輯不由分說,無須任何判斷 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
14會員
64內容數
Where I go and what I get.
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Leon的沙龍 的其他內容
天下沒有白吃的午餐,卻有被漲價的消費者。
想做個人網站嗎?要不要試試簡單、安全又免費的「靜態網站產生器」呢?
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
放 AdSense 幫小站賺點零用錢,因為是零用錢,怎麼用最低的成本收國外匯款就是需要考慮的,西聯匯款是目前最便宜也最方便的收款方式,這裡紀錄了用西聯匯款收 AdSense 款項的所有手續。
在裝 WordPress 之前,先裝 WP-CLI。 參照 WP-CLI 〈Installing〉文件。 抓下來: 確認一下運作正常: 加上可執行屬性: 移放到 /usr/local/bin/wp: 再次確認運作正常: 很簡單。 我是用 CentOS,不過以上步驟應該都是通用的。
上面是最近收到的勒索信,之所以值得一提是信件內有我的密碼。 整封信大意如下: 好像很嚇人,莫非我對著螢幕偷挖鼻孔的畫面會被傳出去,oh no。 不過有一些蛛絲馬跡令人覺得起疑: 本宅宅一向走在時代的最尖端,瀏覽器一定是最新的。除非是借用到別人的電腦,瀏覽器沒更新這點才成立。
天下沒有白吃的午餐,卻有被漲價的消費者。
想做個人網站嗎?要不要試試簡單、安全又免費的「靜態網站產生器」呢?
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
放 AdSense 幫小站賺點零用錢,因為是零用錢,怎麼用最低的成本收國外匯款就是需要考慮的,西聯匯款是目前最便宜也最方便的收款方式,這裡紀錄了用西聯匯款收 AdSense 款項的所有手續。
在裝 WordPress 之前,先裝 WP-CLI。 參照 WP-CLI 〈Installing〉文件。 抓下來: 確認一下運作正常: 加上可執行屬性: 移放到 /usr/local/bin/wp: 再次確認運作正常: 很簡單。 我是用 CentOS,不過以上步驟應該都是通用的。
上面是最近收到的勒索信,之所以值得一提是信件內有我的密碼。 整封信大意如下: 好像很嚇人,莫非我對著螢幕偷挖鼻孔的畫面會被傳出去,oh no。 不過有一些蛛絲馬跡令人覺得起疑: 本宅宅一向走在時代的最尖端,瀏覽器一定是最新的。除非是借用到別人的電腦,瀏覽器沒更新這點才成立。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
所謂的被決定與自由,是一種零和遊戲,還是一種光譜上的象限呢
Thumbnail
今天看了一篇文章,法廣的,貼在下面。。。 標題:六四35周年:民主臺灣應接力香港傳承六四精神? https://www.rfi.fr/tw/%E5%B0%88%E6%AC%84%E6%AA%A2%E7%B4%A2/%E8%A6%81%E8%81%9E%E5%88%86%E6%9E%90/2024
Thumbnail
一段關於中港牌私家車違規泊在巴士站的事件在網上引起廣泛關注,這篇文章探討該事件的背景和可能的解決方法。
謝謝在這段時間內支持我的大家,故事終於正式開始了,身為一個興趣使然的創作者,我必須說再創作這條路上,還有很多要學 不管是各位讀者,還是偶然經過的前輩們,都謝謝你們,有你們的按讚支持和鼓勵,都讓我更有動力繼續努力下去 本篇是討論區,歡迎各位指教,覺得我作品有待改進的地方,都可以打在留言區 謝謝你
Thumbnail
關於死刑、違憲、廢死、憲法法庭這幾個名詞,你真的知道發生什麼事嗎? 隨著被社會洗滌越來越多,我漸漸的喜歡上了對政治及社會事件 "吃瓜"的習慣,因為當你站在不同政營,你會發現彼此之間的世界觀是截然不同的,你無法、無權、更無閒去說服對方接受你的世界觀。
Thumbnail
▶︎ 過氣競選大頭照被發現 ▶︎ 其他報告人內容重點回顧 ▶︎ 血汗過頭的調色?!
Thumbnail
Silvergate Capital(SI)發布2021Q3財報後大跌了13%,到底甚麼地方出了問題?就我看來,這份財報充分說明了投資SI跟直接持有加密貨幣的差別。
Thumbnail
自6/28後因免費版本meet有功能限制, 因此許多教師改付費使用, 或許會發現與免費版本的功能上有所差異。本系列文章就來分別介紹一下進階版本的MEET有什麼特殊的功能。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
所謂的被決定與自由,是一種零和遊戲,還是一種光譜上的象限呢
Thumbnail
今天看了一篇文章,法廣的,貼在下面。。。 標題:六四35周年:民主臺灣應接力香港傳承六四精神? https://www.rfi.fr/tw/%E5%B0%88%E6%AC%84%E6%AA%A2%E7%B4%A2/%E8%A6%81%E8%81%9E%E5%88%86%E6%9E%90/2024
Thumbnail
一段關於中港牌私家車違規泊在巴士站的事件在網上引起廣泛關注,這篇文章探討該事件的背景和可能的解決方法。
謝謝在這段時間內支持我的大家,故事終於正式開始了,身為一個興趣使然的創作者,我必須說再創作這條路上,還有很多要學 不管是各位讀者,還是偶然經過的前輩們,都謝謝你們,有你們的按讚支持和鼓勵,都讓我更有動力繼續努力下去 本篇是討論區,歡迎各位指教,覺得我作品有待改進的地方,都可以打在留言區 謝謝你
Thumbnail
關於死刑、違憲、廢死、憲法法庭這幾個名詞,你真的知道發生什麼事嗎? 隨著被社會洗滌越來越多,我漸漸的喜歡上了對政治及社會事件 "吃瓜"的習慣,因為當你站在不同政營,你會發現彼此之間的世界觀是截然不同的,你無法、無權、更無閒去說服對方接受你的世界觀。
Thumbnail
▶︎ 過氣競選大頭照被發現 ▶︎ 其他報告人內容重點回顧 ▶︎ 血汗過頭的調色?!
Thumbnail
Silvergate Capital(SI)發布2021Q3財報後大跌了13%,到底甚麼地方出了問題?就我看來,這份財報充分說明了投資SI跟直接持有加密貨幣的差別。
Thumbnail
自6/28後因免費版本meet有功能限制, 因此許多教師改付費使用, 或許會發現與免費版本的功能上有所差異。本系列文章就來分別介紹一下進階版本的MEET有什麼特殊的功能。