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
通常由兩部分組成:
例如:
{
"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.io Debugger 驗證和生成JWT
JWT 如何工作
在身份驗證中,當用戶使用其憑據成功登錄時,將返回令牌。由於令牌是憑據,因此必須格外小心以防止安全問題。通常,令牌的有效時間不宜設置過長。
Tip: 由於缺乏安全性,您也不應該將敏感的會話數據存儲在瀏覽器存儲中。
每當用戶想要訪問受保護的路由或資源時,用戶代理通常應在Bearer
模式中使用授權頭發送JWT
。Header
的內容應如下所示:
Authorization: Bearer <token>
在某些情況下,接口訪問並不需要身份授權。服務器的受保護路由將在Authorization Header
中檢查JWT令牌
是否有效,如果存在且有效,則將允許用戶訪問受保護的資源。
如果JWT
包含必要的數據,則可以減少查詢數據庫中某些操作的需求。
如果令牌是在Authorization Header
中發送的,則跨域資源共享 (CORS) 不會成為問題,因為它不使用cookie
。
下圖顯示了如何獲取JWT
並將其用於訪問API或資源
:
- 應用程序或客戶端向授權服務器請求授權。生產
JWT令牌
。 - 授予授權后,授權服務器會將訪問令牌返回給應用程序。
- 應用程序使用訪問令牌來訪問受保護的資源(例如API)。
- 服務器檢查
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令牌
進行客戶端處理的簡便性。
如果您想了解有關JSON Web令牌的更多信息,甚至開始使用它們在自己的應用程序中執行身份驗證,請瀏覽到 Auth0上的JSON Web令牌登錄 頁面。
咨詢請加微信:輕撩即可。