Cookie與Session機制以及關於他們的一些常見問題

尚硅谷教育 發佈 2023-11-17T01:11:34.525792+00:00

會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在伺服器端記錄信息確定用戶身份。

會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在伺服器端記錄信息確定用戶身份。

本文我們來說一下Cookie與Session機制,以及關於他們的一些常見問題。

一、Cookie和Session

Cookie

Cookie 是一個非常具體的東西,指的就是瀏覽器裡面能永久存儲的一種數據,僅僅是瀏覽器實現的一種數據存儲功能。

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

Cookie 相當於伺服器給瀏覽器的一個臨時的編號,這個編號與身份綁定,伺服器通過編號再去確定你的身份。

Session

Session 從字面上講,就是會話。這個就類似於你和一個人交談,你怎麼知道當前和你交談的是張三而不是李四呢?對方肯定有某種特徵(長相等)表明他就是張三。Session 也是類似的道理,伺服器要知道當前發請求給自己的是誰。為了做這種區分,伺服器就要給每個客戶端分配不同的「身份標識」,然後客戶端每次向伺服器發請求的時候,都帶上這個「身份標識」,伺服器就知道這個請求來自於誰了。至於客戶端怎麼保存這個「身份標識」,可以有很多種方式,對於瀏覽器客戶端,大家都默認採用 Cookie 的方式。伺服器使用 Session 把用戶的信息臨時保存在了伺服器上,用戶離開網站後 Session 會被銷毀。這種用戶信息存儲方式相對 Cookie 來說更安全,可是 Session 有一個缺陷:如果 web 伺服器做了負載均衡,那麼下一個操作請求到了另一台伺服器的時候 Session 會丟失。

1.1 Cookie和Session的區別

  1. 作用範圍不同, Cookie保存在客戶端(瀏覽器),Session保存在服務端。
  2. 存取方式的不同,Cookie只能保存ASCII,Session可以存任意數據類型,一般情況下我們可以在Session中保存一些常用變量信息,比如UserId等。
  3. 隱私策略不同,Cookie存儲在客戶端,比較容易遭到不法獲取,早期有人將用戶的登錄名和密碼存儲在Cookie中導致信息被竊取。Session存儲在服務端,安全性相對於Cookie要好很多。
  4. 存儲大小不同,單個Cookie保存的數據不能超過4K,Session可存儲數據遠高於Cookie。

1.2 為什麼需要Cookie和Session,他們有什麼關聯?

為什麼需要 Cookie和Session ,這就需要從瀏覽器開始說起,我們都知道瀏覽器是沒有狀態的(HTTP 協議無狀態),這意味著瀏覽器並不知道是張三還是李四在和服務端打交道。這個時候就需要有一個機制來告訴服務端,本次操作用戶是否登錄,是哪個用戶在執行的操作,那這套機制的實現就需要 Cookie 和 Session 的配合。

當用戶第一次請求伺服器的時候,

  • 伺服器根據用戶提交的相關信息,創建對應的 Session ,請求返回時將此 Session 的唯一標識信息 SessionID 返回給瀏覽器。
  • 瀏覽器接收到伺服器返回的 SessionID 信息後,會將此信息存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬於哪個域名。
  • 當用戶第二次訪問伺服器的時候,請求會自動判斷此域名下是否存在 Cookie 信息,如果存在自動將 Cookie 信息也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 信息,
  • 如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行後面操作。

根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋樑,大部分系統也是根據此原理來驗證用戶登錄狀態。

1.3 如果瀏覽器禁用了Cookie,如何判斷客戶端是否登錄

這種情況下一般有兩種解決方案:

第一種方案,每次請求中都攜帶一個SessionID的參數,也可以Post的方式提交,也可以在請求的地址後面拼接參數。

第二種方案,使用Token的機制。Token機制多用於App客戶端和伺服器交互的模式,也可以用於Web端做用戶狀態管理。

Token的意思是「令牌」,是服務端生成的一串字符串,作為客戶端進行請求的一個標識。Token機制和Cookie和Session的使用機制比較相似。就是在用戶第一次登錄後,服務端會根據用戶的信息生成一個Token,響應時將Token返回給客戶端,以後客戶端只需帶上這個Token前來請求數據即可,無需再次登錄驗證,一般這個Token會放在請求頭中。

1.4 如何考慮分布式Session問題

一般大型網際網路公司為了支撐更多的流量,後台往往都是多個伺服器共同來支撐用戶的請求,那如果用戶在A伺服器登錄了,第二次請求跑到了B伺服器,就會出現登錄失效的問題。

分布式Session一般會有以下幾種解決方案:

  1. Nginx ip_hash 策略,服務端使用Nginx代理,每個請求按照訪問IP的hash分配,這樣來自同一固定IP訪問一個後台伺服器,避免了在伺服器A登錄創建Session,第二次分發到服務B,這樣就不會有分布式Session的問題了。
  2. Session複製,任何一個伺服器上的Session發生改變,該節點會把這個Session的所有內容序列化,然後廣播給所有其他節點。
  3. 共享Session,服務端無狀態會話,將用戶的Session等信息使用緩存中間件來統一管理,保障分發到每一個伺服器的響應結果都一致。

目前比較流行的是第三種解決方案。

二、總結

Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在服務端的資料庫、文件中。

Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。

關鍵字: