## JSON Web Token(JWT)的作用和原理是什么?
JSON Web Token(JWT)的作用是在客戶端和服務器之間傳遞身份驗證信息,并支持授權和信息交換。JWT的原理基于數字簽名技術,使用三個部分組成:頭部、載荷和簽名。其中:
JWT在客戶端登錄后,服務端生成一個JWT令牌并返回給客戶端,客戶端將該令牌存儲在本地,之后在與服務端通信時,將該令牌作為身份驗證信息發送給服務端。服務端接收到令牌后,使用密鑰驗證簽名,確認令牌的真實性和完整性,然后解碼載荷并使用其中的信息完成身份驗證和授權操作。
### 頭部(Header)
包含了令牌類型(即JWT)和所使用的簽名算法信息,通常是一個JSON對象,例如:{ "alg": "HS256", "typ": "JWT" } 其中alg
表示簽名算法,typ
表示令牌類型。
包含了一些聲明(Claim),聲明是有關實體的一些陳述。聲明包含了一些標準聲明和自定義聲明,例如:{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } 其中sub
表示主題(Subject),name
表示名稱,iat
表示令牌頒發時間(Issued At)。
使用密鑰對頭部和載荷進行簽名,以保證數據的完整性和真實性,例如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
放置需要傳輸的信息,有三類:
保留claims
:主要包括iss發行者、exp過期時間、sub主題、aud用戶等。公共claims
:定義新創的信息,比如用戶信息和其他重要信息。私有claims
:用于發布者和消費者都同意以私有的方式使用的信息。以下是claims
的官方定義內容:
key | name | 說明 |
---|---|---|
iss | 發送者 | 標識頒發 JWT 的發送主體。 |
sub | 主題 | 標識 JWT 的主題。 |
aud | 接收者 | 標識 JWT 所針對的接收者。每個在處理 JWT 的主體都必須使用受眾聲明中的值來標識自己。如果處理的主體在存在此聲明時未將自己標識為聲明中的值,則必須拒絕 JWT。 |
exp | 到期時間 | 標識不得接受 JWT 進行處理的過期時間。該值必須是日期類型,而且是1970-01-01 00:00:00Z 之后的日期秒。 |
nbf | jwt的開始處理的時間 | 標識 JWT 開始接受處理的時間。該值必須是日期。 |
iat | jwt發出的時間 | 標識 JWT 的發出的時間。該值必須是日期。 |
jti | jwt id | 令牌的區分大小寫的唯一標識符,即使在不同的頒發者之間也是如此。 |
{
"sub": "12344321",
"name": "Mars醬", // 私有claims
"iat": 1516239022
}
使用密鑰和哈希函數(如SHA256)生成簽名,常用的有HS256、HS384和HS512。
使用公鑰和私鑰進行加密和解密,常用的有RS256、RS384和RS512。
使用橢圓曲線加密算法生成公鑰和私鑰,常用的有ES256、ES384和ES512。
JWT是一種無狀態的身份驗證機制,不需要在服務端存儲會話信息,可以更輕松地實現分布式系統和負載均衡。
JWT使用數字簽名或加密算法保證令牌的真實性和完整性,避免了傳統cookie中cookie劫持和CSRF攻擊的問題。
JWT的格式是基于JSON的,可以自定義聲明,擴展性強。
JWT是一種開放標準,支持多種編程語言和平臺,便于不同系統之間的集成和交互。
JWT適合于前后端分離的架構,前端通過JWT令牌進行身份驗證和授權,服務端只需要驗證JWT令牌的真實性即可。
JWT中包含了頭部、載荷和簽名三部分信息,如果使用RSA算法進行簽名,令牌會比較大,會增加網絡傳輸的負擔。
由于JWT是無狀態的,令牌中包含了用戶信息,如果令牌被盜取,攻擊者可以獲得用戶的敏感信息,因此需要對令牌進行嚴格的存儲和管理。
JWT的令牌是無法撤銷的,一旦令牌被盜取,攻擊者可以一直使用該令牌,因此需要設置較短的過期時間,增加令牌的安全性。
JWT使用數字簽名或加密算法保證令牌的真實性和完整性,但如果密鑰被泄露,攻擊者可以篡改令牌,因此需要對密鑰進行保護和管理。
JWT不支持多級回話,即無法在令牌中存儲多個會話信息,對于一些復雜的應用場景,可能需要使用其他的身份驗證和授權機制。
JWT是一種常用的身份驗證和授權機制,適用于各種類型的網絡應用,例如Web應用、移動應用、API服務等。
JWT可以實現單點登錄,即用戶在一個系統中登錄后,可以在多個系統中自動登錄,提高用戶體驗和運營效率。
JWT可以用于安全地傳遞信息,例如在OAuth2.0授權流程中,使用JWT作為訪問令牌(Access Token)傳遞給客戶端。
JWT適合于分布式系統和微服務架構,可以在不同的系統中傳遞身份驗證信息,實現統一的身份驗證和授權。
JWT適合于前后端分離的架構,前端通過JWT令牌進行身份驗證和授權,服務端只需要驗證JWT令牌的真實性即可。
JWT使用數字簽名或加密算法保證令牌的真實性和完整性,因此密鑰的管理非常重要,需要對密鑰進行保護、存儲和更新,避免密鑰泄露和濫用。
JWT的令牌是無法撤銷的,因此需要設置較短的過期時間,增加令牌的安全性,同時需要確保令牌過期后及時刷新或重新獲取。
JWT令牌中包含了用戶信息和敏感數據,因此需要對令牌進行嚴格的存儲和傳輸,避免令牌泄露和劫持,可以使用HTTPS協議進行加密傳輸。
JWT令牌是一種無狀態的機制,因此容易受到重放攻擊,需要對令牌進行防篡改和防重放措施,例如使用隨機數和時間戳進行加密。
需要對JWT令牌的使用情況進行審計和監控,及時發現和處理異常情況,例如多次嘗試登錄、異常IP地址等。
需要根據具體情況選擇合適的加密和簽名算法,根據安全性要求和性能要求進行權衡,例如使用HMAC算法可以提高性能,但安全性相對較低;使用RSA算法可以提高安全性,但性能相對較低。
JWT令牌中包含了頭部、載荷和簽名三部分信息,如果使用RSA算法進行簽名,令牌會比較大,會增加網絡傳輸的負擔,因此需要考慮令牌大小對性能的影響。
可以使用緩存機制對JWT令牌進行緩存,避免重復生成和簽名,提高性能和可擴展性,可以使用Redis、Memcached等緩存中間件實現。
可以采用分布式架構和負載均衡技術,將JWT令牌的生成和驗證任務分散到多個節點上,提高性能和可擴展性。
可以對JWT令牌生成、解析和驗證代碼進行優化,避免性能瓶頸和安全漏洞,例如使用多線程、異步IO等技術優化代碼,使用代碼審查工具和安全測試工具檢測代碼質量和安全性。
可以將JWT令牌存儲在Cookie中,使用HttpOnly和Secure屬性進行保護,避免XSS攻擊和數據泄露。
可以將JWT令牌存儲在LocalStorage中,但LocalStorage容易受到XSS攻擊和數據泄露,因此需要對令牌進行加密和簽名。
可以將JWT令牌存儲在Session中,但這種方式需要在服務端進行存儲和管理,增加了服務器的負擔和復雜度。
可以將JWT令牌存儲在數據庫中,增加了令牌的安全性和可控性,但會增加數據庫的讀寫負擔和延遲。
原文:JSON Web Token (騰訊云開發者社區)
JWT官方站點
初學者JWT使用指導
JWT概念與實例