jwt講解及工具類

 

 

官方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 也不是天衣無縫,由客戶端維護登錄狀態帶來的一些問題在這裏依然存在,舉例如下:

  1. 續簽問題,這是被很多人詬病的問題之一,傳統的 cookie+session 的方案天然的支持續簽,但是 jwt 由於服務端不保存用戶狀態,因此很難完美解決續簽問題,如果引入 redis,雖然可以解決問題,但是 jwt 也變得不倫不類了。

  2. 註銷問題,由於服務端不再保存用戶信息,所以一般可以通過修改 secret 來實現註銷,服務端 secret 修改後,已經頒發的未過期的 token 就會認證失敗,進而實現註銷,不過畢竟沒有傳統的註銷方便。

  3. 密碼重置,密碼重置後,原本的 token 依然可以訪問系統,這時候也需要強制修改 secret。

  4. 基於第 2 點和第 3 點,一般建議不同用戶取不同 secret。                                                                                                       

所以一般和redis一起用

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