Token 學習記錄

Token


Token “令牌”的意思,是由服務端生成的一串字符串,作爲客戶端進行請求時身份驗證的一個標識。

Token進行身份驗證的簡單流程:

  1.  用戶第一次登錄系統時,需要使用用戶名和密碼。
  2.  服務端接收到用戶名與密碼,進行身份驗證,如果驗證通過。
  3. 服務端生成一個token字符串,服務端把token字符串保存到服務端的內存中(流行使用將Token信息保存到Redis中),並將該token字符串返回給客戶端。
  4. 客戶端將服務端返回的token字符串保存到本地,如:Cookie或Local Storage(本地存儲)。
  5. 當客戶端再次向服務端發送請求的時候,需要帶上token字符串,一起發送到服務端。
  6. 服務端收到帶有token的請求之後,與本地的緩存中的token字符串進行對比。
  7. 如果驗證通過,返回請求需要的結果信息。如果驗證失敗,返回提示信息。

 



Token簡單組成


       uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長度的十六進制字符串。爲防止token泄露)。

       Token是在服務端產生的。如果前端使用用戶名密碼向服務端請求認證,服務端認證成功,那麼在服務端會返回Token給前端。前端可以在每次請求的時候帶上Token證明自己的合法地位。如果這個Token在服務端持久化(如存入數據庫),那麼就是一個永久的身份令牌了。

 


Token的有效期


       當我們登錄CSDN的時候,如果我們的密碼長期未修改,系統會提示我們定期修改密碼,這樣爲了防止用戶名/密碼泄露,帶來安全隱患。所以密碼是需要有效期的。Token也當然是需要有效期的。根據系統的安全需要,選擇合適的有效期時間長度。


       正常情況下:當用戶的Token失效之後,需要用戶重新登錄,獲取新的Token信息,該Token在有效期內是可以不需要重複驗證用戶名密碼的。但是當用戶正在使用應用程序的時候,有效期到了,用戶被強制退出,要求重新登錄系統,這樣是很不友好的。比如用戶正在錄入表單,馬上填寫完成了,被強制退出,用戶會瘋掉的。


       所以有的時候需要用戶去自動刷新(推遲)Token的過期時間,將有效期時間變得更長。比如,用戶在每次向服務器發送請求的時候,都去刷新Token的過期時間,Session 就是採用這種策略來保持用戶登錄狀態的。當每次請求服務端的時候都去刷新Token的時候,存在一個問題,就是當用戶量很大的時候,每次用戶請求服務端的時候都去刷新Token的過期時間,這樣的的代價是非常大的,如,把Token持久化到數據庫了,如果每秒有很多請求,那麼每秒就要去修改保存Token信息表很多次,如果請求量很大,數據庫會受不了的。有時爲了提升Token的狀態更新時的效率,會把Token信息保存到緩存或內存中,比如:可以把Token信息保存到Redis中。


      上面的方案,把Token信息保存到緩存或者內存的時候,當訪問量很高的時候,還是對服務器的效率產生影響的。
但是如果我們刷新Token信息的過期時間不是那麼頻繁,當Token快要過期的時候,在進行刷新,這樣就會避免頻繁的讀寫操作。這時我們可以使用Refresh Token,它可以很好的避免頻繁的讀寫操作。這個方案中服務端不需要刷新Token的過期時間,一旦Token過期或者快過期了,就反饋給前端,前端使用Refresh Token申請一個全新的Token繼續使用。這時服務端只需要在客戶端請求更新Token的時候對Refresh Token的有效期進行一次檢查,大大減少了更新有效期的操作,也避免了頻繁讀寫操作。

 

參考文檔

https://my.oschina.net/jamesfancy/blog/1613994

https://www.cnblogs.com/lufeiludaima/p/pz20190203.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章