最新消息:免費取得JWT 手冊,深入了解 JWT!

什麼是 JSON 網路代幣?

JSON 網路代幣 (JWT) 是一種開放標準 (RFC 7519),定義一種精簡且獨立的方式,可作為 JSON 物件在各方之間安全地傳輸資訊。此資訊可以驗證和信任,因為它是經過數位簽章的。JWT 可以使用密碼 (搭配HMAC 演算法) 或使用RSAECDSA 的公開/私人金鑰對進行簽章。

儘管 JWT 可以加密以在各方之間提供機密性,但我們將專注於已簽章的代幣。已簽章的代幣可以驗證其中包含的宣告的完整性,而加密的代幣會隱藏這些宣告,以避免其他方看到。當使用公開/私人金鑰對簽章代幣時,簽章也會證明只有持有私人金鑰的一方才是簽章的一方。

您應該在什麼時候使用 JSON 網路代幣?

以下是一些 JSON 網路代幣有用的場景

JSON 網路代幣的結構是什麼?

在精簡形式中,JSON 網路代幣包含三個部分,以句點 (.) 分隔,分別是

因此,JWT 通常看起來像以下內容。

xxxxx.yyyyy.zzzzz

讓我們分解不同的部分。

標頭

標頭通常包含兩個部分:令牌類型(即 JWT)和使用的簽署演算法,例如 HMAC SHA256 或 RSA。

例如

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

然後,將此 JSON Base64Url 編碼以形成 JWT 的第一部分。

有效負載

令牌的第二部分是載荷,其中包含宣告。宣告是關於實體(通常是使用者)和附加資料的陳述。宣告有三種類型:已註冊公開私人宣告。

範例載荷可以是

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然後將載荷Base64Url 編碼以形成 JSON Web Token 的第二部分。

請注意,對於已簽署的令牌,這些資訊雖然受到防篡改保護,但任何人都可以讀取。除非已加密,否則請勿將機密資訊放入 JWT 的載荷或標頭元素中。

簽章

若要建立簽章部分,您必須取得編碼標頭、編碼載荷、機密、標頭中指定的演算法,並對其進行簽署。

例如,如果您想使用 HMAC SHA256 演算法,則會以以下方式建立簽章

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

簽章用於驗證訊息在傳輸過程中未被變更,並且對於使用私鑰簽署的令牌,它還可以驗證 JWT 的發送者是否為自稱的發送者。

將所有內容組合在一起

輸出是三個以點分隔的 Base64-URL 字串,可以在 HTML 和 HTTP 環境中輕鬆傳遞,同時比基於 XML 的標準(例如 SAML)更精簡。

以下顯示一個 JWT,其中編碼了先前的標頭和有效負載,並使用一個機密簽署。 編碼的 JWT

如果您想使用 JWT 並將這些概念付諸實踐,可以使用 jwt.io Debugger 來解碼、驗證和產生 JWT。

JWT.io Debugger

JSON Web Tokens 如何運作?

在驗證中,當使用者使用其憑證成功登入時,將會傳回一個 JSON Web Token。由於令牌是憑證,因此必須非常小心以防止安全問題。一般來說,您不應保留令牌超過所需時間。

您也不應 由於缺乏安全性而將敏感的會話資料儲存在瀏覽器儲存空間中

每當使用者想要存取受保護的路由或資源時,使用者代理應傳送 JWT,通常在 Authorization 標頭中使用 Bearer 架構。標頭的內容應如下所示

Authorization: Bearer <token>

在某些情況下,這可能是一種無狀態授權機制。伺服器的受保護路由將檢查 Authorization 標頭中的有效 JWT,如果存在,則使用者將被允許存取受保護的資源。如果 JWT 包含必要的資料,則查詢資料庫以進行某些操作的需求可能會減少,儘管這並不總是如此。

請注意,如果您透過 HTTP 標頭傳送 JWT 令牌,您應嘗試防止它們變得太大。有些伺服器不接受標頭中超過 8 KB 的內容。如果您嘗試在 JWT 令牌中嵌入過多資訊,例如包含使用者的所有權限,您可能需要一個替代方案,例如 Auth0 細粒度授權

如果令牌在 Authorization 標頭中傳送,跨來源資源共用 (CORS) 將不會是一個問題,因為它不使用 cookie。

下圖顯示如何取得 JWT 並用於存取 API 或資源

How does a JSON Web Token work

  1. 應用程式或客戶端向授權伺服器要求授權。這是透過不同的授權流程之一執行的。例如,典型的 OpenID Connect 相容網路應用程式將使用 授權碼流程 透過 /oauth/authorize 端點。
  2. 授權授予後,授權伺服器會傳回一個存取權杖給應用程式。
  3. 應用程式使用存取權杖存取受保護的資源(例如 API)。

請注意,對於已簽署的權杖,權杖中包含的所有資訊都會公開給使用者或其他方,即使他們無法變更這些資訊。這表示您不應將機密資訊放入權杖中。

我們為什麼要使用 JSON 網路權杖?

讓我們來談談 JSON 網路權杖 (JWT)簡單網路權杖 (SWT)安全斷言標記語言權杖 (SAML) 相較之下有哪些好處。

由於 JSON 比 XML 較不冗長,因此編碼後的大小也較小,使得 JWT 比 SAML 更為精簡。這使得 JWT 成為在 HTML 和 HTTP 環境中傳遞的絕佳選擇。

在安全性方面,SWT 只能使用 HMAC 演算法由共用機密對稱簽署。然而,JWT 和 SAML 權杖可以使用 X.509 憑證形式的公鑰/私鑰對進行簽署。與簽署 JSON 的簡便性相比,在不引入不明安全性漏洞的情況下使用 XML 數位簽章簽署 XML 非常困難。

JSON 解析器在多數程式語言中都很常見,因為它們會直接對應到物件。相反地,XML 沒有自然的文件對物件對應。這使得使用 JWT 比使用 SAML 斷言更容易。

關於使用,JWT 用於網際網路規模。這突顯了在多個平台(尤其是行動裝置)上進行 JSON 網路權杖的用戶端處理的容易性。

比較編碼 JWT 和編碼 SAML 的長度 比較編碼 JWT 和編碼 SAML 的長度

如果您想進一步了解 JSON 網路權杖,甚至開始使用它們在自己的應用程式中執行驗證,請瀏覽 Okta 的 Auth0 上的JSON 網路權杖登陸頁面

立即開始使用 JWT

開始使用工具

JWT.io 由Auth0提供給您。

在任何堆疊和任何裝置上使用 Auth0 安全地實作 JWT 驗證,時間不到 10 分鐘。

建立免費帳戶
已建立的權杖