JSON Web Token(JWT) 簡介

二十亿光年的孤独發表於2024-05-07

JSON Web Token(JWT) 簡介

1 什麼是 JWT?

JWT(JSON Web Token)是認證解決方案,下面介紹它的原理和用法.

2 JWT 的結構

JWT 的結構如下

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT的具體表現是一個長字串,中間用點(.)分隔成三個部分

這三部分分別指的是

Header(頭部)
Payload(負載)
Signature(簽名)

即:

Header.Payload.Signature

2.1 Header

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

alg屬性表示簽名的演算法,預設是 HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的型別(type),一般是這兩個屬性,當然也可以加上其他自定義的屬性。

將上面的 JSON 物件使用 Base64URL 演算法編碼就構成了 JWT 的 Header。

2.2 Payload

Payload 用來存放實際需要傳遞的資料。JWT 規定了下面7個可選欄位(建議但不強制使用)。

iss (issuer):簽發人
exp (expiration time):過期時間
sub (subject):主題
aud (audience):受眾
nbf (Not Before):生效時間
iat (Issued At):簽發時間
jti (JWT ID):編號

除了官方可選欄位,你可以在這個部分定義私有欄位,如下:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

同樣上面的 JSON 物件使用 Base64URL 演算法編碼就構成了 JWT 的 Payload。

2.3 Signature

Signature 部分是對前兩部分的簽名,防止資料篡改。

首先,需要指定一個金鑰(secret)然後,使用 Header 裡面指定的簽名演算法(預設是 HMAC SHA256),按照下面的公式產生簽名。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

secret 要儲存在服務端,JWT的簽發和驗證都需要用這個 secret,不能洩露

同樣使用 Base64URL 演算法編碼就構成了 signature

最後,把 Header、Payload、Signature 三個部分拼成一個字串,每個部分之間用"點"(.)分隔,就組成了完整的 JWT

3 使用方式

服務端返回 JWT 給客戶端,此後,客戶端每次與伺服器通訊,都要帶上這個 JWT。可以放在 HTTP 請求的頭資訊Authorization欄位裡面。

Authorization: Bearer <token>

或放在 POST 請求的資料體裡面

參考連結

  • https://jwt.io/introduction/
  • https://mgleon08.github.io/blog/2018/07/16/jwt/
  • https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

相關文章