JWT 結構

JWT 是由三部分組成,並用 "." 分隔:

  1. Header
  2. Payload
  3. Signature

1. Header

  • 通常包含兩個屬性:
    • alg: 簽名算法(例如 HMAC SHA256)。
    • typ: Token 的類型(通常為 “JWT”)。
  • 內容以 JSON 格式表示,然後進行 Base64URL 編碼。

2. Payload

  • 包含聲明(claims),分為三類:
    • 註冊的聲明:預定義的屬性(像是 sub, iat, exp),提供關於 token 的一些基本資訊。
    • 公共聲明:可以自行定義內容,像是 name, Email 等等。
    • 私有聲明:依應用程序需求自定義的聲明。
  • 同樣以 JSON 格式表示並進行 Base64URL 編碼。

3. Signature

  • 用來驗證 token 的完整性和來源。
  • 生成方法:
    1. 先將 headerpayload 的編碼結果連接起來: <encoded header>.<encoded payload>
    2. 將其與 secret key 結合,並使用指定的簽名算法進行 HMACSHA256 加密。
  • 最後生成的 signature 格式為 Base64URL 編碼。

JWT 的組合

最終生成的 JWT 格式為: <encoded header>.<encoded payload>.<signature>

注意事項

  • Base64URL 編碼 跟常規的 Base64 編碼 不一樣:
    • JWT 主要使用 Base64URL 編碼 去做 encode
    • 若用 一般 Base64 編碼 去產生 JWT,會導致無法驗正,因為 一般 Base64 包含了特殊字元

Base64 vs Base64URL 差異

定義

  • Base64: 一種將二進位資料編碼成可傳輸的 ASCII 字符串的算法。
  • Base64URL: 這是基於 Base64 所衍生出來的,專門為 URL 跟網頁應用設計,主要是避免跟網頁 URL 中的特殊字符發生衝突。

主要差異

  1. 字符替換

    • Base64 使用以下字符:
      • +/
    • Base64URL 使用以下字符:
      • -_
  2. 填充字符

    • Base64 通常使用 = 作為填充字符。
    • Base64URL 省略了填充字符。