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