官方github地址:https://github.com/jwtk/jjwt
官網地址: https://jwt.io/
1、簡介
JWT,全稱是 Json Web Token , 是一種 JSON 風格的輕量級的授權和身份認證規範,可實現無狀態、分佈式的 Web 應用授權。
JWT 作爲一種規範,並沒有和某一種語言綁定在一起,常用的 Java 實現是 GitHub 上的開源項目 jjwt,地址如下:https://github.com/jwtk/jjwt
2、JWT 數據格式
JWT 包含三部分數據:
1.Header:頭部,通常頭部有兩部分信息:
-
聲明類型,這裏是JWT
-
加密算法,自定義
我們會對頭部進行 Base64Url 編碼(可解碼),得到第一部分數據。
2.Payload:載荷,就是有效數據,在官方文檔中(RFC7519),這裏給了 7 個示例信息:
-
iss (issuer):表示簽發人
-
exp (expiration time):表示token過期時間
-
sub (subject):主題
-
aud (audience):受衆
-
nbf (Not Before):生效時間
-
iat (Issued At):簽發時間
-
jti (JWT ID):編號
這部分也會採用 Base64Url 編碼,得到第二部分數據。
3.Signature:簽名,
是整個數據的認證信息。一般根據前兩步的數據,再加上服務的的密鑰 secret(密鑰保存在服務端,不能泄露給客戶端),通過 Header 中配置的加密算法生成。用於驗證整個數據完整和可靠性。
點隔開的三部分,對應前面的三部分
3、JWT 存在的問題
說了這麼多,JWT 也不是天衣無縫,由客戶端維護登錄狀態帶來的一些問題在這裏依然存在,舉例如下:
-
續簽問題,這是被很多人詬病的問題之一,傳統的 cookie+session 的方案天然的支持續簽,但是 jwt 由於服務端不保存用戶狀態,因此很難完美解決續簽問題,如果引入 redis,雖然可以解決問題,但是 jwt 也變得不倫不類了。
-
註銷問題,由於服務端不再保存用戶信息,所以一般可以通過修改 secret 來實現註銷,服務端 secret 修改後,已經頒發的未過期的 token 就會認證失敗,進而實現註銷,不過畢竟沒有傳統的註銷方便。
-
密碼重置,密碼重置後,原本的 token 依然可以訪問系統,這時候也需要強制修改 secret。
-
基於第 2 點和第 3 點,一般建議不同用戶取不同 secret。
所以一般和redis一起用