## JSON Web Token(JWT)的作用和原理是什么?

JSON Web Token(JWT)的作用是在客戶端和服務器之間傳遞身份驗證信息,并支持授權和信息交換。JWT的原理基于數字簽名技術,使用三個部分組成:頭部、載荷和簽名。其中:

JWT在客戶端登錄后,服務端生成一個JWT令牌并返回給客戶端,客戶端將該令牌存儲在本地,之后在與服務端通信時,將該令牌作為身份驗證信息發送給服務端。服務端接收到令牌后,使用密鑰驗證簽名,確認令牌的真實性和完整性,然后解碼載荷并使用其中的信息完成身份驗證和授權操作。

JSON Web Token(JWT)的結構和組成部分有哪些?

### 頭部(Header)

包含了令牌類型(即JWT)和所使用的簽名算法信息,通常是一個JSON對象,例如:{ "alg": "HS256", "typ": "JWT" } 其中alg表示簽名算法,typ表示令牌類型。

載荷(Payload)

包含了一些聲明(Claim),聲明是有關實體的一些陳述。聲明包含了一些標準聲明和自定義聲明,例如:{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } 其中sub表示主題(Subject),name表示名稱,iat表示令牌頒發時間(Issued At)。

簽名(Signature)

使用密鑰對頭部和載荷進行簽名,以保證數據的完整性和真實性,例如:

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

JWT 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
}

JSON Web Token(JWT)的加密和簽名算法有哪些?

HMAC算法

使用密鑰和哈希函數(如SHA256)生成簽名,常用的有HS256、HS384和HS512。

RSA算法

使用公鑰和私鑰進行加密和解密,常用的有RS256、RS384和RS512。

ECDSA算法

使用橢圓曲線加密算法生成公鑰和私鑰,常用的有ES256、ES384和ES512。

JSON Web Token(JWT)的優點是什么?

無狀態

JWT是一種無狀態的身份驗證機制,不需要在服務端存儲會話信息,可以更輕松地實現分布式系統和負載均衡。

安全性高

JWT使用數字簽名或加密算法保證令牌的真實性和完整性,避免了傳統cookie中cookie劫持和CSRF攻擊的問題。

可擴展性好

JWT的格式是基于JSON的,可以自定義聲明,擴展性強。

跨語言支持

JWT是一種開放標準,支持多種編程語言和平臺,便于不同系統之間的集成和交互。

前后端分離

JWT適合于前后端分離的架構,前端通過JWT令牌進行身份驗證和授權,服務端只需要驗證JWT令牌的真實性即可。

JSON Web Token(JWT)的缺點是什么?

令牌大小

JWT中包含了頭部、載荷和簽名三部分信息,如果使用RSA算法進行簽名,令牌會比較大,會增加網絡傳輸的負擔。

存儲問題

由于JWT是無狀態的,令牌中包含了用戶信息,如果令牌被盜取,攻擊者可以獲得用戶的敏感信息,因此需要對令牌進行嚴格的存儲和管理。

時效性問題

JWT的令牌是無法撤銷的,一旦令牌被盜取,攻擊者可以一直使用該令牌,因此需要設置較短的過期時間,增加令牌的安全性。

安全性問題

JWT使用數字簽名或加密算法保證令牌的真實性和完整性,但如果密鑰被泄露,攻擊者可以篡改令牌,因此需要對密鑰進行保護和管理。

不支持多級回話

JWT不支持多級回話,即無法在令牌中存儲多個會話信息,對于一些復雜的應用場景,可能需要使用其他的身份驗證和授權機制。

JSON Web Token(JWT)的使用場景和應用有哪些?

身份驗證和授權

JWT是一種常用的身份驗證和授權機制,適用于各種類型的網絡應用,例如Web應用移動應用API服務等。

單點登錄

JWT可以實現單點登錄,即用戶在一個系統中登錄后,可以在多個系統中自動登錄,提高用戶體驗和運營效率。

信息交換

JWT可以用于安全地傳遞信息,例如在OAuth2.0授權流程中,使用JWT作為訪問令牌(Access Token)傳遞給客戶端。

分布式系統

JWT適合于分布式系統和微服務架構,可以在不同的系統中傳遞身份驗證信息,實現統一的身份驗證和授權。

前后端分離

JWT適合于前后端分離的架構,前端通過JWT令牌進行身份驗證和授權,服務端只需要驗證JWT令牌的真實性即可。

JSON Web Token(JWT)的安全性和風險如何評估和管理?

密鑰管理

JWT使用數字簽名或加密算法保證令牌的真實性和完整性,因此密鑰的管理非常重要,需要對密鑰進行保護、存儲和更新,避免密鑰泄露和濫用。

令牌過期時間

JWT的令牌是無法撤銷的,因此需要設置較短的過期時間,增加令牌的安全性,同時需要確保令牌過期后及時刷新或重新獲取。

令牌存儲和傳輸

JWT令牌中包含了用戶信息和敏感數據,因此需要對令牌進行嚴格的存儲和傳輸,避免令牌泄露和劫持,可以使用HTTPS協議進行加密傳輸。

防止重放攻擊

JWT令牌是一種無狀態的機制,因此容易受到重放攻擊,需要對令牌進行防篡改和防重放措施,例如使用隨機數和時間戳進行加密。

審計和監控

需要對JWT令牌的使用情況進行審計和監控,及時發現和處理異常情況,例如多次嘗試登錄、異常IP地址等。

JSON Web Token(JWT)的性能和可擴展性如何保障?

算法選擇

需要根據具體情況選擇合適的加密和簽名算法,根據安全性要求和性能要求進行權衡,例如使用HMAC算法可以提高性能,但安全性相對較低;使用RSA算法可以提高安全性,但性能相對較低。

令牌大小

JWT令牌中包含了頭部、載荷和簽名三部分信息,如果使用RSA算法進行簽名,令牌會比較大,會增加網絡傳輸的負擔,因此需要考慮令牌大小對性能的影響。

緩存機制

可以使用緩存機制對JWT令牌進行緩存,避免重復生成和簽名,提高性能和可擴展性,可以使用Redis、Memcached等緩存中間件實現。

分布式架構

可以采用分布式架構和負載均衡技術,將JWT令牌的生成和驗證任務分散到多個節點上,提高性能和可擴展性。

代碼優化

可以對JWT令牌生成、解析和驗證代碼進行優化,避免性能瓶頸和安全漏洞,例如使用多線程、異步IO等技術優化代碼,使用代碼審查工具和安全測試工具檢測代碼質量和安全性。

JSON Web Token(JWT)的令牌存儲和加密如何實現?

存儲在Cookie中

可以將JWT令牌存儲在Cookie中,使用HttpOnly和Secure屬性進行保護,避免XSS攻擊和數據泄露。

存儲在LocalStorage中

可以將JWT令牌存儲在LocalStorage中,但LocalStorage容易受到XSS攻擊和數據泄露,因此需要對令牌進行加密和簽名。

存儲在Session中

可以將JWT令牌存儲在Session中,但這種方式需要在服務端進行存儲和管理,增加了服務器的負擔和復雜度。

存儲在數據庫中

可以將JWT令牌存儲在數據庫中,增加了令牌的安全性和可控性,但會增加數據庫的讀寫負擔和延遲。

參考資料

原文:JSON Web Token (騰訊云開發者社區)
JWT官方站點
初學者JWT使用指導
JWT概念與實例

一站搜索、試用、比較全球API!
冪簡集成已收錄 5484種API!
試用API,一次比較多個渠道