▪️JSON Web Token (JWT)
2023-7-9
| 2025-3-19
字數 1317閱讀時間 4 分鐘
是一種基於 JSON 的開放標準(RFC 7519),它定義了一種簡潔(compact)且自包含(self-contained)的方式,用於在雙方之間安全地將訊息作為 JSON 物件傳輸。而這個訊息是經過數位簽章(Digital Signature),因此可以被驗證及信任。可以使用 密碼(經過 HMAC 演算法) 或用一對 公鑰/私鑰(經過 RSA 或 ECDSA 演算法) 來對 JWT 進行簽章。
備註:
  • RFC:記錄網際網路規範、協定、過程等的標準檔案。
  • 簡潔(compact):體積非常的小,可放在 URL 、 POST 參數或 HTTP Header 內發送請求,體積小意味著傳輸速度快。
  • 自包含(self-contained):payload 裡面就有所需要的資訊,不需要再重新 query database 的資料。

JWT 的組成

  1. header
  1. payload
  1. signature、encryption data
前兩個元素 header 和 payload 是特定結構的 JSON 物件,第三個部分取決於演算法是用來作簽章還是加密,如果是未加密的 JWT,則將其省略。JWT 可以被編碼成 JWS/JWE 簡潔的表現形式(Compact Serialization)。
以下針對這些分別介紹:

Header

每個 JWT 都有一個 header(又稱為 JOSE header),是一種對自我的聲明,這些聲明都表示了其所使用的演算法,通常也會表示要如何解析 JWT 的其餘部分。
 
以下是 header 的組成:
  • 必要欄位
    • alg:對此 JWT 進行簽章和(或)解密的主要演算法。對於未加密的 JWT,此聲明必須設置為 none
  • 非必要欄位
    • typ:JWT 本身的媒體類型。此參數僅助於將 JWT 與帶有 JOSE header 的其他對象混合使用的情況。實際上,這種情況很少發生。如果存在,則此聲明應設置為值 JWT
    • cty:內容類型。大多數 JWT 攜帶特定的聲明以及任意數據作為其 payload 的一部分,在這種情況下,不得設置內容類型聲明。

Payload

通常所有使用者有興趣的資訊都會被放在 payload 裡,另外,某些規範中定義的權利要求也可能存在。JWT 規範指出應該忽略在實踐中無法理解的聲明。具有所附特定含義的權利要求被稱為 registered claims。
  • iss:issuer 的簡稱,用字串(case-sensitive) 或 URI 表示這個 JWT 的唯一識別的發行方。
  • sub:subject 的簡稱,用字串(case-sensitive) 或 URI 表示這個 JWT 所夾帶的唯一識別訊息。
  • aud:audience 的簡稱,用單字串(case-sensitive) 或 URI 或陣列表示這個 JWT 唯一識別的預期接收者。換句話說,當此聲明存在,則讀取此 JWT 中的數據的一方必須在 aud 中找到自己,或者無視 JWT 中包含的數據。與 iss 和 sub 要求的情況一樣,該權利要求是專用的。
  • exp:expiration(time) 的簡稱,一個用來表示特定日期和時間的數字,格式為 POSIX 定義的 自紀元以來的秒數,即 UNIX時間。此聲明設置了該 JWT 被視為無效的確切時間。一些實踐可能允許時間存在一定的偏差(考慮此 JWT 在到期日期後的幾分鐘內有效)。
  • nbf:not before (time) 的簡稱,exp 的相反,格式同 exp,當前時間和日期必須等於或晚於該日期和時間。一些實踐可能允許一定的偏差。
  • iat:issued at (time) 的簡稱,一個用來表示特定日期和時間的數字(格式同 exp 和 nbf),即該 JWT 發行的時間。
  • jti:JWT ID 的簡稱,一個字串表示這個唯一識別的 JWT。此聲明可用於區分具有其他相似內容的 JWT (例如,防止重放)。取決於實現以確保唯一性。

JSON Web Signatures(JWS)

JWT 最廣泛使用的功能。通過將簡單的數據格式與定義明確的簽章演算法系列相結合,JWT 迅速成為在客戶端和中介之間安全共享數據的理想格式。
 
簽章的目的是允許一個或多個參與方建立 JWT 的真實性(authenticity)。真實性意味著 JWT 中包含的數據未被篡改。換句話說,可以執行簽章檢查的任何一方都可以依靠 JWT 提供的內容。需要強調的是,簽章不會阻止其他方讀取 JWT 中的內容。
 
檢查 JWT 簽章的過程稱為驗證(validation)或 token 驗證(validating a token)。當滿足 header 和 payload 中指定的所有限制時,token 被視為有效。

JWS 的組成

具簽章的 JWT 攜帶第三部分:signature,在簡潔序列化形式(compact serialization form)中的最後一個 . 之後。
notion image
  • 網站
  • Cookie & Session大型網站的分散架構
    Loading...