關於JWT(Json Web Token)的思考及使用心得
JWT由三部分組成頭部(header)、載荷(payload)、簽名(signature)。頭部定義型別和加密方式;載荷部分放不是很重要的資料;簽名使用定義的加密方式加密base64後的header和payload和一段你自己的加密key。最後的token由base64(header).base64(payload).base64(signatrue)組成。
使用方式
平時需要鑑權的介面需要傳這個token,可以post欄位提交,但是一般建議放在header頭中 ,因為JWT一般配合https使用,這樣就萬無一失。
為什麼安全?
首先token是服務端簽發,然後驗證時是用同樣加密方式把header、payload和key再加密遍 然後看是不是和簽名一致 如果不一致就說明token是非法的 這裡主要靠的是加密(比如HS256)難以被攻破 至少目前吧 另外不得不說這裡的加密對伺服器來說是一個開銷 這也是JWT的缺點
使用
我很早就聽說過JWT 但那時候還沒用上 感覺近幾年前後端分離思想加速了JWT的使用 MVC前置到前端(VUE、REACT)後端只用提供API API強調無狀態 自然而然使用了JWT這套方案
之前做小程式時 沒有絕對使用JWT這套方案 我把它簡化了下
最近開發的一套專案用的是Laravel做後端提供API服務,所以自然而然使用了JWT,使用的擴充套件是tymon/jwt-auth 關於這套擴充套件機制的具體使用可以參考這篇文章 寫的很不錯:ofollow,noindex">https://laravel-china.org/articles/10885/full-use-of-jwt
專案使用時的具體細節
JWT三個時間概念
JWT有三個時間概念: 過期時間 寬限時間 重新整理時間
上面那文章說token過了過期時間是不可重新整理的,但其實是可以重新整理的,我這邊使用時可以(開啟了黑名單機制和1min寬限時間) 但是過了重新整理時間不能重新整理這是肯定的
token重新整理
可以借用laravel的中介軟體實現自動重新整理 服務端判斷過期了但是在重新整理時間內主動重新整理一次 並把新的token在Header頭中返回給客戶端
記住我功能
我感覺定義重新整理時間(比如一個月) + token自動重新整理機制這一套就是記住我功能
不能主動銷燬Token
預設JWT這套方案好像不可以主動剔除使用者的,因為服務端不會存token,只是驗證。這和session不一樣。 但是我感覺可以借用黑名單機制 來判斷 中介軟體中判斷該token在剔除黑名單中就銷燬token並返回鑑權失敗
單點登入
結合快取比如redis存客戶端標識是可以的
多套使用者許可權機制
比如客戶端有使用者端和商家端兩套使用者機制(不同表),可以在auth.php定義兩個guard 分別指定對應的model Login邏輯單獨寫 比如auth(‘userApi’) auth(‘corpApi’) 可以拿到不同的guard 重新整理中介軟體是可以共用的 不過router中的middleware方法可以指定具體的middleware
為什麼不同許可權體系的重新整理中介軟體可以公用
感覺是jwt-auth實現了這機制 驗證token時會根據sub欄位判斷 我base64decode兩個token的payload後發現sub一個是1 一個是2
如果有問題歡迎指正!