Cookie 和 Session 關係和區別

在技術面試中,常常被問到「Cookie和Session的區別」,你們都知道一些,Session比Cookie安全,Session是存儲在服務器端的,Cookie是存儲在客戶端的,然而若是讓你更詳細地說明,恐怕就不怎麼清楚了。web

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

什麼是HTTP

首先要先介紹什麼是HTTP面試

HTTP:超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分佈式、協做式和超媒體信息系統的應用層協議。HTTP是萬維網的數據通訊的基礎。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。經過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。

HTTP 是無狀態協議,說明它不能以狀態來區分和管理請求和響應。也就是說,服務器單從網絡鏈接上無從知道客戶身份。
瀏覽器

但是怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。安全


1.Cookie

什麼是cookie

Cookie翻譯過來是‘ 小甜餅’,Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,實際上Cookie是服務器在本地機器上存儲的一小段文本,並隨着每次請求發送到服務器。bash

Cookie技術經過請求和響應報文中寫入Cookie信息來控制客戶端的狀態。服務器

Cookie會根據響應報文裏的一個叫作Set-Cookie的首部字段信息,通知客戶端保存Cookie。當下客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值以後發送出去.cookie

以後服務端發現客戶端發送過來的Cookie後,會檢查是那個客戶端發送過來的請求,而後對服務器上的記錄,最後獲得了以前的狀態信息。網絡


客戶端保存了Cookie以後的發起請求
session



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

第一能夠很明顯的可出首部字段內沒有Cookie的相關信息,其次也能看到set-Cookie裏的信息,這就是服務器端生撐的Cookei信息。dom


看以後請求,請求報文裏都自動發送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變量了。

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;
相關文章
相關標籤/搜索