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