Stop Using JWTs for Web Sessions: Analysis of the Debate

這場辯論的核心結論是,雖然 JSON Web Tokens (JWTs) 對於服務對服務的通訊以及短暫的身份驗證快取非常有效,但它們通常不是瀏覽器端使用者會話 (user sessions) 的正確工具。主要的衝突源於「無狀態性」的感知益處與「會話撤銷」的實際必要性之間的權衡。

The Case Against JWTs for Browser Sessions

JWTs 經常因為其設計上的無狀態性而被批評為不適合使用者會話。這造成了一個關鍵的安全漏洞:在不將狀態重新引入系統的情況下,無法在令牌 (token) 到期之前使其失效。

The Revocation Dilemma

如果使用者登出或會話遭到入侵,無狀態的 JWT 會一直有效,直到其生存時間 (TTL) 到期。為了解决這個問題,開發者通常會實作一個「撤銷清單」(或黑名單) 來記錄失效的令牌。然而,正如社群成員所指出的,如果你為了確保安全而維護一個有狀態的撤銷清單,你實際上已經重新引入了狀態,從而抵消了使用 JWTs 而非傳統會話 Cookie 的主要架構優勢。

Complexity vs. Simplicity

對於許多應用程式而言,傳統的會話 Cookie——即伺服器將會話 ID 儲存在資料庫中,並在每次請求時進行驗證——更簡單且更安全。這種方法允許立即終止會話,並在不需要客戶端進行加密簽章與驗證的額外開銷下,更輕鬆地管理使用者狀態。

The Case for JWTs and Alternative Implementations

儘管存在批評,許多工程師認為,在特定的限制與模式下使用 JWTs 是合適的。

Service-to-Service Communication

業界對於 JWTs 非常適合微服務之間的內部通訊已有強烈的共識。在這些情境下,一個中央身份驗證服務可以核發一個令牌,子服務可以使用公鑰 (RS256) 驗證該令牌,而無需針對每次請求都查詢中央資料庫。這降低了延遲,並防止子服務需要直接存取身份驗證資料庫。

Short-Lived Tokens and Refresh Patterns

為了減輕無狀態性的風險,一些開發者使用極短的暫時性存取令牌 (例如 5 分鐘) 並結合刷新令牌 (refresh token) 系統。

"I use 5 minutes. Most sessions on my site last 4-10 minutes. Worst case scenario, a malicious user is able to access certain read-only resources for a few minutes."

這種方法在維持避免每次請求都查詢資料庫的效能優勢的同時,限制了遭入侵令牌的漏洞窗口。

Advanced Revocation Strategies

有些人認為,針對 JWTs 的撤銷清單實際上比完整的會話儲存空間更有效率。因為只需要追蹤失效的令牌 (而非所有活動中的會話),被查詢的資料集會顯著縮小。此外,像 minimum_issued_at 這樣的模式可以用於使所有在特定時間戳記之前核發的令牌失效 (例如在「從所有裝置登出」事件中),而無需追蹤個別的令牌 ID。

Alternatives and Industry Standards

雖然辯論的焦點在於 JWTs 與會話 (Sessions) 之間的對比,但一些技術貢獻者建議轉向更現代的標準:

  • PASETO (Platform-Agnostic Security Tokens): 被建議作為 JWTs 的更安全替代方案,因為它避免了 JWT 規範中的一些設計缺陷,並降低了實作錯誤的風險。
  • JWE (JSON Web Encryption): 建議用於必須將敏感資料儲存在令牌內的案例,因為標準的 JWTs 僅進行簽章 (encoded),而非加密。

Summary of Use Cases

Use Case Recommended Approach Reasoning
Browser User Sessions Session Cookies Immediate revocation, lower complexity
Microservices / API JWTs Decoupled auth, reduced database load
High-Security Actions Re-authentication Require password/MFA regardless of token state
Internal Service Auth PASETO / JWT Requirement: Standardized, cryptographically verified

Sources