帶你弄懂JWT原理


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有助於減少服務器請求數據庫的次數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM