## 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)操作。

JSON Web Token(JWT)的結(jié)構(gòu)和組成部分有哪些?

### 頭部(Header)

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

載荷(Payload)

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

簽名(Signature)

使用密鑰對(duì)頭部和載荷進(jìn)行簽名,以保證數(shù)據(jù)的完整性和真實(shí)性,例如:

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

JWT claims

放置需要傳輸?shù)男畔ⅲ腥悾?/p>

以下是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
}

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

HMAC算法

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

RSA算法

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

ECDSA算法

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

JSON Web Token(JWT)的優(yōu)點(diǎn)是什么?

無狀態(tài)

JWT是一種無狀態(tài)的身份驗(yàn)證機(jī)制,不需要在服務(wù)端存儲(chǔ)會(huì)話信息,可以更輕松地實(shí)現(xiàn)分布式系統(tǒng)和負(fù)載均衡。

安全性高

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

可擴(kuò)展性好

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í)性即可。

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

令牌大小

JWT中包含了頭部、載荷和簽名三部分信息,如果使用RSA算法進(jìn)行簽名,令牌會(huì)比較大,會(huì)增加網(wǎng)絡(luò)傳輸?shù)呢?fù)擔(dān)。

存儲(chǔ)問題

由于JWT是無狀態(tài)的,令牌中包含了用戶信息,如果令牌被盜取,攻擊者可以獲得用戶的敏感信息,因此需要對(duì)令牌進(jìn)行嚴(yán)格的存儲(chǔ)和管理。

時(shí)效性問題

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

安全性問題

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

不支持多級(jí)回話

JWT不支持多級(jí)回話,即無法在令牌中存儲(chǔ)多個(gè)會(huì)話信息,對(duì)于一些復(fù)雜的應(yīng)用場景,可能需要使用其他的身份驗(yàn)證和授權(quán)機(jī)制。

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

身份驗(yàn)證和授權(quán)

JWT是一種常用的身份驗(yàn)證和授權(quán)機(jī)制,適用于各種類型的網(wǎng)絡(luò)應(yīng)用,例如Web應(yīng)用移動(dòng)應(yīng)用API服務(wù)等。

單點(diǎn)登錄

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)傳遞給客戶端。

分布式系統(tǒng)

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í)性即可。

JSON Web Token(JWT)的安全性和風(fēng)險(xiǎn)如何評(píng)估和管理?

密鑰管理

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

令牌過期時(shí)間

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

令牌存儲(chǔ)和傳輸

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)行加密。

審計(jì)和監(jiān)控

需要對(duì)JWT令牌的使用情況進(jìn)行審計(jì)和監(jiān)控,及時(shí)發(fā)現(xiàn)和處理異常情況,例如多次嘗試登錄、異常IP地址等。

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

算法選擇

需要根據(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ī)制

可以使用緩存機(jī)制對(duì)JWT令牌進(jìn)行緩存,避免重復(fù)生成和簽名,提高性能和可擴(kuò)展性,可以使用Redis、Memcached等緩存中間件實(shí)現(xiàn)。

分布式架構(gòu)

可以采用分布式架構(gòu)和負(fù)載均衡技術(shù),將JWT令牌的生成和驗(yàn)證任務(wù)分散到多個(gè)節(jié)點(diǎn)上,提高性能和可擴(kuò)展性。

代碼優(yōu)化

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

JSON Web Token(JWT)的令牌存儲(chǔ)和加密如何實(shí)現(xiàn)?

存儲(chǔ)在Cookie中

可以將JWT令牌存儲(chǔ)在Cookie中,使用HttpOnly和Secure屬性進(jìn)行保護(hù),避免XSS攻擊和數(shù)據(jù)泄露。

存儲(chǔ)在LocalStorage中

可以將JWT令牌存儲(chǔ)在LocalStorage中,但LocalStorage容易受到XSS攻擊和數(shù)據(jù)泄露,因此需要對(duì)令牌進(jìn)行加密和簽名。

存儲(chǔ)在Session中

可以將JWT令牌存儲(chǔ)在Session中,但這種方式需要在服務(wù)端進(jìn)行存儲(chǔ)和管理,增加了服務(wù)器的負(fù)擔(dān)和復(fù)雜度。

存儲(chǔ)在數(shù)據(jù)庫中

可以將JWT令牌存儲(chǔ)在數(shù)據(jù)庫中,增加了令牌的安全性和可控性,但會(huì)增加數(shù)據(jù)庫的讀寫負(fù)擔(dān)和延遲。

參考資料

原文:JSON Web Token (騰訊云開發(fā)者社區(qū))
JWT官方站點(diǎn)
初學(xué)者JWT使用指導(dǎo)
JWT概念與實(shí)例

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