1. 程式人生 > >session、cookie、token的區別與聯絡

session、cookie、token的區別與聯絡

1、定義

  • session
    • session的中文翻譯是“會話”,當用戶開啟某個web應用時,便與web伺服器產生一次session。伺服器使用session把使用者的資訊臨時儲存在了伺服器上,使用者離開網站後session會被銷燬。這種使用者資訊儲存方式相對cookie來說更安全,可是session有一個缺陷:如果web伺服器做了負載均衡,那麼下一個操作請求到了另一臺伺服器的時候session會丟失。
  • cookie

    • cookie是儲存在本地終端的資料。cookie由伺服器生成,傳送給瀏覽器,瀏覽器把cookie以kv形式儲存到某個目錄下的文字檔案內,下一次請求同一網站時會把該cookie傳送給伺服器。由於cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會佔據太多磁碟空間,所以每個域的cookie數量是有限的。

      cookie的組成有:名稱(key)、值(value)、有效域(domain)、路徑(域的路徑,一般設定為全域性:”\”)、失效時間、安全標誌(指定後,cookie只有在使用SSL連線時才傳送到伺服器(https))。 這裡寫圖片描述

  • token
    • token的意思是“令牌”,是使用者身份的驗證方式,最簡單的token組成:uid(使用者唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,由token的前幾位+鹽以雜湊演算法壓縮成一定長的十六進位制字串,可以防止惡意第三方拼接token請求伺服器)。還可以把不變的引數也放進token,避免多次查庫

2、區別和聯絡

  • session與cookie的區別:
    • 1 session儲存在伺服器,客戶端不知道其中的資訊;cookie儲存在客戶端,服務端可以知道其中的資訊
    • 2 session中儲存的是物件,cookie中儲存的是字串
    • 3 session不能區分路徑,同一個使用者在訪問一個網站期間,所有的session在任何一個地方都可以訪問到;而cookie中如果設定了路徑引數,那麼同一個網站中不同路徑下的cookie互相是訪問不道德
    • 4 cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。
    • 5 session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用COOKIE。
    • 6 單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
  • session與cookie的聯絡:
    • session是需要藉助cookie才能正常工作的,如果客戶端完全禁止cookie,session將失效
  • token 和session 的區別 session 和 oauth token並不矛盾,作為身份認證 token安全性比session好,因為每個請求都有簽名還能防止監聽以及重放攻擊,而session就必須靠鏈路層來保障通訊安全了。如上所說,如果你需要實現有狀態的會話,仍然可以增加session來在伺服器端儲存一些狀態

    App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那樣用cookie來儲存session,因此用session token來標示自己就夠了,session/state由api server的邏輯處理。 如果你的後端不是stateless的rest api, 那麼你可能需要在app裡儲存session.可以在app裡嵌入webkit,用一個隱藏的browser來管理cookie session.

    Session 是一種HTTP儲存機制,目的是為無狀態的HTTP提供的持久機制。所謂Session 認證只是簡單的把User 資訊儲存到Session 裡,因為SID 的不可預測性,暫且認為是安全的。這是一種認證手段。 而Token ,如果指的是OAuth Token 或類似的機制的話,提供的是 認證 和 授權 ,認證是針對使用者,授權是針對App 。其目的是讓 某App有權利訪問 某使用者 的資訊。這裡的 Token是唯一的。不可以轉移到其它 App上,也不可以轉到其它 使用者 上。 轉過來說Session 。Session只提供一種簡單的認證,即有此 SID,即認為有此 User的全部權利。是需要嚴格保密的,這個資料應該只儲存在站方,不應該共享給其它網站或者第三方App。 所以簡單來說,如果你的使用者資料可能需要和第三方共享,或者允許第三方呼叫 API 介面,用 Token 。如果永遠只是自己的網站,自己的 App,用什麼就無所謂了。

    token就是令牌,比如你授權(登入)一個程式時,他就是個依據,判斷你是否已經授權該軟體;cookie就是寫在客戶端的一個txt檔案,裡面包括你登入資訊之類的,這樣你下次在登入某個網站,就會自動呼叫cookie自動登入使用者名稱;session和cookie差不多,只是session是寫在伺服器端的檔案,也需要在客戶端寫入cookie檔案,但是檔案裡是你的瀏覽器編號.Session的狀態是儲存在伺服器端,客戶端只有session id;而Token的狀態是儲存在客戶端。

3、什麼是JWT

Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的宣告資訊,該token也可直接被用於認證,也可被加密。

基於session認證所顯露的問題

Session: 每個使用者經過我們的應用認證之後,我們的應用都要在服務端做一次記錄,以方便使用者下次請求的鑑別,通常而言session都是儲存在記憶體中,而隨著認證使用者的增多,服務端的開銷會明顯增大。

擴充套件性: 使用者認證之後,服務端做認證記錄,如果認證的記錄被儲存在記憶體中的話,這意味著使用者下次請求還必須要請求在這臺伺服器上,這樣才能拿到授權的資源,這樣在分散式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴充套件能力。

CSRF: 因為是基於cookie來進行使用者識別的, cookie如果被截獲,使用者就會很容易受到跨站請求偽造的攻擊。

基於token的鑑權機制

基於token的鑑權機制類似於http協議也是無狀態的,它不需要在服務端去保留使用者的認證資訊或者會話資訊。這就意味著基於token認證機制的應用不需要去考慮使用者在哪一臺伺服器登入了,這就為應用的擴充套件提供了便利。

流程上是這樣的:

使用者使用使用者名稱密碼來請求伺服器 伺服器進行驗證使用者的資訊 伺服器通過驗證傳送給使用者一個token 客戶端儲存token,並在每次請求時附送上這個token值 服務端驗證token值,並返回資料 這個token必須要在每次請求時傳遞給服務端,它應該儲存在請求頭裡, 另外,服務端要支援CORS(跨來源資源共享)策略,一般我們在服務端這麼做就可以了Access-Control-Allow-Origin:T