一分鐘帶你瞭解JWT認證!

1、JWT簡介

JSON Web Token(JWT)是一個開放的標準(RFC 7519),它定義了一個緊湊且自包含的方式,用於在各方之間做爲JSON對象安全地傳輸信息。因爲此信息是通過數字簽名的,所以能夠被驗證和信任。前端

更多信息能夠查看官網:jwt.io/introductio…算法

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

  1. session認證

http協議是一種無狀態的協議,而這就意味着若是用戶向咱們的應用提供了用戶名和密碼來進行用戶認證,那麼下一次請求時,用戶還要再一次進行用戶認證才行,由於根據http協議,咱們並不能知道是哪一個用戶發送的請求,因此爲了讓咱們的應用能識別是哪一個用戶發出的,咱們只能在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存爲cookie,以便下次請求時發送給咱們的應用,這樣咱們的應用個就能識別請求來自哪一個用戶了,這就是傳統的基於sessino認證。瀏覽器

  1. JWT認證

基於token的鑑權機制相似於http協議也是無狀態的,它不須要在服務端去保留用戶的認證信息或會話信息。這也就意味着JWT認證機制的應用不須要去考慮用戶在哪一臺服務器登陸了,這就爲應用的擴展提供了便利。安全

3、JWT認證流程

JWT認證流程

認證流程以下:bash

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

4、JWT組成

先來看一張JWT的信息的截圖:服務器

JWT截圖

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

  1. 頭部(header)

JWT的頭部有兩部分信息:session

  • 聲明類型,這裏是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的驗證,因此,它就是你服務端的私鑰,在任何場景都不該該泄露出去。

5、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等高併發分佈式、大數據、機器學習等技術。 關注下方公衆號便可免費領取:

Java碎碎念公衆號
相關文章
相關標籤/搜索