1. 程式人生 > >Session和Cookie的區別,及多視窗/多伺服器下的Session解決方案

Session和Cookie的區別,及多視窗/多伺服器下的Session解決方案

1. Session和Cookie最大的區別是在於Session變數的值是儲存在伺服器端的(在客戶端和伺服器端保持狀態),Cookie變數的值是儲存在客戶端的(在客戶端保持狀態)。 2. 伺服器上會儲存每一個使用者的Session,之間通過Session ID來作為唯一識別符號。當客戶端與伺服器端進行通訊請求建立一個新的Session時,伺服器端會先檢查這個請求裡是否已經包含了Session ID:如果已經包含了,則證明已存在為此使用者建立的Session,客戶端會將之前的Session檢索出來使用;如果不包含,則客戶端會建立一個Session及其Session ID,並在此次請求返回時將此Session ID 返回給使用者。
3. Cookie 分為 Session Cookie(會話性Cookie) 和 Persistent Cookie(永續性Cookie)。它們的主要區別是:Session Cookie不包含到期日期,其儲存在記憶體中,不會寫入磁碟,當瀏覽器關閉時,此Cookie將永久刪除;Persistent Cookie包含到期日期,其一般儲存在磁碟中,在指定的到期日期,Cookie將從磁碟中刪除。從安全性上來說,顯然Session Cookie的安全性更高。因為它只針對某一次會話存在,當會話結束,Session Cookie就會被刪除。Persistent Cookie 通常是一段儲存在本地的加密文字,可能會遭受到Cookie欺騙、跨站指令碼攻擊等。
4. 瀏覽器的關閉並不會導致Session失效,重啟瀏覽器是本地操作,並不會影響到伺服器的資料(Session)。然而大多數Session ID 都通過Cookie儲存在本地。所以當瀏覽器重啟時,Session Cookie被刪除,因此客戶端再次向伺服器傳送請求時就無法找到在伺服器上相對應的Session了。由於在伺服器上的Session不會被刪除,所以伺服器上的Session會設定會話失效時間,當上一次使用Session的時間間隔已經超過了此失效時間,伺服器就認為客戶端已經停止使用此Session,會將Session刪除以節省儲存空間。 5.  在多視窗的應用中,伺服器一般會採取Session Cookie和Persistent Cookie結合
的方式來保證使用者端的登陸狀態不會失效。在使用者新開一個新視窗時,可以先把Session Cookie中的Session ID寫入Persistent Cookie中,再通過新視窗讀取,併發送通訊請求。這樣就可以實現跨視窗的Session Tracking(會話追蹤)。
6. 在多伺服器的應用中,Session的儲存(在多伺服器間的通用)可以通過以下幾個方式解決。
  • 使用獨立的快取器。既將Session的資料儲存在一個獨立的伺服器上。但是這樣可能會有一些安全隱患,因此我們可以通過使用memcached分散式快取伺服器來進行儲存。
  • 伺服器之間的Session不斷傳遞和複製(Tomcat容器的採用方案)。但這種方法有一種弊端,經人測試,web應用所能承載的併發數並沒有因為伺服器的增加而線性增加,甚至到達一個臨界值時,新增伺服器甚至會導致併發數的下降。原因是因為不同伺服器間Session的傳遞和複製也會消耗系統資源,當伺服器越多/使用者請求越頻繁,系統資源的消耗也會越來越大。
  • Session Cookie直接儲存到Persistent Cookie中(早期淘寶採用的方案)。但是這種方式不安全,容易遭受惡意擷取Cookie等攻擊。
  • Load Balancer - 負載均衡器(硬體:F5;軟體:LVS)。負載均衡器可以分發請求,將使用者請求均勻地傳送到後臺伺服器。它還有一個特點,它可以記錄每個Session ID對應的伺服器。當帶有Session ID的請求通過負載均衡器時,它會根據該值直接找到相對應的Web伺服器。這種做法的專有名詞叫做Sticky Session(Session粘滯)。不過這種做法也有一個弊端,當某個伺服器掛掉的時候,其上儲存的所有Session都會失效。