Stan Blog

學習過程中的一些記錄

JSON Web Token (JWT)

JWT 全名 JSON Web Token

什麼是 JWT

JWT 使用 json 來傳遞資料, 傳遞的資料包含簽名(Signature), 因此資料可以做驗證(Authentication)

JWT 由三個部分組成,每一個部分都用點號 . 分開 像這樣 xxxxx.yyyyy.zzzzz。

三個部分分別是

1. 標頭 Header

Header 由兩部分組成

  • token 類型 typ (type)
  • 編碼使用的演算法 alg (algorithm) (e.g. HMAC、SHA256、RSA)

如:

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

然後以 Base64 編碼, 最後會長得像這樣

eyJhbGciOiJIUzI1NiJ9

2. 負載 Payload

Payload 存放聲明內容, 有三種定義的聲明

  • Reserved claims (註冊聲明)

    註冊聲明參數 (建議使用但不強制)

    • jti (JWT ID): 編號
    • sub (Subject): 主題
    • iss (Issuer): 簽發者
    • aud (Audience): 接收者
    • iat (Issued At): 簽發時間
    • nbf (Not Before): 開始生效時間
    • exp (Expiration Time): 過期時間
  • Public claims (公開聲明)

  • Private claims (私有聲明)

如:

{
  "iss": "test.com",
  "name": "test",
  "admin": true
}

編碼後結果:

eyJ1c2VyX2lkIjoxfQ

3. 簽名 Signature

signature 是對前兩個部分的簽名, 驗證發送者的身份, 確保資訊沒有被修改。

signature 由三個部分組成

  • header (base64後的)
  • payload (base64後的)
  • secret (保存在 server 端,jwt 的簽發驗證都必須使用這個 secret)

簽名建立方式:

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

對 signature 進行 base64 編碼:

LMSKXnnWlxEir0SWE72cSCmT_NGKQb3tFhQ_xcPQfAY

將 header·payload·signature組合起來就是 JWT 的token:

eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.LMSKXnnWlxEir0SWE72cSCmT_NGKQb3tFhQ_xcPQfAY

特點

  • 使用 json 格式大部分語言都可使用

  • stateless, 不需在 server 保存 session

  • payload 可以存放請求資訊, 減少對資料庫的連線請求

  • 需使用 https 協議, 以減少盜用

  • 預設的 JWT 只有經過編碼(encoded)但並沒有進行加密(encrypted), 因此 JWT 中不應存放敏感的資訊, 有需要的話也可以使用密鑰另外進行加密

使用方法

對保護的資料發送 request 時, 在 header 加入 token 並以 Bearer 作為 schemes

Authorization: Bearer <token>

post('api/user/1', {
  headers: {
    'Authorization': 'Bearer ' + token
  }
})

JWT 詳細規範可參考 RFC 7519


Ref:

Comments

comments powered by Disqus