什么是JWT
JWT (JSON Web Token) 是一個開放標準 ( RFC 7519 ),它定義了一種緊湊且自包含的方式,用于在各方之間安全地以 JSON 對象的形式傳輸信息。由于這些信息經過數字簽名,因此可以被驗證和信任。JWT 可以使用密鑰(采用HMAC算法)或使用RSA或ECDSA 的公鑰/私鑰對進行簽名。
雖然 JWT 可以通過加密來保障各方之間的隱私,但我們將重點介紹簽名令牌。簽名令牌可以驗證其所含聲明的完整性,而加密令牌則會向其他方隱藏這些聲明。使用公鑰/私鑰對對令牌進行簽名時,簽名還能證明只有持有私鑰的一方才是簽名者。
JWT應用場景
以下是 JSON Web Tokens 有用的一些場景:
-
授權:這是使用 JWT 最常見的場景。用戶登錄后,每個后續請求都將包含 JWT,允許用戶訪問該令牌允許的路由、服務和資源。單點登錄是如今 JWT 廣泛使用的一項功能,因為它開銷小,并且易于跨域使用。
-
信息交換:JSON Web Token 是各方之間安全傳輸信息的有效方式。由于 JWT 可以簽名(例如,使用公鑰/私鑰對),因此您可以確保發送者的身份與其聲明相符。此外,由于簽名是使用標頭和有效負載計算得出的,因此您還可以驗證內容未被篡改。
JSON Web Token 結構是什么?
JSON Web Token由以下三部分組成,中間用點連接:
- 標題
- 有效載荷
- 簽名
標題
標頭通常由兩部分組成:令牌的類型(即 JWT)和正在使用的簽名算法(例如 HMAC SHA256 或 RSA)。
例如:
{"alg": "HS256","typ": "JWT"
}
然后,將此 JSON 經過Base64Url編碼,形成 JWT 的第一部分。
有效載荷
令牌的第二部分是有效負載,其中包含聲明。聲明是關于實體(通常是用戶)及其附加數據的聲明。聲明分為三種類型:已注冊聲明、公共聲明和私有聲明。
聲明:這些是一組預定義的聲明,雖然不是強制性的,但建議使用,以提供一組有用且可互操作的聲明。其中包括: iss(頒發者)、 exp(到期時間)、 sub(主題)、 aud(受眾)等。
請注意,由于 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。
JSON Web Tokens 如何工作?
在身份驗證中,當用戶使用其憑證成功登錄時,將返回一個 JSON Web Token。由于 token 是憑證,因此必須格外小心,以防止出現安全問題。通常情況下,不應將 token 保留超過規定時間。并且由于缺乏安全性,也不應將敏感的會話數據存儲在瀏覽器存儲中。
每當用戶想要訪問受保護的路由或資源時,用戶代理都應該發送 JWT,通常在請求頭的Authorization標頭中使用Bearer模式。標頭內容應如下所示:
Authorization: Bearer <token>
下圖展示了如何獲取 JWT 以及如何使用它來訪問 API 或資源:
- 應用程序或客戶端向授權服務器請求授權。
- 當授權被授予時,授權服務器會向應用程序返回訪問令牌。
- 應用程序使用訪問令牌來訪問受保護的資源(如 API)。
未完待續。。。