定義
- Cookie:指網站為了辨別用戶身份而儲存在用戶本地終端上的數據(通常經過加密)。
- Session:也稱會話,是一種持久網絡協(xié)議,在用戶(或用戶代理)端和服務器端之間創(chuàng)建關聯(lián)嫡秕,從而起到交換數據包的作用機制。
提出的背景
提出Cookie和Session主要是針對Http的無狀態(tài)的設計苹威,Server和Client不會一直保持連線狀態(tài)淘菩,也不會有雙方狀態(tài)的及時更新。因此,Server無法知道Client的狀態(tài)潮改,如登錄信息狭郑、購物車等等。
Cookie就是采用客戶端的狀態(tài)保持方案汇在,而Session則采用服務器端的狀態(tài)保持方案翰萨。
工作原理
1. Cookie
在典型的購物場景中,用戶瀏覽了幾個頁面糕殉,買了一盒餅干和兩瓶飲料亩鬼。最后結賬時由于Http是無狀態(tài)的,不通過額外的手段阿蝶,服務器并不知道用戶到底買了什么雳锋,所以Cookie就是用來解決Http無狀態(tài)的額外方法。服務器可以設置或讀取Cookies中的信息羡洁,借此維護用戶跟服務器會話中的狀態(tài)玷过。
當用戶購買了第一項商品后,服務器向用戶發(fā)送網頁的同時還發(fā)送了一段Cookie(Set-Cookie)筑煮,記錄了那項商品的信息辛蚊。當用戶訪問另外一個頁面時,瀏覽器會把Cookie發(fā)送給服務器真仲,用于服務器知道用戶之前選購了什么袋马。如果用戶繼續(xù)選購,服務器就在原來那段Cookie中添加新的商品信息秸应。結賬時虑凛,服務器就讀取發(fā)送來的Cookie(Get-Cookie)。
Cookie另一個典型的應用場景就是登陸一個網站時软啼,網站往往會請求用戶輸入用戶名和密碼桑谍,并且用戶可以勾選“下次自動登錄”。如果選中后焰宣,下次登陸時霉囚,用戶無須輸入賬戶密碼即可登錄捕仔。這是因為前一次登錄時匕积,服務器發(fā)送了包含登錄憑據(用戶名+密碼的某種加密形式)的Cookie到硬盤上。第二次登錄時榜跌,如果該Cookie還未到期闪唆,則瀏覽器會發(fā)送該Cookie給服務器驗證,于是就可以登陸了钓葫。
其具體形式是一小段的文本信息(通過鍵值對表示)悄蕾,主要內容包括:名字、值、過期時間帆调、路徑和域奠骄。需要注意的是Cookie存的文件不能大于4K,很多時候一個站點被限制最多保存20個Cookie番刊。
2. Session
首先介紹一下OSI 7層模型含鳞,如下圖所示:
在不包含會話層(如UDP)或者無法長時間駐留會話層(如Http)的傳輸協(xié)議中,會話的維持需要依靠在傳輸數據中的高級別程序芹务,例如蝉绷,在Http傳輸中,Cookie就會用于包含一些相關信息枣抱,如Session ID熔吗,參數和權限等。
Session機制是一種服務器端的機制佳晶,服務器使用一種類似于散列表的結構來保存信息桅狠。當程序需要為某個客戶端的請求創(chuàng)建一個Session時,服務器首先檢查這個客戶端的請求里是否已包含了一個Session標志(即Session ID)宵晚,如果已包含則說明以前已經為該客戶創(chuàng)建過Session垂攘,服務器就按照Session ID檢索出來使用,若檢索不到則新建一個淤刃。如果客戶端請求不包含Session ID晒他,則為此客戶端創(chuàng)建一個Session并且生成一個與此Session相關聯(lián)的Session ID,這個ID的值應該是一個不會重復又不容易被找到規(guī)律的字符串逸贾,這個Session ID將在本次響應中返回給客戶端保存陨仅。通常來說,保存Session ID的方式可以采用Cookie(也可以使用標準的Query String等方法铝侵,只要可以傳輸即可)灼伤,這樣在交互過程中就可以自動把這個標識發(fā)給服務器了。
一般這個Cookie的名字采用類似于SESSIONID咪鲜,但是Cookie可以被禁止狐赡,因此需要有機制在Cookie被禁的情況也要吧Session ID傳給服務器。經常使用的一種技術叫做URL重寫疟丙,就是把Session ID直接附在URL路徑的后面颖侄。還有一種技術叫表單隱藏字段也可以解決該問題。
兩者聯(lián)系
- 保存方式:Cookie保存在客戶端(或瀏覽器)享郊;Session保存在服務器览祖。
- 安全性:Session比Cookie安全。
- 性能:Cookie消耗本地磁盤空間炊琉;Session消耗服務器資源展蒂。
- 聯(lián)系:Session大部分時候是基于Cookie使用的。