Cookie 和 Session 關係和區別

Fysddsw_lc發表於2018-03-14

在技術面試中,經常被問到“Cookie和Session的區別”,大家都知道一些,Session比Cookie安全,Session是儲存在伺服器端的,Cookie是儲存在客戶端的,然而如果讓你更詳細地說明,恐怕就不怎麼清楚了。

本文分別對Cookie與Session做一個介紹和總結,並分別對兩個知識點進行對比分析,讓大家對Cookie和Session有更深入的瞭解。

什麼是HTTP

首先要先介紹什麼是HTTP

HTTP:超文字傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分散式、協作式和超媒體資訊系統的應用層協議。HTTP是全球資訊網的資料通訊的基礎。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源識別符號(Uniform Resource Identifiers,URI)來標識。

HTTP 是無狀態協議,說明它不能以狀態來區分和管理請求和響應。也就是說,伺服器單從網路連線上無從知道客戶身份。

可是怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。

Cookie 和 Session 關係和區別

1.Cookie

什麼是cookie

Cookie翻譯過來是‘ 小甜餅’,Cookie是客戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,實際上Cookie是伺服器在本地機器上儲存的一小段文字,並隨著每次請求傳送到伺服器。

Cookie技術通過請求和響應報文中寫入Cookie資訊來控制客戶端的狀態。

Cookie會根據響應報文裡的一個叫做Set-Cookie的首部欄位資訊,通知客戶端儲存Cookie。當下客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值之後傳送出去.

之後服務端發現客戶端傳送過來的Cookie後,會檢查是那個客戶端傳送過來的請求,然後對伺服器上的記錄,最後得到了之前的狀態資訊。

Cookie 和 Session 關係和區別

客戶端儲存了Cookie之後的發起請求

Cookie 和 Session 關係和區別

Cookie 和 Session 關係和區別

上圖很清晰地展示了發生Cookie 互動的情景,HTTP 請求報文和響應報文的內容如圖所示。

第一可以很明顯的可出首部欄位內沒有Cookie的相關資訊,其次也能看到set-Cookie裡的資訊,這就是伺服器端生撐的Cookei資訊。

Cookie 和 Session 關係和區別

看之後請求,請求報文裡都自動傳送Cookie資訊了。

set-Cookie的欄位的屬性

Set-Cookie: logcookie=3qjj; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/;
 domain=fafa.com;secure; HttpOnly;
複製程式碼

以上面的set-cookie的例子,說一下set-cookie的屬性

1.logcookie=3qjj 賦予Cookie的名稱和值,logcookie是名字 ,3qjj是值

2.expires 是設定cookie有效期。當省略expires屬性時,Cookie僅在關閉瀏覽器之前有效。可以通過覆蓋已過期的Cookie,設定這個Cookie的過期時間是過去的時間,實現對客戶端Cookie 的實質性刪除操作。

3.path 是限制指定Cookie 的傳送範圍的檔案目錄。不過另有辦法可避開這項限制,看來對其作為安全機制的效果不能抱有期待。

4.domain 通過domain屬性指定的域名可以做到與結尾匹配一致。比如,指定domain是fafa.com,除了fafa.com那麼www.fafa.com等都可以傳送Cookie。

5.secure 設定web頁面只有在HTTPS安全連線時,才可以傳送Cookie。HHTP則不可以進行回收。

6.HttpOnly 它使JavaScript 指令碼無法獲得Cookie,通過上述設定,通常從Web 頁面內還可以對Cookie 進行讀取操作。但使用JavaScript 的document.cookie 就無法讀取附加HttpOnly 屬性後的Cookie 的內容了

2.Session管理和Cookie應用

什麼是Session

上面我講到服務端執行session機制時候會生成session的id值,這個id值會傳送給客戶端,客戶端每次請求都會把這個id值放到http請求的頭部傳送給服務端,而這個id值在客戶端會儲存下來,儲存的容器就是cookie,因此當我們完全禁掉瀏覽器的cookie的時候,服務端的session也會不能正常使用。

 PHP中的Session在預設情況下是使用客戶端的Cookie來儲存Session ID的,所以當客戶端的cookie出現問題的時候就會影響Session了。必須注意的是:Session不一定必須依賴Cookie,這也是Session相比Cookie的高明之處。當客戶端的Cookie被禁用或出現問題時,PHP會自動把Session ID附著在URL中,這樣再通過Session ID就能跨頁使用Session變數了。

Cookie 和 Session 關係和區別1.客戶端把資訊放入報文的實體部分,通常是以POST 方法把請求傳送給伺服器。

2.伺服器會發放用以識別使用者的Session ID。通過驗證從客戶端傳送過來的資訊進行驗證,然後把使用者的認證狀態與Session ID 繫結後記錄在伺服器端。向客戶端返回響應時,會在首部欄位Set-Cookie 內寫入Session ID(如PHPSESSID=l128ogl…)。你可以把Session ID 想象成一種用以區分不同使用者的唯一Id。

步驟三:客戶端接收到從伺服器端發來的Session ID 後,會將其作為Cookie 儲存在本地。下次向伺服器傳送請求時,瀏覽器會自動傳送Cookie,所以Session ID 也隨之傳送到伺服器。伺服器端可通過驗證接收到的Session ID 驗證狀態。

3.Cookie與Session的區別

  1. cookie資料存放在客戶的瀏覽器(客戶端)上,session資料放在伺服器上,但是服務端的session的實現對客戶端的cookie有依賴關係的;
  2. cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session;
  3. session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能。考慮到減輕伺服器效能方面,應當使用COOKIE;
  4. 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K;


相關文章