Cookie vs Session

定義

  • Cookie:指網(wǎng)站為了辨別用戶身份而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)。
  • Session:也稱會(huì)話,是一種持久網(wǎng)絡(luò)協(xié)議,在用戶(或用戶代理)端和服務(wù)器端之間創(chuàng)建關(guān)聯(lián),從而起到交換數(shù)據(jù)包的作用機(jī)制。

提出的背景

提出Cookie和Session主要是針對(duì)Http的無狀態(tài)的設(shè)計(jì),Server和Client不會(huì)一直保持連線狀態(tài),也不會(huì)有雙方狀態(tài)的及時(shí)更新。因此,Server無法知道Client的狀態(tài),如登錄信息、購物車等等。

Cookie就是采用客戶端的狀態(tài)保持方案,而Session則采用服務(wù)器端的狀態(tài)保持方案。

工作原理

1. Cookie

在典型的購物場(chǎng)景中,用戶瀏覽了幾個(gè)頁面,買了一盒餅干和兩瓶飲料。最后結(jié)賬時(shí)由于Http是無狀態(tài)的,不通過額外的手段,服務(wù)器并不知道用戶到底買了什么,所以Cookie就是用來解決Http無狀態(tài)的額外方法。服務(wù)器可以設(shè)置或讀取Cookies中的信息,借此維護(hù)用戶跟服務(wù)器會(huì)話中的狀態(tài)。

當(dāng)用戶購買了第一項(xiàng)商品后,服務(wù)器向用戶發(fā)送網(wǎng)頁的同時(shí)還發(fā)送了一段Cookie(Set-Cookie),記錄了那項(xiàng)商品的信息。當(dāng)用戶訪問另外一個(gè)頁面時(shí),瀏覽器會(huì)把Cookie發(fā)送給服務(wù)器,用于服務(wù)器知道用戶之前選購了什么。如果用戶繼續(xù)選購,服務(wù)器就在原來那段Cookie中添加新的商品信息。結(jié)賬時(shí),服務(wù)器就讀取發(fā)送來的Cookie(Get-Cookie)。

Cookie另一個(gè)典型的應(yīng)用場(chǎng)景就是登陸一個(gè)網(wǎng)站時(shí),網(wǎng)站往往會(huì)請(qǐng)求用戶輸入用戶名和密碼,并且用戶可以勾選“下次自動(dòng)登錄”。如果選中后,下次登陸時(shí),用戶無須輸入賬戶密碼即可登錄。這是因?yàn)榍耙淮蔚卿洉r(shí),服務(wù)器發(fā)送了包含登錄憑據(jù)(用戶名+密碼的某種加密形式)的Cookie到硬盤上。第二次登錄時(shí),如果該Cookie還未到期,則瀏覽器會(huì)發(fā)送該Cookie給服務(wù)器驗(yàn)證,于是就可以登陸了。


Cookie原理示意圖

其具體形式是一小段的文本信息(通過鍵值對(duì)表示),主要內(nèi)容包括:名字、值、過期時(shí)間、路徑和域。需要注意的是Cookie存的文件不能大于4K,很多時(shí)候一個(gè)站點(diǎn)被限制最多保存20個(gè)Cookie。

2. Session

首先介紹一下OSI 7層模型,如下圖所示:


OSI模型

在不包含會(huì)話層(如UDP)或者無法長(zhǎng)時(shí)間駐留會(huì)話層(如Http)的傳輸協(xié)議中,會(huì)話的維持需要依靠在傳輸數(shù)據(jù)中的高級(jí)別程序,例如,在Http傳輸中,Cookie就會(huì)用于包含一些相關(guān)信息,如Session ID,參數(shù)和權(quán)限等。

Session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)來保存信息。當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)Session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)Session標(biāo)志(即Session ID),如果已包含則說明以前已經(jīng)為該客戶創(chuàng)建過Session,服務(wù)器就按照Session ID檢索出來使用,若檢索不到則新建一個(gè)。如果客戶端請(qǐng)求不包含Session ID,則為此客戶端創(chuàng)建一個(gè)Session并且生成一個(gè)與此Session相關(guān)聯(lián)的Session ID,這個(gè)ID的值應(yīng)該是一個(gè)不會(huì)重復(fù)又不容易被找到規(guī)律的字符串,這個(gè)Session ID將在本次響應(yīng)中返回給客戶端保存。通常來說,保存Session ID的方式可以采用Cookie(也可以使用標(biāo)準(zhǔn)的Query String等方法,只要可以傳輸即可),這樣在交互過程中就可以自動(dòng)把這個(gè)標(biāo)識(shí)發(fā)給服務(wù)器了。

一般這個(gè)Cookie的名字采用類似于SESSIONID,但是Cookie可以被禁止,因此需要有機(jī)制在Cookie被禁的情況也要吧Session ID傳給服務(wù)器。經(jīng)常使用的一種技術(shù)叫做URL重寫,就是把Session ID直接附在URL路徑的后面。還有一種技術(shù)叫表單隱藏字段也可以解決該問題。

兩者聯(lián)系

  • 保存方式:Cookie保存在客戶端(或?yàn)g覽器);Session保存在服務(wù)器。
  • 安全性:Session比Cookie安全。
  • 性能:Cookie消耗本地磁盤空間;Session消耗服務(wù)器資源。
  • 聯(lián)系:Session大部分時(shí)候是基于Cookie使用的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容