首頁 >常見問題 >jwt是什麼

jwt是什麼

coldplay.xixi
coldplay.xixi原創
2020-10-30 10:56:129959瀏覽

jwt只是縮寫,全拼則是JSON Web Tokens,是目前流行的跨域認證解決方案,一種基於JSON的、用於在網路上聲明某種主張的令牌token。

jwt是什麼

JWT 原理

#jwt驗證方式是將使用者資訊透過加密產生token,每次請求服務端只需要使用已儲存的金鑰驗證token的正確性,不用再儲存任何session資料了,進而服務端變得無狀態,容易實現拓展。

加密前的使用者訊息,如:

{
    "username": "vist",
    "role": "admin",
    "expire": "2018-12-08 20:20:20"
}

客戶端收到的token:

7cd357af816b907f2cc9acbe9c3b4625

JWT 結構

##一個token分為3部分:

  • 頭部(header)

  • #載荷(payload)

  • #簽章(signature)

3個部分以「.」分隔,如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT的頭部分是一個JSON對象,描述元數據,通常是:

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

typ 為聲明類型,指定"JWT"

alg 為加密的演算法,預設為"HS256"

也可以是下列中的演算法:

jwt是什麼

載荷

」荷載(payload)是資料的載體,用來存放實際需要傳遞的資料訊息,也是一個JSON物件。

JWT官方推薦欄位:
  • iss: jwt簽發者
  • sub: jwt所面向的使用者
  • aud: 接收jwt的一方
  • exp: jwt的過期時間,這個過期時間必須大於簽發時間
  • nbf: 定義在什麼時間之前,該jwt都是不可用的.
  • iat: jwt的簽發時間
  • jti: jwt的唯一身份標識,主要用來作為一次性token,從而迴避重播攻擊。

也可以使用自訂字段,如:

{
    "username": "vist",
    "role": "admin"
}
#簽名

簽名部分是對前兩部分(頭部,載荷)的簽名,防止資料竄改。

按下列步驟產生:

1、先指定金鑰(secret)

#2、把頭部(header)和載重(payload)資訊分別base64轉換

3、使用頭部(header)指定的演算法加密

最終,簽章(signature) = HMACSHA256(base64UrlEncode(header) "." base64UrlEncode(payload),secret)

客戶端得到的簽章:

header.payload.signature

也可以對JWT進行再加密。

JWT 使用

1、服務端依照使用者登入狀態,將使用者資訊加密到token中,回饋給客戶端

#2、客戶端收到服務端回傳的token,儲存在cookie中

3、客戶端和服務端每次通訊都帶上token,可以放在http請求頭資訊中,如:Authorization欄位裡面

4、服務端解密token,驗證內容,完成對應邏輯

JWT 特點

  • JWT更簡潔,更適合在HTML和HTTP環境中傳遞
  • JWT適合一次性驗證,如:啟動郵件
  • JWT適合無狀態認證
  • JWT適合服務端CDN分發內容
  • 相對於資料庫Session查詢更加省時
  • JWT預設不加密
  • 使用期間不可取消令牌或更改令牌的權限
  • #JWT建議使用HTTPS協定來傳輸程式碼
###

以上是jwt是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn