在技術面試中,經常被問到“Cookie和Session的區別”,大家都知道一些,Session比Cookie安全,Session是儲存在伺服器端的,Cookie是儲存在客戶端的,然而如果讓你更詳細地說明,恐怕就不怎麼清楚了。
什麼是HTTP
首先要先介紹什麼是HTTP
HTTP 是無狀態協議,說明它不能以狀態來區分和管理請求和響應。也就是說,伺服器單從網路連線上無從知道客戶身份。
可是怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
1.Cookie
什麼是cookie
Cookie翻譯過來是‘ 小甜餅’,Cookie是客戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,實際上Cookie是伺服器在本地機器上儲存的一小段文字,並隨著每次請求傳送到伺服器。
Cookie技術通過請求和響應報文中寫入Cookie資訊來控制客戶端的狀態。
Cookie會根據響應報文裡的一個叫做Set-Cookie的首部欄位資訊,通知客戶端儲存Cookie。當下客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值之後傳送出去.
之後服務端發現客戶端傳送過來的Cookie後,會檢查是那個客戶端傳送過來的請求,然後對伺服器上的記錄,最後得到了之前的狀態資訊。
客戶端儲存了Cookie之後的發起請求
第一可以很明顯的可出首部欄位內沒有Cookie的相關資訊,其次也能看到set-Cookie裡的資訊,這就是伺服器端生撐的Cookei資訊。
看之後請求,請求報文裡都自動傳送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的區別
- cookie資料存放在客戶的瀏覽器(客戶端)上,session資料放在伺服器上,但是服務端的session的實現對客戶端的cookie有依賴關係的;
- cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session;
- session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能。考慮到減輕伺服器效能方面,應當使用COOKIE;
- 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K;