華為一面:談?wù)勀銓?duì)JWT的理解?
JWT(JSON Web Token) 是一種開(kāi)放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全傳輸信息,通常用于身份驗(yàn)證和信息交換。其核心特點(diǎn)是通過(guò)緊湊且自包含的 JSON 對(duì)象傳遞數(shù)據(jù),無(wú)需服務(wù)端存儲(chǔ)會(huì)話狀態(tài)。
1.為什么需要JWT?
開(kāi)發(fā)中需要 JWT 的主要原因是為了解決傳統(tǒng)基于 Session 的身份驗(yàn)證方法中存在的問(wèn)題,比如跨域認(rèn)證不便、擴(kuò)展性差等問(wèn)題。而 JWT 允許我們?cè)O(shè)計(jì)無(wú)狀態(tài)的、分布式的 Web 應(yīng)用,通過(guò)在每個(gè)請(qǐng)求中傳遞 Token 來(lái)驗(yàn)證用戶身份,從而實(shí)現(xiàn)更加靈活和可擴(kuò)展的架構(gòu)。
2.執(zhí)行流程
JWT 執(zhí)行流程如下:
它的主要執(zhí)行流程如下:
- 用戶登錄成功后,服務(wù)器根據(jù)用戶信息生成一個(gè) JWT 的 Token 令牌。
- 服務(wù)器將此 Token 返回給客戶端,客戶端通常存儲(chǔ)在 Cookie 或 LocalStorage 中。
- 之后客戶端在訪問(wèn)服務(wù)器端時(shí)會(huì)攜帶這個(gè) Token,一般放在 HTTP 頭中。
- 服務(wù)器接收到請(qǐng)求后,解析 JWT,驗(yàn)證其簽名有效性以及是否過(guò)期。
- 如果驗(yàn)證成功,則處理相應(yīng)的請(qǐng)求;否則,返回錯(cuò)誤信息(重新登錄)。
3.JWT組成
JWT 是由三部分組成的:
- Header(頭部):通常由以下兩部分組成:
a.Token 類(lèi)型:通常是 JWT。
b.加密算法:例如 HS256(HMAC SHA-256)、RS256(RSA SHA-256)等。
- Payload(載荷) :JWT 的主體部分,通常為以下三類(lèi):
- 標(biāo)準(zhǔn)聲明(Registered Claims):預(yù)定義的字段,如 iss(發(fā)行者)、exp (過(guò)期時(shí)間)、sub(主題)等。
- 公共聲明(Public Claims):用戶自定義的字段,例如用戶 ID、用戶名、角色等。
- 私有聲明(Private Claims):在特定場(chǎng)景下使用的字段,通常用于內(nèi)部系統(tǒng)。
- Signature(簽名):用于驗(yàn)證 Token 的完整性和防止篡改。
它們之間用點(diǎn)“.”分隔,形成一個(gè)字符串(Token)。
4.JWT核心實(shí)現(xiàn)代碼
在 Spring Boot 項(xiàng)目中,首先要引入 JWT 工具依賴,之后通過(guò)以下核心代碼可以生成 Token,以及驗(yàn)證 Token:
// 生成 JWT(示例)|SECRET_KEY 為服務(wù)保存的密鑰。
public String generateToken(UserDetails user) {
return Jwts.builder()
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
// 驗(yàn)證 JWT(示例)
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
注意事項(xiàng)
- 密鑰安全:簽名密鑰需妥善保管,并定期修改,避免泄露。
- 無(wú)狀態(tài)性:JWT 無(wú)需服務(wù)端存儲(chǔ)會(huì)話信息,適合分布式系統(tǒng)。
5.JWT VS Session
JWT 和 Session 主要區(qū)別如下:
- 存儲(chǔ)位置不同:Session 通常將用戶會(huì)話信息存儲(chǔ)在服務(wù)器端,而 JWT 則將信息存儲(chǔ)在客戶端。
- 狀態(tài)管理不同:Session 是基于服務(wù)端的狀態(tài)機(jī)制,需要服務(wù)器保存會(huì)話狀態(tài);JWT 是無(wú)狀態(tài)的,所有的信息都包含在 Token 中,服務(wù)端無(wú)需保存任何狀態(tài)。
- 隱私性不同:由于 JWT 的信息直接暴露給用戶,因此敏感信息不應(yīng)該存儲(chǔ)在 JWT 中。Session 因?yàn)橹辉诜?wù)端維護(hù),隱私性相對(duì)更好一些。
- 擴(kuò)展性和性能不同:JWT 非常適合分布式系統(tǒng),因?yàn)樗灰蕾囉诜?wù)端的狀態(tài)。對(duì)于大型分布式系統(tǒng),JWT 可以顯著減少服務(wù)器資源的消耗,提高系統(tǒng)的響應(yīng)速度。
6.JWT存在的問(wèn)題
盡管 JWT 有很多優(yōu)點(diǎn),但也存在一些挑戰(zhàn):
- 大小限制:由于 JWT 是以 HTTP 頭部的形式發(fā)送的,所以它的大小受到限制。如果 JWT 中包含過(guò)多的數(shù)據(jù),可能會(huì)導(dǎo)致請(qǐng)求頭過(guò)長(zhǎng)的問(wèn)題。解決辦法是盡量保持 JWT 簡(jiǎn)潔,僅包含必要的信息。
- 令牌撤銷(xiāo)問(wèn)題:一旦 JWT 被簽發(fā),除非過(guò)期,否則無(wú)法輕易撤銷(xiāo)。
- 安全性考慮:雖然 JWT 本身支持簽名和加密,但如果密鑰泄露,將會(huì)導(dǎo)致嚴(yán)重的安全隱患。因此,確保密鑰的安全管理和定期更新是非常重要的。
小結(jié)
JWT 提供了一種有效的方法來(lái)處理用戶身份驗(yàn)證和信息交換的問(wèn)題,也是目前主流的用戶登錄驗(yàn)證機(jī)制,但同時(shí)也需要注意上述提到的一些潛在風(fēng)險(xiǎn)和限制,它更適用于分布式大型項(xiàng)目的用戶信息傳輸和登錄權(quán)限判斷。