JSON Web 令牌 (JWT) 因其簡單性和無狀態性而被廣泛用於 Web 應用程式中的身份驗證。它們允許在兩方之間傳輸經過驗證的訊息,通常用於登入系統。然而,儘管 JWT 很受歡迎,但許多安全專家建議在使用 JWT 時要小心,尤其是會話管理。

在本文中,我們將深入探討 JWT 引發擔憂的原因,以及許多開發人員推薦替代方法的原因。

什麼是 JWT?

JSON Web 令牌 (JWT) 是一種緊湊、URL 安全的方法,用於表示在兩方之間傳輸的聲明。它經過數位簽名,防篡改。 JWT 的典型結構包括三個部分:

  1. 標頭:指定簽名演算法。

  2. 有效負載:包含聲明或資料。

  3. 簽章:標頭和有效負載的雜湊值,以確保完整性。

JWT 通常用於身份驗證。當使用者登入時,伺服器會發出一個 JWT,客戶端儲存該 JWT 並將其附加到未來對安全資源的請求。伺服器驗證令牌以對使用者進行身份驗證,而無需在伺服器上維護會話資料。

那為什麼很多人建議不要使用 JWT 呢?

1. JWT 規模:比你想像的還要大

使用 JWT 最顯著的缺點之一是它的大小。 JWT 攜帶自己的有效負載(包括使用者 ID、角色等聲明),這意味著它們比傳統會話 cookie 大得多。

儲存使用者 ID 的會話 cookie 可能只有幾個位元組。

然而,JWT 包含用戶 ID 以及附加元資料、有效負載和簽名,使其變得更大。

由於令牌是隨每個請求一起發送的,因此額外的大小會導致更高的頻寬使用量。在低頻寬情況下或在行動裝置上,這可能尤其成問題。

2. 令牌撤銷:一個主要的安全問題

JWT 最關鍵的限制之一是缺乏簡單的令牌撤銷。 JWT 一旦發布,在過期之前一直有效,這可能會帶來安全風險。

註銷問題:

當使用者登出時,您會期望會話立即失效。但 JWT 是無狀態的,而且伺服器沒有直接方法使令牌無效,除非將其儲存在伺服器端的某個位置,這違背了 JWT 無狀態的目的。如果 JWT 的過期時間較長,則即使使用者登出後,攻擊者也可以繼續使用竊取的令牌。

過時的代幣:

在傳統的會話系統中,當使用者的權限更新時(例如,管理員降級為普通使用者),伺服器上的會話可以立即反映該變更。對於 JWT,這種情況在令牌過期之前不會發生。這可能允許用戶保留過時權限的時間比預期的時間長,從而導致潛在的安全問題。

3. 冗餘簽名

JWT 經常因其數位簽名功能而受到稱讚,確保有效負載不被篡改。然而,現代 Web 框架會自動簽署並保護會話 cookie,這使得 JWT 簽名在許多情況下變得多餘。

問題是這樣的:

如果您在 cookie 中使用 JWT,則您的 cookie 已被框架簽名,有時甚至會被框架加密。

讓 cookie 和 JWT 都附有簽名是多餘的。

實際上,使用傳統會話 cookie 可以為您提供與 JWT 相同等級的安全性,但不會增加額外的複雜性和大小。

4. 安全漏洞

JWT 通常未加密。這意味著包含敏感使用者資訊的有效負載是 Base64 編碼的,但並未隱藏。如果有人可以攔截令牌,他們就可以輕鬆解碼有效負載以查看其內容。

某些情況下的漏洞:

中間人攻擊:如果 JWT 不是透過 HTTPS 傳輸,攻擊者就可以攔截令牌,從而獲得對使用者會話的存取權。

令牌竄改:雖然簽章可確保令牌未被竄改,但使用弱簽章演算法時會出現問題。在某些情況下,攻擊者能夠透過演算法欺騙攻擊繞過 JWT 簽名,從而導致嚴重的安全漏洞。

為了緩解這些問題,始終使用 HTTPS 和強大的簽章演算法至關重要,但即便如此,某些漏洞仍然存在。

5. 缺乏內建的過期控制

雖然 JWT 確實提供了過期時間 (exp),但過期時間是在客戶端的,這意味著客戶端將繼續使用令牌直至其過期。如果令牌被洩露,攻擊者可以使用它直到其過期,無論還剩多少時間。

這可能會導致嚴重的安全風險,尤其是對於長期存在的代幣。相較之下,傳統的會話管理可讓您立即使會話失效,從而更好地控制活動會話。

6. 使簡單用例複雜化

對於許多身份驗證系統來說,使用 JWT 可能有點矯枉過正。傳統的基於會話的身份驗證(使用 cookie 和伺服器儲存的會話資料)可以有效地處理大多數用例,而不需要複雜的令牌管理或無狀態 JWT 的額外風險。

例如:

如果您的應用程式只需要追蹤登入的用戶,則基於 cookie 的簡單方法可以提供相同的安全性,但複雜性較低。

許多現代 Web 框架會自動為您管理 cookie、簽章和加密,從而在標準登入/登出流程中不再需要 JWT。

結論:何時不使用 JWT

雖然 JWT 對於特定場景很有用,例如 API 授權或一次性資料傳輸,但它通常不是大多數 Web 應用程式中會話管理的最佳選擇。傳統的會話 cookie,尤其是現代框架提供的會話 cookie 較小、更安全且更易於管理。

在以下情況下,JWT 並不理想:

  1. 您需要輕鬆撤銷令牌。

  2. 您希望避免過度使用頻寬。

  3. 您正在處理敏感的、長期存在的會話。

簡而言之,雖然 JWT 提供了一種無狀態、獨立的身份驗證方法,但它引入了許多開發人員應仔細考慮的潛在安全和效能問題。在為您的專案採用 JWT 之前,請評估您的需求並確保它是適合該工作的工具。

這就是今天的全部內容。

另外,分享您最喜歡的網頁開發資源以幫助這裡的初學者!

與我聯絡:@ LinkedIn並查看我的作品集。

探索我的YouTube頻道!如果你覺得有用的話。

請給我的GitHub專案一顆星 ⭐️

感謝31784! 🤗


原文出處:https://dev.to/safdarali/why-do-many-people-not-recommend-using-jwt-1ol5

按讚的人:

共有 0 則留言