12.04 JWT 開發設計詳解

什麼是 JWT

JWT 全稱是 JSON Web Token(JWT) 是一個 開放標準(RFC 7519) ,它定義了一種緊湊且自包含的方式,用於在各方之間作為 JSON 對象安全地傳輸信息。由於此信息是經過數字簽名的,因此可以被驗證和信任。

可以使用密鑰( HMAC算法 )或使用 RSA 或 ECDSA 的公用/專用密鑰對對 JWT 進行簽名。

什麼時候使用 JWT 驗證

  • 授權 (Authorization)
    這是使用 JWT 的最常見情況。一旦用戶登錄,每個後續請求將包括 JWT ,從而允許用戶訪問該令牌允許的路由,服務和資源。單一登錄是當今廣泛使用 JWT 的一項功能,因為它的開銷很小並且可以在不同的域中輕鬆使用。
  • 信息交換 (Information Exchange)
    JWT 是在各方之間安全地傳輸信息的好方法。因為可以對 JWT 進行簽名(例如,使用公鑰/私鑰對),所以您可以確保發件人是他們所說的人。另外,由於簽名是使用 Header 和 payload 計算的,因此您還可以驗證內容是否未被篡改。

JWT 的結構格式

由三部分組成,這些部分由點 . 分隔,分別是:

Header
Payload
Signature

因此, JWT 通常如下所示。

xxxxx.yyyyy.zzzzz

Header

通常由兩部分組成:

  • 令牌的類型(即 JWT )
  • 所使用的簽名算法,例如: HMAC SHA256RSA

例如:

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

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

Payload

令牌的第二部分是 有效負載 ,其中包含聲明。聲明是有關實體(通常是用戶)和其他數據的聲明。共有三種類型的索賠: registered、public、private claims

  • Registered claims
    這些是一組預定義的權利要求,不是強制性的,而是建議使用的,以提供一組有用的可互操作的權利要求。其中一些是: iss (發出者), exp (到期時間), sub (主題), aud (受眾) 等。
    Tip: 請注意,聲明名稱僅是三個字符,因為 JWT 是緊湊的。
  • Public claims
    這些可以由使用 JWT 的人員隨意定義。但是為避免衝突,應在 IANA JSON Web 令牌註冊表中定義它們,或將其定義為包含抗衝突名稱空間的 URI 。
  • Private claims
    這些是自定義聲明,旨在在同意使用它們的各方之間共享信息,既不是註冊聲明也不是公共聲明。

有效負載示例:

{
"sub": "1234567890",
"name": "John Doe",

"admin": true
}

同樣需要 Base64Url 編碼,以形成 JWT 的第二部分。

Signature

簽名 (Signature) 用於驗證消息在整個過程中沒有更改,並且對於使用私鑰進行簽名的令牌,它還可以驗證 JWT 的發送者是它所說的真實身份。

例如,如果要使用 HMAC SHA256 算法,則將通過以下方式創建簽名:

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

將這三部分合並

輸出是三個由 . 分隔的 Base64-URL 字符串,可以在 HTML 和 HTTP 環境中輕鬆傳遞這些字符串,與基於 XML 的標準(例如 SAML )相比,它更緊湊。

下圖顯示了一個 JWT ,它已對先前的 Header 和 Payload 進行了編碼,並用一個 Signature 。

JWT 開發設計詳解

可以在這個網頁 jwt.io Debugger 驗證和生成 JWT

JWT 開發設計詳解

JWT 如何工作

在身份驗證中,當用戶使用其憑據成功登錄時,將返回令牌。由於令牌是憑據,因此必須格外小心以防止安全問題。通常,令牌的有效時間不宜設置過長。

Tip: 由於缺乏安全性,您也不應該將敏感的會話數據存儲在瀏覽器存儲中。

每當用戶想要訪問受保護的路由或資源時,用戶代理通常應在 Bearer 模式中使用授權頭髮送 JWT 。 Header 的內容應如下所示:

Authorization: Bearer <token>

在某些情況下,接口訪問並不需要身份授權。服務器的受保護路由將在 Authorization Header 中檢查 JWT令牌 是否有效,如果存在且有效,則將允許用戶訪問受保護的資源。

如果 JWT 包含必要的數據,則可以減少查詢數據庫中某些操作的需求。

如果令牌是在 Authorization Header 中發送的,則跨域資源共享 (CORS) 不會成為問題,因為它不使用 cookie 。

下圖顯示瞭如何獲取 JWT 並將其用於訪問 API或資源 :

JWT 開發設計詳解

JWT令牌
JWT令牌

下圖詳細的流程:

JWT 開發設計詳解

ps:請注意,使用簽名令牌,令牌或令牌中包含的所有信息都會暴露給用戶或其他方,即使他們無法更改它。這意味著您不應將機密信息放入令牌中。

為什麼需要 JWT

對比 Simple Web Tokens (SWT)Security Assertion Markup Language Tokens (SAML) ,看看使用 JSON Web Tokens (JWT) 有什麼好處。

  • 由於 JSON 不如 XML 冗長,因此在編碼時 JSON 的大小也較小,從而使 JWT 比 SAML 更緊湊。這使得 JWT 是在 HTML 和 HTTP環境 中傳遞的不錯的選擇。
  • 在安全方面, SWT 只能使用 HMAC算法 進行對稱簽名。但是 JWT 和 SAML令牌 可以使用 X.509證書形式 的公用/專用密鑰對進行簽名。與簽名 JSON 的簡單性相比,使用 XML Digital Signature 簽名 XML 而不引入模糊的安全漏洞是非常困難的。
  • JSON 解析器在大多數編程語言中都很常見,因為它們直接映射到對象。相反, XML 沒有自然的文檔到對象映射。與 SAML 斷言相比,這使使用 JWT 更加容易。
  • 關於用法, JWT 是在 Internet 規模上使用的。這強調了在多個平臺(尤其是移動平臺)上對 JSON Web令牌 進行客戶端處理的簡便性。


分享到:


相關文章: