1. 程式人生 > >一分鐘帶你瞭解JWT認證!

一分鐘帶你瞭解JWT認證!

目錄

  • 一、JWT簡介
  • 二、JWT認證和session認證的區別
  • 三、JWT認證流程
  • 四、JWT組成
  • 五、JWT使用場景

一、JWT簡介

JSON Web Token(JWT)是一個開放的標準(RFC 7519),它定義了一個緊湊且自包含的方式,用於在各方之間作為JSON物件安全地傳輸資訊。由於此資訊是經過數字簽名的,因此可以被驗證和信任。

更多資訊可以檢視官網:https://jwt.io/introduction/

二、JWT認證和session認證的區別

  1. session認證

http協議是一種無狀態的協議,而這就意味著如果使用者向我們的應用提供了使用者名稱和密碼來進行使用者認證,那麼下一次請求時,使用者還要再一次進行使用者認證才行,因為根據http協議,我們並不能知道是哪個使用者傳送的請求,所以為了讓我們的應用能識別是哪個使用者發出的,我們只能在伺服器儲存一份使用者登陸的資訊,這份登陸資訊會在響應時傳遞給瀏覽器,告訴其儲存為cookie,以便下次請求時傳送給我們的應用,這樣我們的應用個就能識別請求來自哪個使用者了,這就是傳統的基於sessino認證。

  1. JWT認證

基於token的鑑權機制類似於http協議也是無狀態的,它不需要在服務端去保留使用者的認證資訊或會話資訊。這也就意味著JWT認證機制的應用不需要去考慮使用者在哪一臺伺服器登入了,這就為應用的擴充套件提供了便利。

三、JWT認證流程

認證流程如下:

  1. 使用者使用賬號和密碼發出post請求;
  2. 伺服器使用私鑰建立一個jwt;
  3. 伺服器返回這個jwt給瀏覽器;
  4. 瀏覽器將該jwt串在請求頭中像伺服器傳送請求;
  5. 伺服器驗證該jwt;
  6. 返回響應的資源給瀏覽器。

四、JWT組成

先來看一張JWT的資訊的截圖:

從上圖可以看到,JWT含有三部分:頭部(header)、載荷(payload)、簽名(signature)。

  1. 頭部(header)

JWT的頭部有兩部分資訊:

  • 宣告型別,這裡是JWT
  • 宣告加密的演算法,通常直接使用HMAC SHA256

頭部示例如下:

{
  "alg": "HS256",
  "typ": "JWT"
}

頭部一般使用base64加密,加密後密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

  1. 載荷(payload)

該部分一般存放一些有效的資訊。JWT的標準定義包含五個欄位:

  • iss:該JWT的簽發者
  • sub: 該JWT所面向的使用者
  • aud: 接收該JWT的一方
  • exp(expires): 什麼時候過期,這裡是一個Unix時間戳
  • iat(issued at): 在什麼時候簽發的

載荷示例如下:

{
  "sub": "1234567890",
  "name": "Java碎碎念",
  "iat": 1516239022
}
  1. 簽名(signature)

前面兩部分都是使用Base64進行編碼的,即前端可以解開知道里面的資訊。signature 需要使用編碼後的header和payload以及我們提供的一個金鑰,然後使用header中指定的簽名演算法(HS256)進行簽名。簽名的作用是保證 JWT 沒有被篡改過。

三個部分通過.連線在一起就是我們的 JWT 了,所以我們生成的JWT如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphdmHnoo7noo7lv7UiLCJpYXQiOjE1MTYyMzkwMjJ9.LLJIkhJs6SVYlzn3n8fThQmhGutjTDI3RURTLtHV4ls

注意:金鑰就是用來進行JWT的簽發和JWT的驗證,所以,它就是你服務端的私鑰,在任何場景都不應該洩露出去。

五、JWT使用場景

JWT主要使用場景如下:

  • 授權

這是JWT使用最多的場景,一旦使用者登入,每個後續的請求將包括JWT,從而允許使用者訪問該令牌允許的路由、服務和資源。

  • 資訊交換:JSON

JWT可以用在各方之間安全地傳輸資訊,因為JWT可以進行簽名,所以您可以確定發件人是他們所說的人。另外,由於簽名是使用標頭和有效負載計算的,因此您還可以驗證內容是否未被篡改。

到此JWT的基礎和認證原理已經講完了,下一篇文章將介紹下SpringBoot中整合JWT,敬請期待哦。

推薦閱讀

1.利用SpringBoot+Logback手寫一個簡單的鏈路追蹤
2.SpringBoot中如何優雅的讀取yml配置檔案?
3.SpringBoot中如何靈活的實現介面資料的加解密功能?
4.SpringBoot中神奇的@Enable*註解?
5.Java中Integer.parseInt和Integer.valueOf,你還傻傻分不清嗎?


限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分散式、大資料、機器學習等技術。
關注下方公眾號即可免費領取: