閑魚面試:說說JWT工作原理?
JWT(JSON Web Token)一種開放的標(biāo)準(zhǔn)規(guī)范(RFC 7519),用于在網(wǎng)絡(luò)上安全的傳輸信息,通常被用于身份驗(yàn)證。
簡(jiǎn)單來說,你可以把 JWT 想象成一張小巧的、自包含的電子通行證。這張通行證里面包含了用戶的身份信息,就像你在某個(gè)俱樂部的會(huì)員卡,上面有你的名字、會(huì)員等級(jí)等信息,拿著這張卡,你就能證明你是誰,享受相應(yīng)的服務(wù)。
1.JWT組成
JWT 由三部分組成:頭部(Header)、載荷(Payload)和簽名(Signature),如下圖所示:
- 頭部(Header):包含了關(guān)于生成該 JWT 的信息以及所使用的算法類型。
- 載荷(Payload):包含了要傳遞的數(shù)據(jù),例如身份信息和其他附屬數(shù)據(jù)。JWT 官方規(guī)定了 7 個(gè)字段,可供使用:
- iss (Issuer):簽發(fā)者。
- sub (Subject):主題。
- aud (Audience):接收者。
- exp (Expiration time):過期時(shí)間。
- nbf (Not Before):生效時(shí)間。
- iat (Issued At):簽發(fā)時(shí)間。
- jti (JWT ID):編號(hào)。
- 簽名(Signature):使用密鑰對(duì)頭部和載荷進(jìn)行簽名,以驗(yàn)證其完整性。
JWT 官網(wǎng):https://jwt.io/
2.JWT工作原理
JWT 工作原理包含三部分:
- 生成 JWT
- 傳輸 JWT
- 驗(yàn)證 JWT
下面分別來看。
(1)生成JWT
在用戶登錄時(shí),當(dāng)服務(wù)器端驗(yàn)證了用戶名和密碼的正確性后,會(huì)根據(jù)用戶的信息,如用戶 ID 和用戶名稱,加上服務(wù)器端存儲(chǔ)的 JWT 秘鑰一起來生成一個(gè) JWT 字符串,也就是我們所說的 Token,這個(gè) Token 是 Encoded 編碼過的,類似于:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Decoded 解碼后會(huì)得到三部分內(nèi)容:頭部(Header)+載荷(Payload)+簽名(Signature)。
- 頭部(Header):包含了關(guān)于生成該 JWT 的信息以及所使用的算法類型。
- 載荷(Payload):包含了要傳遞的數(shù)據(jù),例如身份信息和其他附屬數(shù)據(jù)。
- 簽名(Signature):使用密鑰對(duì)頭部和載荷進(jìn)行簽名,以驗(yàn)證其完整性。
(2)傳輸JWT
JWT 通常存儲(chǔ)在客戶端的 Cookie、LocalStorage、SessionStorage 等位置,客戶端在每次請(qǐng)求時(shí)把 JWT 放在 Authorization 頭中或作為參數(shù)傳遞給服務(wù)器端。
(3)驗(yàn)證JWT
- 服務(wù)器端接收到 JWT 的 Token 后,會(huì)先將 Token Decoded 解碼,之后會(huì)得到頭部(Header)+載荷(Payload)+簽名(Signature)。
- 然后服務(wù)器端會(huì)使用它本地存儲(chǔ)的秘鑰,以及頭部(Header)中的加密算法和載荷(Payload)中的信息進(jìn)行重新加密,得到一個(gè)新的簽名。
- 最后會(huì)判斷 Token 的真?zhèn)?,用上一步新生成的簽名?Decoded 解碼得到的簽名(Signature)進(jìn)行判斷,如果二者一致,則說明當(dāng)前的 Token 有效性的、完整的,可以執(zhí)行后續(xù)的操作了,否則則返回 Token 錯(cuò)誤。當(dāng)然在這一步判斷時(shí),我們通常也要看載荷(Payload)中的過期時(shí)間是否有效,如果無效,則需要提示用戶重新登錄。
3.JWT優(yōu)勢(shì)
JWT 相較于傳統(tǒng)的基于會(huì)話(Session)的認(rèn)證機(jī)制,具有以下優(yōu)勢(shì):
- 無需服務(wù)器存儲(chǔ)狀態(tài):傳統(tǒng)的基于會(huì)話的認(rèn)證機(jī)制需要服務(wù)器在會(huì)話中存儲(chǔ)用戶的狀態(tài)信息,包括用戶的登錄狀態(tài)、權(quán)限等。而使用 JWT,服務(wù)器無需存儲(chǔ)任何會(huì)話狀態(tài)信息,所有的認(rèn)證和授權(quán)信息都包含在 JWT 中,使得系統(tǒng)可以更容易地進(jìn)行水平擴(kuò)展。
- 跨域支持:由于 JWT 包含了完整的認(rèn)證和授權(quán)信息,因此可以輕松地在多個(gè)域之間進(jìn)行傳遞和使用,實(shí)現(xiàn)跨域授權(quán)。
- 適應(yīng)微服務(wù)架構(gòu):在微服務(wù)架構(gòu)中,很多服務(wù)是獨(dú)立部署并且可以橫向擴(kuò)展的,這就需要保證認(rèn)證和授權(quán)的無狀態(tài)性。使用 JWT 可以滿足這種需求,每次請(qǐng)求攜帶 JWT 即可實(shí)現(xiàn)認(rèn)證和授權(quán)。
- 自包含:JWT 包含了認(rèn)證和授權(quán)信息,以及其他自定義的聲明,這些信息都被編碼在 JWT 中,在服務(wù)端解碼后使用。JWT 的自包含性減少了對(duì)服務(wù)端資源的依賴,并提供了統(tǒng)一的安全機(jī)制。
- 擴(kuò)展性:JWT 可以被擴(kuò)展和定制,可以按照需求添加自定義的聲明和數(shù)據(jù),靈活性更高。
使用 JWT 相較于傳統(tǒng)的基于會(huì)話的認(rèn)證機(jī)制,可以減少服務(wù)器存儲(chǔ)開銷和管理復(fù)雜性,實(shí)現(xiàn)跨域支持和水平擴(kuò)展,并且更適應(yīng)無狀態(tài)和微服務(wù)架構(gòu)。