夯實基礎:徹底搞清楚Cookie 和 Session 關係和區別

Cookie 和 Session 關係和區別

在技術面試中,經常被問到“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;


分享到:


相關文章: