三大特性 封裝 利用抽象數據類型將數據和基於數據的操作封裝在一起,使其構成一個不可分割的獨立實體。數據被保護在抽象數據類型的內部,儘可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯繫。用戶無需知道對象內部的細節,但可以通過對象對外提供的介面來訪問該對象。 優點: 減少耦合: 可以獨立地開發、 ...
JWT基礎概念詳解
JWT介紹
之前我們文章講過分散式session如何存儲,其中就講到過Token、JWT。首先,我們來回顧一下使用Token進行身份認證。
- 客戶端發送登錄請求到伺服器
- 伺服器在用戶登錄成功之後會生成一個token,此時這個token可能會被存儲到資料庫、Redis等,實現可以共用,服務端會把生成的token返回給客戶端
- 客戶端也會存儲這個token,每次請求需要攜帶這個token即可。
JWT是token的另一種方式,又有很多不同點。JWT全稱是JSON Web Token,它的本質是一個字元串,它裡面包含數據和簽名,接下來我們看看JWT是如何進行身份認證的。
- 客戶端發送登錄請求到伺服器
- 伺服器在用戶登錄成功之後簽發一個JWT Token,之後會把這個token直接返回給客戶端,此時伺服器端是不存儲任何用戶信息的。
- 客戶端存儲JWT Token,每次請求時攜帶這個token
- 服務端在每次請求前,檢查傳過來的token,判斷簽名、過期時間,驗證通過後可以解析出token裡面包含的用戶信息。
JWT組成
JWT主要由3部分組成,分別是Header、payload、signature。下麵我們具體講講每部分的作用。
Header
Header主要存儲token類型和簽名演算法相關信息,例如
{
"alg": "HS256",
"typ": "JWT"
}
然後會把這個json字元串使用Base64進行編碼,作為JWT的Header部分。
Payload
Payload主要是存儲信息的,裡面可以存儲業務數據或者用戶信息, JWT有以下7個預設欄位可以選用。
- iss: Issure JWT簽發方
- iat: Issued at time JWT簽發時間
- sub: Subject JWT主題
- aud: Audience JWT接收方
- exp: Expiration time JWT過期時間
- nbf: Not before time JWT生效時間
- jti: JWT ID
下麵我們舉個例子
{
"sub": "123456",
"username": "admin"
}
上面的json字元串會使用Base64進行編碼,作為JWT的Payload部分,Payload部分預設是不加密的,所以一定不要把隱私信息放在Payload當中。
Signature
Signature是對上面兩部分的數據的簽名,對上面的Header和Payload數據,通過指定的演算法生成Hash,防止數據被篡改。下麵是簽名的計算公式
HMACSHA256(base64UrkEncode(header) + "." + base64UrlEncode(payload), secret)
在計算出簽名後,將上述的Header、Payload和Signature連接成一個字元串,中間使用"."進行分隔,這個就是最終的JWT。
JWT和Token區別
- Token需要查詢進行驗證,JWT不需要,可以直接進行校驗。
- Token需要存儲在伺服器端,JWT在伺服器端不存儲任何信息。
- Token可以在伺服器端進行管理用戶,例如登出、禁用,JWT不可以,JWT依賴客戶端刪除本地的JWT Token。
原文鏈接:https://monkey.blog.xpyvip.top/archives/jwt-ji-chu-gai-nian-xiang-jie