JWT 結構
JWT 是由三部分組成,並用 "." 分隔:
- Header
- Payload
- 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 的完整性和來源。
- 生成方法:
- 先將
header和payload的編碼結果連接起來:<encoded header>.<encoded payload>。 - 將其與 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 中的特殊字符發生衝突。
主要差異
字符替換
- Base64 使用以下字符:
+和/
- Base64URL 使用以下字符:
-和_
- Base64 使用以下字符:
填充字符
- Base64 通常使用
=作為填充字符。 - Base64URL 省略了填充字符。
- Base64 通常使用