1.JWT介紹
2.1 jwt原則
- 最簡單理解:jwt本質就是,
把用戶信息通過加密后生成的一個字符串
JWT的原則是在服務器身份驗證之后,將生成一個JSON對象並將其發送回用戶
{
"UserName": "Chongchong",
"Role": "Admin",
"Expire": "2018-08-08 20:15:56"
}
之后,當用戶與服務器通信時,客戶在請求中發回JSON對象,服務器僅依賴於這個JSON對象來標識用戶。
為了防止用戶篡改數據,服務器將在生成對象時添加簽名(有關詳細信息,請參閱下文)。
服務器不保存任何會話數據,即服務器變為無狀態,使其更容易擴展
2.2 JWT的數據結構
- 1)jwt頭:JWT頭部分是一個描述JWT元數據的JSON對象
- 2)有效載荷:七個默認字段+自定義私有字段
- 3)簽名=HMACSHA256( base64UrlEncode(header) +"."+base64UrlEncode(payload) ,secret)
第一部分:
JWT頭
base64UrlEncode(header)
--->字符串
# JWT頭部分是一個描述JWT元數據的JSON對象,通常如下所示。
{
"alg": "HS256",
"typ": "JWT"
}
# 1)alg屬性表示簽名使用的算法,默認為HMAC SHA256(寫為HS256);
# 2)typ屬性表示令牌的類型,JWT令牌統一寫為JWT。
# 3)最后,使用Base64 URL算法將上述JSON對象轉換為字符串保存。
第二部分:
有效載荷
沒有敏感數據的用戶信息
base64UrlEncode(payload)
--->字符串
#1、有效載荷部分,是JWT的主體內容部分,也是一個JSON對象,包含需要傳遞的數據。 JWT指定七個默認
字段供選擇。
'''
iss:發行人
exp:到期時間
aud:用戶
nbf:在此之前不可用
iat:發布時間
jti:JWT ID用於標識該JWT
'''
#2、除以上默認字段外,我們還可以自定義私有字段,如下例:
{
"sub": "1234567890",
"name": "chongchong",
"admin": true
}
#3、注意
默認情況下JWT是未加密的,任何人都可以解讀其內容,因此不要構建隱私信息字段,存放保密信息,以防 止信息泄露。
JSON對象也使用Base64 URL算法轉換為字符串保存。
第三部分:
簽名哈希
- 簽名=HMACSHA256
( base64UrlEncode(header)
+ "." +base64UrlEncode(payload)
,secret)
# 1.簽名哈希部分是對上面兩部分數據簽名,通過指定的算法生成哈希,以確保數據不會被篡改。
# 2.首先,需要指定一個密碼(secret),該密碼僅僅為保存在服務器中,並且不能向用戶公開。
# 3.然后,使用標頭中指定的簽名算法(默認情況下為HMAC SHA256)根據以下公式生成簽名。
# 4.HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
# 5.在計算出簽名哈希后,JWT頭,有效載荷和簽名哈希的三個部分組合成一個字符串,每個部分用"."分 隔,就構成整個JWT對象。
2.3 jwt核心
- 1)給用戶頒發的token值相當於一把鎖,服務器端的秘鑰相當於一把鑰匙
- 2)每次客戶端請求都會攜帶這把鎖,服務器端用秘鑰去開這把鎖,若果無法打開就證明是偽造的
2.4 jwt特點分析
- 1、JWT的最大缺點是服務器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的權限,一旦JWT簽發,在有效期內將會一直有效。
- 2、JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權限。
- 3、為了減少盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸。
- 4、JWT不僅可用於認證,還可用於信息交換,善用JWT有助於減少服務器請求數據庫的次數。