討論 OAuth 2 的 token 更新策略

閱讀時間約 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 還有一個無狀態的特性,該如何無須管理它的狀態又讓它僅能使用單次,答案或許是類似區塊鍊的技術。
為什麼會看到廣告
13會員
64內容數
Where I go and what I get.
留言0
查看全部
發表第一個留言支持創作者!
Leon的沙龍 的其他內容
收到勒索信
閱讀時間約 1 分鐘
裝 WP-CLI
閱讀時間約 1 分鐘
如何收受 Google AdSense 款項
閱讀時間約 3 分鐘
動如脫兔的靜態網站產生器
閱讀時間約 2 分鐘
便利背後的隱藏成本
閱讀時間約 4 分鐘
你可能也想看
迎新活動「方格新手村」:新格友註冊加入方格子,知名日料吃到飽餐券送給你! 👉 還不是 vocus 的會員嗎?點此註冊,參與新手村活動 👈 近期站上也出現了不少新格友,為了歡迎各位的加入,「方格新手村」隨之登場! 即日起,只要是新註冊帳號於活動期間內發佈 3 則文章,就有機會抽獎獲得知名日料吃到飽餐券。原格友也可以一起同樂,我們準備了小任
Thumbnail
2024-06-21
閱讀心得:展現自我的生活態度|成熟大人的說話課我們每天都在說話,但說出的話合適嗎? Sunny最近讀完一本有關溝通的書籍。 這是由世紀奧美公關的創辦人「丁菱娟」所寫的書,書的全名《丁菱娟的成熟大人說話課:如何說,才能得體又不傷人?反擊時,如何堅定又有力量?任何情境都可用的38個溝通之道》。 會找這本書來看,主要是因為Sunny 近期發
Thumbnail
2024-07-10
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
討論命定所謂的被決定與自由,是一種零和遊戲,還是一種光譜上的象限呢
Thumbnail
2024-06-13
【討論】臺灣人用紀念64嗎?今天看了一篇文章,法廣的,貼在下面。。。 標題:六四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
2024-06-01
討論中港牌私家車違規泊在巴士站的事件一段關於中港牌私家車違規泊在巴士站的事件在網上引起廣泛關注,這篇文章探討該事件的背景和可能的解決方法。
Thumbnail
2024-05-26
討論區謝謝在這段時間內支持我的大家,故事終於正式開始了,身為一個興趣使然的創作者,我必須說再創作這條路上,還有很多要學 不管是各位讀者,還是偶然經過的前輩們,都謝謝你們,有你們的按讚支持和鼓勵,都讓我更有動力繼續努力下去 本篇是討論區,歡迎各位指教,覺得我作品有待改進的地方,都可以打在留言區 謝謝你
2024-05-16
討論「死刑是否違憲」,你應該先讀這一篇報導者文章關於死刑、違憲、廢死、憲法法庭這幾個名詞,你真的知道發生什麼事嗎? 隨著被社會洗滌越來越多,我漸漸的喜歡上了對政治及社會事件 "吃瓜"的習慣,因為當你站在不同政營,你會發現彼此之間的世界觀是截然不同的,你無法、無權、更無閒去說服對方接受你的世界觀。
Thumbnail
論文研討意料外的幽默▶︎ 過氣競選大頭照被發現 ▶︎ 其他報告人內容重點回顧 ▶︎ 血汗過頭的調色?!
Thumbnail
【財報分析】Silvergate Capital(SI)績後跌13%,討論2021Q3財報Silvergate Capital(SI)發布2021Q3財報後大跌了13%,到底甚麼地方出了問題?就我看來,這份財報充分說明了投資SI跟直接持有加密貨幣的差別。
Thumbnail
2021-10-20
Pokemon UNITE 討論區 pokemonunite.webnode.tw/
2021-08-18
Google Meet付費版:分組討論室自6/28後因免費版本meet有功能限制, 因此許多教師改付費使用, 或許會發現與免費版本的功能上有所差異。本系列文章就來分別介紹一下進階版本的MEET有什麼特殊的功能。
Thumbnail