JSON Web 令牌 (JWT) 因其簡單性和無狀態性而被廣泛用於 Web 應用程式中的身份驗證。它們允許在兩方之間傳輸經過驗證的訊息,通常用於登入系統。然而,儘管 JWT 很受歡迎,但許多安全專家建議在使用 JWT 時要小心,尤其是會話管理。
在本文中,我們將深入探討 JWT 引發擔憂的原因,以及許多開發人員推薦替代方法的原因。
JSON Web 令牌 (JWT) 是一種緊湊、URL 安全的方法,用於表示在兩方之間傳輸的聲明。它經過數位簽名,防篡改。 JWT 的典型結構包括三個部分:
標頭:指定簽名演算法。
有效負載:包含聲明或資料。
簽章:標頭和有效負載的雜湊值,以確保完整性。
JWT 通常用於身份驗證。當使用者登入時,伺服器會發出一個 JWT,客戶端儲存該 JWT 並將其附加到未來對安全資源的請求。伺服器驗證令牌以對使用者進行身份驗證,而無需在伺服器上維護會話資料。
那為什麼很多人建議不要使用 JWT 呢?
使用 JWT 最顯著的缺點之一是它的大小。 JWT 攜帶自己的有效負載(包括使用者 ID、角色等聲明),這意味著它們比傳統會話 cookie 大得多。
儲存使用者 ID 的會話 cookie 可能只有幾個位元組。
然而,JWT 包含用戶 ID 以及附加元資料、有效負載和簽名,使其變得更大。
由於令牌是隨每個請求一起發送的,因此額外的大小會導致更高的頻寬使用量。在低頻寬情況下或在行動裝置上,這可能尤其成問題。
JWT 最關鍵的限制之一是缺乏簡單的令牌撤銷。 JWT 一旦發布,在過期之前一直有效,這可能會帶來安全風險。
註銷問題:
當使用者登出時,您會期望會話立即失效。但 JWT 是無狀態的,而且伺服器沒有直接方法使令牌無效,除非將其儲存在伺服器端的某個位置,這違背了 JWT 無狀態的目的。如果 JWT 的過期時間較長,則即使使用者登出後,攻擊者也可以繼續使用竊取的令牌。
過時的代幣:
在傳統的會話系統中,當使用者的權限更新時(例如,管理員降級為普通使用者),伺服器上的會話可以立即反映該變更。對於 JWT,這種情況在令牌過期之前不會發生。這可能允許用戶保留過時權限的時間比預期的時間長,從而導致潛在的安全問題。
JWT 經常因其數位簽名功能而受到稱讚,確保有效負載不被篡改。然而,現代 Web 框架會自動簽署並保護會話 cookie,這使得 JWT 簽名在許多情況下變得多餘。
問題是這樣的:
如果您在 cookie 中使用 JWT,則您的 cookie 已被框架簽名,有時甚至會被框架加密。
讓 cookie 和 JWT 都附有簽名是多餘的。
實際上,使用傳統會話 cookie 可以為您提供與 JWT 相同等級的安全性,但不會增加額外的複雜性和大小。
JWT 通常未加密。這意味著包含敏感使用者資訊的有效負載是 Base64 編碼的,但並未隱藏。如果有人可以攔截令牌,他們就可以輕鬆解碼有效負載以查看其內容。
某些情況下的漏洞:
中間人攻擊:如果 JWT 不是透過 HTTPS 傳輸,攻擊者就可以攔截令牌,從而獲得對使用者會話的存取權。
令牌竄改:雖然簽章可確保令牌未被竄改,但使用弱簽章演算法時會出現問題。在某些情況下,攻擊者能夠透過演算法欺騙攻擊繞過 JWT 簽名,從而導致嚴重的安全漏洞。
為了緩解這些問題,始終使用 HTTPS 和強大的簽章演算法至關重要,但即便如此,某些漏洞仍然存在。
雖然 JWT 確實提供了過期時間 (exp),但過期時間是在客戶端的,這意味著客戶端將繼續使用令牌直至其過期。如果令牌被洩露,攻擊者可以使用它直到其過期,無論還剩多少時間。
這可能會導致嚴重的安全風險,尤其是對於長期存在的代幣。相較之下,傳統的會話管理可讓您立即使會話失效,從而更好地控制活動會話。
對於許多身份驗證系統來說,使用 JWT 可能有點矯枉過正。傳統的基於會話的身份驗證(使用 cookie 和伺服器儲存的會話資料)可以有效地處理大多數用例,而不需要複雜的令牌管理或無狀態 JWT 的額外風險。
例如:
如果您的應用程式只需要追蹤登入的用戶,則基於 cookie 的簡單方法可以提供相同的安全性,但複雜性較低。
許多現代 Web 框架會自動為您管理 cookie、簽章和加密,從而在標準登入/登出流程中不再需要 JWT。
雖然 JWT 對於特定場景很有用,例如 API 授權或一次性資料傳輸,但它通常不是大多數 Web 應用程式中會話管理的最佳選擇。傳統的會話 cookie,尤其是現代框架提供的會話 cookie 較小、更安全且更易於管理。
在以下情況下,JWT 並不理想:
您需要輕鬆撤銷令牌。
您希望避免過度使用頻寬。
您正在處理敏感的、長期存在的會話。
簡而言之,雖然 JWT 提供了一種無狀態、獨立的身份驗證方法,但它引入了許多開發人員應仔細考慮的潛在安全和效能問題。在為您的專案採用 JWT 之前,請評估您的需求並確保它是適合該工作的工具。
這就是今天的全部內容。
另外,分享您最喜歡的網頁開發資源以幫助這裡的初學者!
探索我的YouTube頻道!如果你覺得有用的話。
請給我的GitHub專案一顆星 ⭐️
感謝31784! 🤗
原文出處:https://dev.to/safdarali/why-do-many-people-not-recommend-using-jwt-1ol5