從安全、開發、產品三個角度反對用refresh_token續期access_token的觀點

来源:https://www.cnblogs.com/phpphp/archive/2023/12/22/17920402.html
-Advertisement-
Play Games

說明: access_token: 服務端與客戶端通信,有時服務端需要知道客戶端的身份,就會用到access_token來用於驗證身份。 refresh_token: 但為了保證安全token會設置過期時間,如果直接過期,相當於用戶或調用端正在使用產品,突然間就退出登錄了,這種產品體驗很差,於是有了 ...


說明:

access_token: 服務端與客戶端通信,有時服務端需要知道客戶端的身份,就會用到access_token來用於驗證身份。
refresh_token: 但為了保證安全token會設置過期時間,如果直接過期,相當於用戶或調用端正在使用產品,突然間就退出登錄了,這種產品體驗很差,於是有了refresh_token。
簡易流程: 登錄後,服務端返回兩個token,用於確定身份的access_token(短時間過期),和刷新access_token的refresh_token(長時間過期),請求介面時,如果access_token未過期則正常使用;當access_token過期但refresh_token未過期,則使用refresh_token獲取新的access_token;如果refresh_token過期,則本次會登錄過期,退出。

反對理由:

安全形度:

濫用問題: refresh_token是用來生成新的access_token而生的(字面意思叫刷新令牌),所以它就像一個token機關槍一樣,突突突可以生成任意多個access_token,現在黑客攻擊花樣層出不窮,所以這個refresh_token因各種攻擊或漏洞泄露出去很不安全。
全局鑒權問題 若有邏輯漏洞,用戶主動退出登錄致使access_token1銷毀,能不能保證這個refresh_token創建的access_token_2也失去作用呢,顧頭也得顧腚。

開發角度:

實現繁瑣: 就一個登錄還要兩個token,雖然不複雜,但是繁瑣。
存儲問題: token是不用存儲,但是為了安全,用戶退出時access_token未過期,則需要在服務端存儲一個黑名單,如果服務端在遇見這個access_token則直接拒絕這次訪問。並附加一個過期時間,這個過期時間設置的一般是略大於或等於
access_token的過期時間,access_token需要這個解決方案,那麼refresh_token也需要解決,數據量小還好,數量大這又是個問題。

產品角度:

這是個概率問題,也是個矛盾問題,就要看開發者怎麼實現了,如果refresh_token和asscess_token過期直接退出登錄,則用戶可能正在使用或剛剛在用,然後會話就突然退出登錄了,產品體感很差。
如果開發者考慮到refresh_token自動續期,那麼都續期,refresh_token是不是又顯得多餘?是不是一個access_token自動續期就行了?

解決方案:就一個access_token即可。

續期問題怎麼辦?

現在很多access_token都用jwt,token裡面可以塞一些數據,其中一個就是過期時間,伺服器處理數據前,可在服務端判斷token是否臨近過期,如果臨近過期直接自動生成新的access_token等邏輯處理完成,一併返回,客戶端無感知靜默續期,如果不用jwt,使用自定義token生成策略,原理也差不多。

續期的邊界問題怎麼辦?

例如token過期時間30分鐘,用戶在21分鐘和31分鐘做了請求,服務端設置自動續期的時間點是>=25分鐘,此時token又沒有自動續期,用戶在31分鐘時仍舊會退出登錄,用戶體驗還是不好。解決方案有兩個,token距離過期時間的閾值設置的大一點,比如設置20分鐘,這樣可以自動續期避免邊界問題。二是讓前端解析token(一般是jwt),每分鐘執行一次,前端檢測到token塊過期了,非同步請求介面自動續期,只要前端能解析,是否快過期了客戶端最清楚。

安全問題呢?

濫用問題不存在。
全局鑒權問題,仍舊需要讓服務端把未過期但棄用的token放入黑名單中,並設置過期時間。

開發問題呢?

一個token相對簡單。
存儲問題:仍舊需要讓服務端把未過期但棄用的token放入黑名單中,並設置過期時間,該存的還得存。

產品問題呢?

做好自動續期,用戶體感就好了。

總結:

可見access_token也不是完美的,但相比refresh_token更方便也更安全,也確實難以找出一種完美的解決方案。

大家怎麼看?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章摘要 安卓架構技術主要包括MVC、MVP、MVVM等。下麵分別對這些架構技術進行分析優劣勢,並附上代碼示例。 正文 MVC(Model-View-Controller)架構 MVC是一種常用的軟體架構,它將應用程式分為三個主要組成部分:Model(模型)、View(視圖)和Controller( ...
  • 成功路上並不擁擠,因為堅持的人並不多。只有堅持了,我們才知道,這一路上有多少事情需要實幹,有多少東西需要學習。 1. 環境變數的理解 環境變數一般是指在操作系統中用來指定操作系統運行環境的一些參數,如臨時文件夾位置、系統文件夾位置以及某些應用軟體文件的路徑等等。環境變數相當於給系統或用戶應用程式設置 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 unplugin-generate-component-name 一款用於以文件夾名或者setup標簽寫入名字來自動生成Vue組件名的插件。 項目地址 功能 💚 支持 Vue 3 開箱即用。 ⚡️ 支持 Vite、Webpack、Rsp ...
  • 大家好,我是歸思君 起因是最近瞭解JS執行上下文的時候,發現很多書籍和資料,包括《JavaScript高級程式設計》、《JavaScript權威指南》和網上的一些博客專欄,都是從 ES3 角度來談執行上下文,用ES6規範解讀的比較少,所以想從ES6的角度看一下執行上下文。 下麵我嘗試用ECMAScr ...
  • 本文將介紹如何用JS實現簡單的屏幕錄像機。 一、錄製準備 創建一個按鈕 <button id="recording-toggle">Start recording</button> 書寫JavaScript var RECORDING_ONGOING = false; var recordingTo ...
  • 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 這個錯誤通常發生在你嘗試在一個不支持 ES6 模塊語法的環境中使用 import 關鍵字。 ESLint 預設使用的是 ES5 ...
  • 1. 可演進的API 1.1. 隨著需求的變化,你需要改變你的API,即代碼之間的共用介面 1.2. 改變API很容易,但很難做到正確 1.3. 保持API小巧 1.3.1. 小巧的API更易於理解和演進 1.3.2. 只添加即刻需要的API方法或欄位 1.3.3. 帶有許多欄位的API方法應該有合 ...
  • 今天給大家推薦2個視頻翻譯工具​,分別是: TransDuck YouTube中文配音 這兩款工具的核心功能非常類似,核心提供一個視頻語言翻譯的能力。比如:你要看一個英文視頻,它可以幫助你將這個英文視頻變為中文視頻,日文視頻或者韓文視頻等其他語言的視頻。這裡所說的語言翻譯可不只是字幕哦,而是音頻也都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...