當前位置: 妍妍網 > 碼農

徹底弄明白Session 和 Token

2024-02-01碼農

大家好,我是了不起。

在構建使用者身份管理系統時,選擇會話(Session)還是令牌(Token)是一個關鍵決策,取決於系統的需求和特定的使用場景。本文將深入探討何時適合使用會話,何時適合使用令牌,以幫助開發人員在實際套用中做出明智的選擇。

什麽是Session

眾所周知, HTTP協定它是無狀態的協定 ,瀏覽器多次請求伺服器,伺服器它無法感知是不是同一使用者的請求,於是就有了Session機制。

Session機制是一種在Web開發中用於跟蹤使用者狀態的機制。

  • 它的基本工作流程是,當使用者第一次請求Web伺服器時,伺服器會生成一個唯一的Session,並將其儲存在伺服器端(通常可以持久化到資料庫中)。

  • 然後,伺服器透過響應頭的方式將該Session的識別元(SessionID)返回給瀏覽器,並儲存在瀏覽器的Cookie中。

  • 隨後的每一次請求,瀏覽器都會將攜帶該SessionID,伺服器透過SessionID找到對應的Session,從而實作對使用者狀態的跟蹤。

  • 然而,Session機制在分布式部署下存在一定弊端,尤其是在負載均衡環境中容易導致會話驗證失敗。

    什麽是Token

    為了解決Session機制的弊端, Token 機制應運而生。

    Token,也稱為令牌,一般由金鑰、公鑰、時間戳等元素透過加密演算法(如MD5、SHA)生成。

    在Token機制中,使用者在透過身份驗證後,伺服器會生成一個Token並返回給客戶端。客戶端在後續的每次請求中都攜帶這個Token,而伺服器透過驗證Token的合法性來判定請求是否有效。

    Session與Token

    相比Session,Token的優勢在於它可以輕松應對分布式部署和負載均衡環境,因為Token是無狀態的,每個請求都攜帶了足夠的資訊進行驗證,不依賴於特定的伺服器節點。

    這使得Token成為一種更為靈活和可延伸的身份驗證和授權機制。

    相同點:

    1. 身份驗證手段: Session和Token都是用於使用者身份驗證的手段,用於標識使用者並維持其登入狀態。

    2. 過期時間: 兩者都可以設定過期時間,限制了它們的有效期,增加安全性。

    不同點:

    1. 儲存位置:

  • Session: 儲存在伺服器端,可以保存在記憶體、資料庫、NoSQL等持久化儲存中。

  • Token: 儲存在客戶端,通常儲存在瀏覽器的Cookie中或本地儲存。

  • 數據永續性:

  • Session: 數據可以持久化到伺服器端,但如果沒有進行持久化,一旦伺服器重新開機,Session數據可能遺失。

  • Token: 由於儲存在客戶端,Token本身是無狀態的,不受伺服器重新開機的影響。

  • 數據互動方式:

  • Session: 透過在請求頭中傳遞SessionID進行數據互動。

  • Token: 透過在請求頭或請求參數中攜帶Token進行數據互動。

  • 空間換時間 vs 時間換空間:

  • Session: 采用空間換時間的策略,因為需要在伺服器端儲存Session數據。

  • Token: 采用時間換空間的策略,因為Token儲存在客戶端,不占用伺服器端空間,每次驗證都需要解析Token。

  • 套用場景

    會話的套用場景:

  • Web 套用中,透過 cookie 或伺服器端儲存實作使用者登入狀態的跟蹤。

  • 需要在使用者存取期間保持狀態資訊的套用,例如購物車資訊等。

  • 令牌的套用場景:

  • token主要用於 Restful API 等無狀態應用程式中,例如分布式系統,透過 OAuth 進行身份驗證和授權。

  • 行動應用或小程式中,使用 JSON Web Token (JWT) 進行身份驗證。

  • 小結

    session 和 token 本質上是沒有區別的,都是對使用者身份的認證機制。

    在實際套用中,需要根據具體需求權衡兩者之間的選擇,並采取相應的安全措施來保障使用者身份的安全性和私密。在不同的業務場景中合理選型,才能達到事半功倍的效果。

    寫在最後

    加我微信,一起交流。