Token流程是什麼?怎麼解決超時問題的?描述詳細一下?

看一他要飛昇


Token機制雖說很早就出現了,但也就是最近十年內才廣泛應用的,而很多新手對於Token和Session何時使用區分不了,雖說聽說過Token但不知道其原理是啥以及如何使用。

Token是為了解決什麼問題而生的?

在Token機制之前,服務器端驗證客戶端請求是否合法主要是靠Cookie+Session機制來實現的。服務器端會為每個會話都生成一個Session,在高併發場景下會導致Session文件越來越多,不利於管理。

而Token是服務器端生成的一串加密字符串(具有生命週期),分配給客戶端作為令牌使用,Token的好處就是減輕了服務器端的壓力,因為Token是由客戶端存儲的,而且是無狀態的。

Token機制流程

Token超時問題如何解決?

服務器端生成的Token是有生命週期的(過期時間),如果我們拿著已過期的Token去服務器端驗證肯定是無法通過的,所以我們要在Token過期之前主動更新Token,方案如下:

1、客戶端存儲Token時要記錄Token的過期時間

客戶端拿到服務器生成返回的Token後,需要將Token臨時存儲起來(SessionStorage、LocalStorage),然後客戶端定時檢測Token是否已過期,如果過期了則主動向授權服務器重新發起認證請求。

2、由服務器端主動通知客戶端進行Token更新

客戶端每次的請求中都會帶上Token,服務器會對此Token進行校驗,如果服務器端發現此Token將會在很短時間內失敗,那就重新生成Token並附加到響應體中,客戶端獲取服務器響應數據時看下是否有Token,如果有則覆蓋本地舊的Token即可。


以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!

網絡圈


Token

Token是服務端生成的一串字符串,可以看做客戶端進行請求的一個令牌,客戶端在請求網絡上某些資源的時候,必須帶著這塊令牌(通行證)。

當客戶端第一次訪問服務端,服務端會根據傳過來的唯一標識userId,運用一些加密算法,生成一個Token,客戶端下次請求時,只需要帶上Token,服務器收到請求後,會驗證這個Token。

有些公司會建設統一登錄系統(單點登錄),客戶端先去這個系統獲取Token,驗證通過再拿著這些Token去訪問其他系統;API Gateway也可以提供類似的功能,我們公司就是這樣,客戶端接入的時候,先向網關獲取Token,驗證通過了才能訪問被授權的接口,並且一段時間後要重新或者Token。

基於Token的認證流程

  1. 客戶端使用用戶名、密碼做身份驗證;

  2. 服務端收到請求後進行身份驗證;(也可能是統一登錄平臺、網關)

  3. 驗證成功後,服務端會簽發一個Token返回給客戶端;

  4. 客戶端收到Token以後可以把它存儲起來;每次向服務端發送請求的時候,都要帶著Token;

  5. Token會有過期時間,過期後需要重新進行驗證;

  6. 服務端收到請求,會驗證客戶端請求裡面的Token,驗證成功,才會響應客戶端的請求;

Token過期時間及超時刷新策略

因為Token是訪問資源的憑證,所以必須要有過期時間。否則一次認證通過就可以永久使用資源,那麼認證功能也就失去了意義,所以Token需要有過期時間。

  • Token的過期時間很容易甚至,在生成Token的元素中,增加時間戳即可;然後在驗證過程中,判斷是否超時;Token的超時時間不宜過長,也不宜過短,我們項目設置的是1個小時。


  • Token過期之後,需要重新獲取,一種方式是重新來一遍獲取Token的過程(比如重新登錄),這種做法實現起來簡單,但是用戶體驗不好;另外一種主動刷新Token,在過期後自動續約,或者定時任務定期去刷新Token,以保持Token始終在有效期內;我們現在採用被動的方式獲取和更新Token。

希望我的回答,能夠幫助到你!我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


分享到:


相關文章: