Cookie & Session詳解

FrankTiao發表於2020-07-21

1. Cookie

1.1 Cookie的基本概念及設定

   首先需要理解的是cookie不是任何一種語言的技術,而是獨屬於客戶端(包括但不限於瀏覽器)的一種儲存機制。所以說不管是PHP或是JavaScript都不能直接操作cookie,而是透過HTTP協議‘通知’到瀏覽器,由瀏覽器進行操作。
同時也可以將cookie設定為僅HTTP協議才能訪問(例如在php中的setcookie函式中設定httpOnly引數),設定之後js等都不能操作該cookie。

1.2 Cookie的儲存機制應用

   cookie沒有顯式的刪除方式,只能透過設定過期時間的方式來刪除cookie。如果cookie沒有設定過期時間則儲存在記憶體中,即隨著瀏覽器的關閉而清除。如果設定了過期時間,在過期之前cookie都是儲存在電腦的硬碟中。

   需要注意的是一個域名下cookie的儲存數量是有限制的,根據瀏覽器的不同限制也不相同(例如IE8中可儲存50個,火狐可儲存150個),另外一個cookie的最大儲存位元組有限制的,限制也是由瀏覽器決定的。

   cookie的應用場景一般來說都是用於記住登入狀態、瀏覽歷史等這些不算敏感但能提升使用者體驗的東西。需要注意一點,上面提到過cookie與服務端的通訊是基於HTTP的,所以cookie的上行下載對頻寬的消耗較高。

1.3 Cookie跨域與P3P

   正常的cookie只能在建立它的應用中共享,實現cookie的跨域,主要是為了實現單點登入的需求。P3P是cookie跨域的最簡單的實現方式,具體實現方式可自行搜尋,懶得寫了。

2. Session

   Session即會話,是一鍾雙向的、持續性的連線。Seeion和Cookie在本質上並沒有什麼區別,都是為了解決HTTP協議的侷限性而提出的保持客戶端與服務端會話連線狀態的一種機制。Session的實現方式有多種,例如URL重寫、Cookie,透過在Cookie中設定SessionID傳遞等方式。

2.1 Session的基本概念及設定

   和Cookie一樣Session也是一個通用標準,在不同的的語言中實現的方式也不同。就web站點的角度來講,session是指客戶端從開啟網頁到關閉瀏覽器的這段時間的會話,所以從這裡可以看出Session實際上一種是時間概念。Seeion可以實現在程式上下文中傳遞變數、使用者身份認證、記錄程式狀態等。
   PHP的預設Session由檔案形式的,即儲存在伺服器硬碟中的檔案,每個session一個檔案,檔案內容格式如下:

變數名|型別:長度:;
2.2 Session的工作原理

   我們知道HTTP協議是不能儲存客戶端和服務端的會話狀態的,Session和Cookie都是為了解決這個缺陷而被設計出來的。
   在PHP中,Session是透過一個叫做PHPSESSION的Cookie來保持會話的,即服務端生成一個Session檔案儲存在伺服器中,這個檔案的檔名就是SessionID,服務端將這個SessionID設定客戶端的一個名為PHPSESSION的Cookie的值,在HTTP request 和 HTTP reponse中傳來傳去,以此來實現會話狀態的保持。

2.3 Session與Cookie的關係

   上文說到Session是將SessionID設定為一個名叫PHPSESSION的Cookie,然後在請求和響應中帶上它來保持會話狀態的。那麼,如果客戶端禁用了Cookie的話Session還能否傳遞?答案肯定是可以的,但是卻不能透過Cookie的方式傳遞了,傳遞Session的實現的方式有很多種,例如重寫URL,如:

domain.com/index.php/SESSIONID=xxxxxxx

或者在表單中傳遞,還可以儲存在localStorage中使用JS傳遞等等…

3. Q & A

3.1 Cookie執行在客戶端,Session執行在服務端對嗎?

   不完全對。Cookie執行在客戶端,由客戶端進行管理。Session雖然執行在服務端,但是SessionID是作為一個Cookie執行在客戶端的。

3.2 瀏覽器禁用Cookie,Cookie就不能用了,但Session不受影響對嗎?

  錯。瀏覽器禁用Cookie,Cookie就不能用了,同時SessionID也不能透過Cookie傳遞了,但可以透過其他方式傳遞,上文有講。

3.3 關閉瀏覽器後,Cookie和Session都會清除,對嗎?

   錯。只有儲存在記憶體中的Cookie會在瀏覽器關閉後被清除,儲存在硬碟中的不會。而Session在瀏覽器關閉後也不會消失,除非正常退出,在程式碼中使用unset刪除Session,否則Session可能會被回收,也可能永遠殘留在系統中。

3.4 Session比Cookie更安全嗎?不應該大量使用Cookie嗎?

  錯。Cookie確實存在一些不安全因素,但即使突破了前端驗證還有後端保障安全。在上文講到過通常情況下Session和Cookie是繫結的,劫持了Cookie就等於劫持了Session。只能說一切都要看設計。

3.5 Session是建立在服務端的,所以應該多用Cookie對嗎?

  錯。Cookie可以提高使用者體驗。但是卻會加大網路間的傳輸流量,所以應該在Cookie中僅儲存必要的資料。

3.6 如果把別人的Cookie複製到我的電腦中(相同的瀏覽器),是否也能登陸別人的賬號呢?如何防範?

  是的。這屬於Cookie劫持的一種。要避免這種情況可以在Cookie中針對IP、UA等加上特殊的校驗方式,然後和服務端進行對比。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章