1分鐘學會SpringBoot2知識點,讓你35歲不再失業(七)

第二十六節、1分鐘學會SpringBoot2知識點,讓你35歲不再失業(七)

第二十六節、springboot2整合JWT

1 、傳統的session認證
傳統session認證的方式:cookie和session結合使用
1.用戶向服務器發送用戶名和密碼。
2.驗證服務器後,用戶信息將保存在session中。
3.服務器會把session_id寫入到用戶的Cookie。

4.用戶後續每個請求都將通過在Cookie中取出session_id傳給服務器。
5.服務器收到session_id並對比之前保存的數據,確認用戶的身份。
這種模式最大的問題是,沒有分佈式架構,無法支持橫向擴展。如果使用一個服務器,該模式完全沒有問題。但是,如果它是服務器
集羣部署的話,則需要一個統一的session數據庫(一般使用redis來存儲)來保存會話數據實現共享,這樣負載均衡下的每個服務器纔可
以正確的驗證用戶身份。
2、 基於token的鑑權機制
基於token的鑑權機制類似於http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味着基於token
認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就爲應用的擴展提供了便利。
流程上是這樣的:
用戶使用用戶名密碼來請求服務器
服務器進行驗證用戶的信息
服務器通過驗證發送給用戶一個token
客戶端存儲token,並在每次請求時附送上這個token值
服務端驗證token值,通過後放行處理具體業務。
3 、JWT 是什麼
JWT 全稱 JSON Web Tokens ,是一種規範化的 token。是對 token 這一技術提出一套規範。
4、JWT 結構
jwt有3個組成部分,每部分通過點號來分割 header.payload.signature

頭部(header) 是一個 JSON 對象
負載(payload) 是一個 JSON 對象,用來存放實際需要傳遞的數據
簽名(signature) 對header和payload使用密鑰進行簽名,防止數據篡改。

頭部 header

Jwt的頭部是一個JSON,然後使用Base64URL編碼,承載兩部分信息:
聲明類型typ,表示這個令牌(token)的類型(type),JWT令牌統一寫爲JWT
聲明加密的算法alg,通常直接使用HMACSHA256,就是HS256了,也可以使用RSA,支持很多算法(HS256、HS384、HS512、
RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384)

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

Base64URL 編碼後(Base64編碼後可能出現字符+和/,在URL中不能直接作爲參數,Base64URL就是把字符+和/分別變成-和
_。JWT有可能放在url中,所以要用Base64URL編碼。)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

負載 payload

payload也是一個JSON字符串,是承載消息具體內容的地方,也需要使用Base64URL編碼,就是存儲我們要保存到客戶端的信息,一
般都是包含用戶的基本信息,權限信息,時間戳等信息。
JWT指定了一些官方字段(claims)備用:

iss: 簽發人
exp: 過期時間
iat: 簽發時間
nbf: 生效時間
jti: 編號
sub: 主題
aud: 受衆

除了官方字段,在這個部分還可以添加私有字段,例如:

{
  "sub": "fcf34b56-a7a2-4719-9236-867495e74c31",
  "jwt-roles-key_": [

Base64URL編碼的後:
 簽名 Signature
Signature部分是對前兩部分的防篡改簽名。將Header和Payload用Base64URL編碼後,再用點(.)連接起來。然後使用簽名算法和密鑰
對這個字符串進行簽名:
首先,需要指定一個密碼(secret)。該密碼保存在服務器中,並且不能向用戶公開。然後,使用標頭中指定的簽名算法根據以下公式
生成簽名。signature = HMACSHA256(header + "." + payload, secret); 在計算出簽名哈希後,JWT頭,有效載荷和簽名哈希的三個部
分組合成一個字符串,每個部分用"."分隔,就構成整個JWT對象。 以上三部分都是在服務器定義,當用戶登陸成功後,根據用戶信
息,按照jwt規則生成token返回給客戶端。
簽名信息:
組合在一起
3部分組合在一起,構成了完整的jwt:
    "超級管理員"
 ],
  "iss": "yingxue.com",
  "jwt-permissions-key": [
    "sys:user:list",
    "sys:dept:update",
    "sys:dept:detail",
    "sys:user:role:update",
    "sys:permission:add",
    "sys:user:add",
    "sys:permission:update",
    "sys:user:deleted",
    "sys:user:detail",
    "sys:dept:deleted",
    "sys:role:update",
    "sys:role:detail",
    "sys:dept:list",
    "sys:dept:add",
    "sys:user:update",
    "sys:role:list",
    "sys:role:deleted",
    "sys:permission:list",
    "sys:permission:detail",
    "sys:permission:deleted",
    "sys:log:deleted",
    "sys:user:role:detail",
    "sys:role:add",
    "sys:log:list"
 ],
  "jwt-user-name-key": "admin",
  "exp": 1584014849,
  "iat": 1584007649
}

Base64URL編碼的後:

