在技術面試中,常常被問到「Cookie和Session的區別」,你們都知道一些,Session比Cookie安全,Session是存儲在服務器端的,Cookie是存儲在客戶端的,然而若是讓你更詳細地說明,恐怕就不怎麼清楚了。web
首先要先介紹什麼是HTTP面試
HTTP 是無狀態協議,說明它不能以狀態來區分和管理請求和響應。也就是說,服務器單從網絡鏈接上無從知道客戶身份。
瀏覽器
但是怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。安全
Cookie翻譯過來是‘ 小甜餅’,Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,實際上Cookie是服務器在本地機器上存儲的一小段文本,並隨着每次請求發送到服務器。bash
Cookie技術經過請求和響應報文中寫入Cookie信息來控制客戶端的狀態。服務器
Cookie會根據響應報文裏的一個叫作Set-Cookie的首部字段信息,通知客戶端保存Cookie。當下客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值以後發送出去.cookie
以後服務端發現客戶端發送過來的Cookie後,會檢查是那個客戶端發送過來的請求,而後對服務器上的記錄,最後獲得了以前的狀態信息。網絡
客戶端保存了Cookie以後的發起請求
session
第一能夠很明顯的可出首部字段內沒有Cookie的相關信息,其次也能看到set-Cookie裏的信息,這就是服務器端生撐的Cookei信息。dom
看以後請求,請求報文裏都自動發送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 的內容了
上面我講到服務端執行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 驗證狀態。