愛伊米

Session 與 Cookie 的關係和區別詳解

Session 與 Cookie 最主要的區別就是,Session 是以物件的形式儲存在伺服器端,而 Cookie 則是以字串的 形式儲存在客戶端。HTTP 協議是一種無連線的協議,當客戶端發出一個請求時,它們之間就會建立一個連線,等伺服器響應了這個請求,這個連線就會被斷開,這時候伺服器再也不記得先前與客戶端的那次親密接觸,一些使用者資訊當然也就消失了。

Session 與 Cookie 的關係和區別詳解

Cookie 就是為了處理這類的情況的,它可以把使用者的資訊儲存起來。比如使用者登入到某個網站,伺服器把使用者登入的資訊儲存到客戶端的 Cookie 中,這樣使用者感覺這個網站已經記著了自己。但是 Cookie 有它的缺點不宜儲存過長的資料。

而且 Cookie 是以檔案的形式儲存在客戶端的磁碟上,所以一 些重要資料很容易被修改,比如使用者購買一些東西之後,修改自己的餘額,然後提交給伺服器,這種行為是一定不能允許的。而 Session 就能保證資料的安 全,因為它是儲存在伺服器上的,伺服器透過一個唯一的 SessionID 來區別不同的使用者。這個 SessionID 就儲存在客戶端的 Cookie中(預設)或者重定向到URL裡。

現在就來看看為什麼要把 SessionID 儲存到 Cookie 中,當我們開啟一個新的視窗時,系統會分配一個新的 SessionID,這樣伺服器就會認為是不同的使用者發出的請求,比如有這樣一個程式:

session_start();if(!$_SESSION[‘val’]){ $_SESSION[‘val’]=1;}else{ $val=$_SESSION[‘val’]; $val++; $_SESSION[‘val’]=$val;}echo $_SESSION[‘val’];

每次重新整理頁面,都會的到不同的累加值。但是如果我在瀏覽器的配置裡禁用了 Cookie,再重新整理頁面,發現這個值沒有變化,永遠是1。系統給每次重新整理的頁面分配了新的 SessionID。每次開啟新的頁面時,系統就會看 Cookie 中的是否有 sessionID,如果有就不會分配新的 sessionID。當然還有別的辦法記住 sessionID,那就是重寫在url裡。

雖然 Session 是儲存在伺服器端的,但它也是依靠 Cookie 來實現其功能的。

Cookie 機制

正統的 Cookie 分發是透過擴充套件 HTTP 協議來實現的,伺服器透過在 HTTP 的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的 Cookie。然而純粹的客戶端指令碼如JavaScript 或者 VBScript 也可以生成 Cookie。而 Cookie 的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的 Cookie,如果某個 Cookie 所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該 Cookie 附在請求資源的 HTTP 請求頭上傳送給伺服器。

Cookie 的內容主要包括:名字、值、過期時間、路徑和域。路徑與域一起構成 Cookie 的作用範圍。若不設定過期時間,則表示這個 Cookie 的生命期為瀏覽器會話期間,關閉瀏覽器視窗,Cookie 就消失。這種生命期為瀏覽器會話期的 Cookie 被稱為會話 Cookie。會話 Cookie 一般 不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把 Cookie 儲存到硬碟上,關閉後再次開啟瀏覽器,這些 Cookie 仍然有效直到超過設定的過期時間。儲存在硬碟上的 Cookie 可以在不同的瀏覽器程序間共享,比如兩個 IE 視窗。而對於儲存在記憶體裡的 Cookie,不同的瀏覽器有不同的處理方式

Session 機制

Session 機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。

當程式需要為某個客戶端的請求建立一個 Session 時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個 Session 標識(稱為 Session ID),如果已包含則說明以前已經為此客戶端建立過 Session,伺服器就按照 Session ID 把這個 Session 檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含 Session ID,則為此客戶端建立一個 Session 並且生成一個與此 Session 相關聯的 Session ID,Session ID 的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個 Session ID 將被在本次響應中返回給客戶端儲存。

儲存這個 Session ID 的方式可以採用 Cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給伺服器。一般這個 Cookie 的名字都是類似於 SEEESIONID。但 Dookie 可以被人為的禁止,則必須有其他機制以便在 Cookie 被禁止時仍然能夠把 Session ID 傳遞迴伺服器。

經常被使用的一種技術叫做 URL 重寫,就是把 Session ID 直接附加在 URL 路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把 Session ID傳遞迴伺服器。比如:

實際上這種技術可以簡單的用對 Action 應用 URL 重寫來代替。