eyJzdWIiOiJmY2YzNGI1Ni1hN2EyLTQ3MTktOTIzNi04Njc0OTVlNzRjMzEiLCJqd3Qtcm9sZXMta2V5XyI6WyLotoXnuqfnrqHnkIbl
kZgiXSwiaXNzIjoieWluZ3h1ZS5jb20iLCJqd3QtcGVybWlzc2lvbnMta2V5IjpbInN5czp1c2VyOmxpc3QiLCJzeXM6ZGVwdDp1cGRh
dGUiLCJzeXM6ZGVwdDpkZXRhaWwiLCJzeXM6dXNlcjpyb2xlOnVwZGF0ZSIsInN5czpwZXJtaXNzaW9uOmFkZCIsInN5czp1c2VyOmFk
ZCIsInN5czpwZXJtaXNzaW9uOnVwZGF0ZSIsInN5czp1c2VyOmRlbGV0ZWQiLCJzeXM6dXNlcjpkZXRhaWwiLCJzeXM6ZGVwdDpkZWxl
dGVkIiwic3lzOnJvbGU6dXBkYXRlIiwic3lzOnJvbGU6ZGV0YWlsIiwic3lzOmRlcHQ6bGlzdCIsInN5czpkZXB0OmFkZCIsInN5czp1
c2VyOnVwZGF0ZSIsInN5czpyb2xlOmxpc3QiLCJzeXM6cm9sZTpkZWxldGVkIiwic3lzOnBlcm1pc3Npb246bGlzdCIsInN5czpwZXJt
aXNzaW9uOmRldGFpbCIsInN5czpwZXJtaXNzaW9uOmRlbGV0ZWQiLCJzeXM6bG9nOmRlbGV0ZWQiLCJzeXM6dXNlcjpyb2xlOmRldGFp
bCIsInN5czpyb2xlOmFkZCIsInN5czpsb2c6bGlzdCJdLCJqd3QtdXNlci1uYW1lLWtleSI6ImFkbWluIiwiZXhwIjoxNTg0MDE0ODQ5
LCJpYXQiOjE1ODQwMDc2NDl9

簽名 Signature

Signature部分是對前兩部分的防篡改簽名。將Header和Payload用Base64URL編碼後,再用點(.)連接起來。然後使用簽名算法和密鑰
對這個字符串進行簽名:

signature = HMACSHA256(header + "." + payload, secret);

首先,需要指定一個密碼(secret)。該密碼保存在服務器中,並且不能向用戶公開。然後,使用標頭中指定的簽名算法根據以下公式
生成簽名。signature = HMACSHA256(header + “.” + payload, secret); 在計算出簽名哈希後,JWT頭,有效載荷和簽名哈希的三個部
分組合成一個字符串,每個部分用"."分隔,就構成整個JWT對象。 以上三部分都是在服務器定義,當用戶登陸成功後,根據用戶信
息,按照jwt規則生成token返回給客戶端
簽名信息:

KCL2-R5_OSsUw9S1-CZoCakO1OIPnwICH-tZozifoNM

組合在一起
3部分組合在一起,構成了完整的jwt:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmY2YzNGI1Ni1hN2EyLTQ3MTktOTIzNi04Njc0OTVlNzRjMzEiLCJqd3Q
tcm9sZXMta2V5XyI6WyLotoXnuqfnrqHnkIblkZgiXSwiaXNzIjoieWluZ3h1ZS5jb20iLCJqd3QtcGVybWlzc2lvbnMta2V5IjpbInN
5czp1c2VyOmxpc3QiLCJzeXM6ZGVwdDp1cGRhdGUiLCJzeXM6ZGVwdDpkZXRhaWwiLCJzeXM6dXNlcjpyb2xlOnVwZGF0ZSIsInN5czp
wZXJtaXNzaW9uOmFkZCIsInN5czp1c2VyOmFkZCIsInN5czpwZXJtaXNzaW9uOnVwZGF0ZSIsInN5czp1c2VyOmRlbGV0ZWQiLCJzeXM
6dXNlcjpkZXRhaWwiLCJzeXM6ZGVwdDpkZWxldGVkIiwic3lzOnJvbGU6dXBkYXRlIiwic3lzOnJvbGU6ZGV0YWlsIiwic3lzOmRlcHQ
6bGlzdCIsInN5czpkZXB0OmFkZCIsInN5czp1c2VyOnVwZGF0ZSIsInN5czpyb2xlOmxpc3QiLCJzeXM6cm9sZTpkZWxldGVkIiwic3l
zOnBlcm1pc3Npb246bGlzdCIsInN5czpwZXJtaXNzaW9uOmRldGFpbCIsInN5czpwZXJtaXNzaW9uOmRlbGV0ZWQiLCJzeXM6bG9nOmR
lbGV0ZWQiLCJzeXM6dXNlcjpyb2xlOmRldGFpbCIsInN5czpyb2xlOmFkZCIsInN5czpsb2c6bGlzdCJdLCJqd3QtdXNlci1uYW1lLWt
leSI6ImFkbWluIiwiZXhwIjoxNTg0MDE0ODQ5LCJpYXQiOjE1ODQwMDc2NDl9.KCL2-R5_OSsUw9S1-CZoCakO1OIPnwICHtZozifoNM

5、使用要點

JWT默認是不加密的,但也可以加密,不加密時不宜在jwt中存放敏感信息
不要泄露簽名密鑰(secret)
jwt簽發後無法撤回,有效期不宜太長
JWT 泄露會被人冒用身份,爲防止盜用,JWT應儘量使用 https 協議傳輸

6、 JWT 怎麼用

以瀏覽器接收到服務器發過來的jwt後,可以存儲在Cookie 或 localStorage 中。之後,瀏覽器每次與服務器通信時都會帶上JWT。可以將JWT放在Cookie中,會自動發送(不跨域),或將JWT放在HTTP請求頭的授權字段中。
也可放在url中,或POST請求的數據體中
$.ajax({  
   url: "/api/user",  
   dataType: 'json',  
   type: 'GET',  
   beforeSend: function (request) {  
       request.setRequestHeader("authorization", "後端生成的token");  
   },  
   async: true,  
   cache: false,  
   success: function (res) {  
   }  
}); 

7、springboot2封裝jwt

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