cookie and session

背景
在HTTP協(xié)議的定義中坯临,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie姑宽,cookie規(guī)范定義了服務(wù)器和客戶端交互信息的格式、生存期闺阱、使用范圍炮车、安全性。在JavaScript中可以通過 document.cookie 來讀取或設(shè)置這些信息酣溃。由于 cookie 多用在客戶端和服務(wù)端之間進(jìn)行通信瘦穆,所以除了JavaScript以外,服務(wù)端的語言(如PHP)也可以存取 cookie赊豌。
Cookie詳解
Cookie在遠(yuǎn)程瀏覽器端存儲(chǔ)數(shù)據(jù)并以此跟蹤和識(shí)別用戶的機(jī)制扛或。從實(shí)現(xiàn)上說,Cookie是存儲(chǔ)在客戶端上的一小段數(shù)據(jù)碘饼,瀏覽器(即客戶端)通過HTTP協(xié)議和服務(wù)器端進(jìn)行Cookie交互熙兔。
Cooke獨(dú)立于語言存在,嚴(yán)格地說艾恼,Cookie并不是由PHP住涉、Java等語言實(shí)現(xiàn)的,而是由這些語言對(duì)Cookie進(jìn)行間接操作钠绍,即發(fā)送HTTP指令舆声,瀏覽器收到指令便操作Cookie并返回給服務(wù)器。因此,Cookie是由瀏覽器實(shí)現(xiàn)和管理的媳握。舉例說碱屁,PHP并沒有真正設(shè)置過Cookie,只是發(fā)出指令讓瀏覽器來做這件事蛾找。PHP中可以使用setcookie() 或 setrawcookie() 函數(shù)設(shè)置Cookie娩脾。setcookie()最后一個(gè)參數(shù)HttpOnly設(shè)置了后,JavaScript就無法讀取到這個(gè)Cookie打毛。
設(shè)置Cookie時(shí)需注意:①函數(shù)有返回值晦雨,false失敗,true成功隘冲,成功僅供參考,不代表客戶端一定能接收到绑雄;②PHP設(shè)置的Cookie不能立即生效展辞,要等下一個(gè)頁面才能看到(Cookie從服務(wù)器傳給瀏覽器,下個(gè)頁面瀏覽器才能把設(shè)置的Cookie傳回給服務(wù)器)万牺;如果是JavaScript設(shè)置的罗珍,是立即生效的;③Cookie沒有顯示的刪除函數(shù)脚粟,可以設(shè)置expire過期時(shí)間覆旱,自動(dòng)觸發(fā)瀏覽器的刪除機(jī)制。
Cookie是HTTP頭的一部分核无,即現(xiàn)發(fā)送或請(qǐng)求Cookie扣唱,才是data域;setcookie()等函數(shù)必須在數(shù)據(jù)之前調(diào)用团南,這和header() 函數(shù)是相同的噪沙。不過也可以使用輸出緩沖函數(shù)延遲腳本的輸出,知道設(shè)置好所有Cookie和其他HTTP標(biāo)頭吐根。
Cookie通常用來存儲(chǔ)一些不是很敏感的信息正歼,或者進(jìn)行登錄控制,也可用來記住用戶名拷橘、記住免密碼登錄局义、防止刷票等。每個(gè)域名下允許的Cookie是有限制的冗疮,根據(jù)瀏覽器這個(gè)限制也不同萄唇。Cookie不是越多越好,它會(huì)增加寬帶赌厅,增加流量消耗穷绵,所以不要濫用Cookie;不要把Cookie當(dāng)作客戶端的存儲(chǔ)器來用特愿。一個(gè)域名的每個(gè)Cookie限制以4千字節(jié)(KB)鍵值對(duì)的形式存儲(chǔ)仲墨。
還有一種Cookie是Flash創(chuàng)建的勾缭,成為Flash Shard Object,又稱Flash Cookie目养,即使清空瀏覽器所有隱私數(shù)據(jù)俩由,這類頑固的Cookie還會(huì)存在硬盤上,因?yàn)樗皇蹻lash管理癌蚁,很多網(wǎng)站采用這種技術(shù)識(shí)別用戶幻梯。
Cookie跨域,主要是為了統(tǒng)一應(yīng)用平臺(tái)努释,實(shí)現(xiàn)單點(diǎn)登錄碘梢;需使用P3P協(xié)議(Platform for Privacy Preferences),通過P3P使用戶自己可以指定瀏覽器的隱私策略伐蒂,達(dá)到存儲(chǔ)第三方Cookie的目的煞躬,只需要在響應(yīng)用戶請(qǐng)求時(shí),在HTTP的頭信息中增加關(guān)于P3P的配置信息就可以了逸邦。Cookie跨域涉及兩個(gè)不同的應(yīng)用恩沛,習(xí)慣上稱為第一方和第三方。第三方通常是來自別人的廣告缕减、或Iframe別的網(wǎng)站的URL雷客,這些第三方網(wǎng)站可能使用的Cookie。
Cookie格式
Cookie中保存的信息都是文本信息桥狡,在客戶端和服務(wù)器端交互過程中搅裙,cookie信息被附加在HTTP消息頭中傳遞,cookie的信息由鍵/值對(duì)組成总放。下面是一個(gè)HTTP頭中cookie的例子:
Set-Cookie: key = value; Path=/

Cookie中存放的信息包含cookie本身屬性和用戶自定義屬性呈宇,一個(gè)cookie只能包含一個(gè)自定義鍵/值對(duì)。Cookie本身屬性有”Comment” 局雄、”Domain”甥啄、”Max-Age”、”Path”炬搭、”Secure”蜈漓、”Version”。
Comment 屬性是cookie的產(chǎn)生著對(duì)該cookie的描述宫盔;
Domain 屬性定義可訪問該cookie的域名融虽,對(duì)一些大的網(wǎng)站,如果希望cookie可以在子網(wǎng)站中共享灼芭,可以使用該屬性有额。例如設(shè)置Domain為 .bigsite.com ,則sub1.bigsite.com和sub2.bigsite.com都可以訪問已保存在客戶端的cookie,這時(shí)還需要將Path設(shè)置為/。
Max-Age 屬性定義cookie的有效時(shí)間巍佑,用秒計(jì)數(shù)茴迁,當(dāng)超過有效期后,cookie的信息不會(huì)從客戶端附加在HTTP消息頭中發(fā)送到服務(wù)端萤衰。
Path 屬性定義網(wǎng)站上可以訪問cookie的頁面的路徑堕义,缺省狀態(tài)下Path為產(chǎn)生cookie時(shí)的路徑,此時(shí)cookie可以被該路徑以及其子路徑下的頁面訪問脆栋;可以將Path設(shè)置為/倦卖,使cookie可以被網(wǎng)站下所有頁面訪問。
Secure 屬性值定義cookie的安全性椿争,當(dāng)該值為true時(shí)必須是HTTPS狀態(tài)下cookie才從客戶端附加在HTTP消息中發(fā)送到服務(wù)端怕膛,在HTTP時(shí)cookie是不發(fā)送的;Secure為false時(shí)則可在HTTP狀態(tài)下傳遞cookie秦踪,Secure缺省為false嘉竟。
Version 屬性定義cookie的版本,由cookie的創(chuàng)建者定義洋侨。
Cookie的創(chuàng)建
Cookie可以在服務(wù)器端創(chuàng)建,然后cookie信息附加在HTTP消息頭中傳到客戶端倦蚪,如果cookie定義了有效期希坚,則本保存在客戶端本地磁盤。保存cookie的文件是一個(gè)文本文件陵且,因此不用擔(dān)心此文件中的內(nèi)容會(huì)被執(zhí)行而破壞客戶的機(jī)器裁僧。支持Web端開發(fā)的語言都有創(chuàng)建cookie的方法或函數(shù),以及設(shè)置cookie屬性和添加自定義屬性的方法或函數(shù)慕购,最后是將cookie附加到返回客戶端的HTTP消息頭中聊疲。
創(chuàng)建cookie時(shí)如果不指定生存有效時(shí)間,則cookie只在瀏覽器關(guān)閉前有效沪悲,cookie會(huì)在服務(wù)器端和客戶端傳輸获洲,但是不會(huì)保存在客戶機(jī)的磁盤上,打開新的瀏覽器將不能獲得原先創(chuàng)建的cookie信息殿如。
Cookie信息保存在本地時(shí)會(huì)保存到當(dāng)前登錄用戶專門目錄下贡珊,保存的cookie文件名中會(huì)包含創(chuàng)建cookie所在頁面網(wǎng)站的域名,當(dāng)瀏覽器再次連接該網(wǎng)站時(shí)涉馁,會(huì)從本機(jī)cookie存放目錄下選出該網(wǎng)站的有效cookie门岔,將保存在其中的信息附加在HTTP消息頭中發(fā)送到服務(wù)器端,服務(wù)器端程序就可根據(jù)上次保存在cookie的信息為訪問客戶提供“記憶”或個(gè)性化服務(wù)烤送。
Cookie除了可以在服務(wù)器端創(chuàng)建外寒随,也可以在客戶端的瀏覽器中用客戶端腳本(如javascript)創(chuàng)建。客戶端創(chuàng)建的cookie的性質(zhì)和服務(wù)器端創(chuàng)建的cookie一樣妻往,可以保存在本地互艾,也可以被傳送到服務(wù)器端被服務(wù)器程序讀取。
Cookie 基礎(chǔ)知識(shí)
cookie 是有大小限制的蒲讯,大多數(shù)瀏覽器支持最大為 4096 字節(jié)的 Cookie(具體會(huì)有所差異忘朝,可以使用這個(gè)好用的工具: http://browsercookielimits.squawky.net/ 進(jìn)行測試);如果 cookie 字符串的長度超過最大限制,則該屬性將返回空字符串判帮。

由于 cookie 最終都是以文件形式存放在客戶端計(jì)算機(jī)中局嘁,所以查看和修改 cookie 都是很方便的,這就是為什么常說 cookie 不能存放重要信息的原因晦墙。

每個(gè) cookie 的格式都是這樣的:cookieName = Vaue悦昵;名稱和值都必須是合法的標(biāo)示符。

cookie 是存在 有效期的晌畅。在默認(rèn)情況下但指,一個(gè) cookie 的生命周期就是在瀏覽器關(guān)閉的時(shí)候結(jié)束。如果想要 cookie 能在瀏覽器關(guān)掉之后還可以使用抗楔,就必須要為該 cookie 設(shè)置有效期棋凳,也就是 cookie 的失效日期。

alert(typeof document.cookie)結(jié)果是 string.

cookie 有域和路徑這個(gè)概念连躏。域就是domain的概念剩岳,因?yàn)闉g覽器是個(gè)注意安全的環(huán)境,所以不同的域之間是不能互相訪問 cookie 的(當(dāng)然可以通過特殊設(shè)置的達(dá)到 cookie 跨域訪問)入热。路徑就是routing的概念拍棕,一個(gè)網(wǎng)頁所創(chuàng)建的 cookie 只能被與這個(gè)網(wǎng)頁在同一目錄或子目錄下得所有網(wǎng)頁訪問,而不能被其他目錄下得網(wǎng)頁訪問(這句話有點(diǎn)繞勺良,一會(huì)看個(gè)例子就好理解了)绰播。

其實(shí)創(chuàng)建cookie的方式和定義變量的方式有些相似,都需要使用 cookie 名稱和 cookie 值尚困。同個(gè)網(wǎng)站可以創(chuàng)建多個(gè) cookie 蠢箩,而多個(gè) cookie 可以存放在同一個(gè)cookie 文件中。

cookie 存在兩種類型:①:你瀏覽的當(dāng)前網(wǎng)站本身設(shè)置的 cookie 來自在網(wǎng)頁上嵌入廣告或圖片等其他域來源的 第三方 cookie (網(wǎng)站可通過使用這些 cookie 跟蹤你的使用信息)

cookie 有兩種清除方式:①:通過瀏覽器工具清除 cookie (有第三方的工具事甜,瀏覽器自身也有這種功能) 通過設(shè)置 cookie 的有效期來清除 cookie. 注:刪除 cookie 有時(shí)可能導(dǎo)致某些網(wǎng)頁無法正常運(yùn)行忙芒。

瀏覽器可以通過設(shè)置來接受和拒絕訪問 cookie。出于功能和性能的原因考慮讳侨,建議盡量降低 cookie 的使用數(shù)量呵萨,并且要盡量使用小 cookie硕并。

Cookie的使用
從cookie的定義可以看到明吩,cookie一般用于采用HTTP作為進(jìn)行信息交換協(xié)議的客戶端和服務(wù)器端用于記錄需要持久化的信息。一般是由服務(wù)器端創(chuàng)建要記錄的信息哗魂,然后傳遞到客戶端,由客戶端從HTTP消息中取出信息忱嘹,保存在本機(jī)磁盤上嘱腥。當(dāng)客戶端再次訪問服務(wù)器端時(shí),從本機(jī)磁盤上讀出原來保存的信息拘悦,附加到HTTP消息中發(fā)送給服務(wù)器端齿兔,服務(wù)器端從HTTP消息中讀取信息,根據(jù)實(shí)際應(yīng)用的需求進(jìn)行進(jìn)一步的處理础米。
服務(wù)器端cookie的創(chuàng)建和再次讀取功能通常由服務(wù)器端編程語言實(shí)現(xiàn)分苇,客戶端cookie的保存、讀取一般由瀏覽器來提供屁桑,并且對(duì)cookie的安全性方面可以進(jìn)行設(shè)置医寿,如是否可以在本機(jī)保存cookie。
由于cookie信息以明文方式保存在文本文件中蘑斧,對(duì)一些敏感信息如口令靖秩、銀行帳號(hào)如果要保存在本地cookie文件中,最好采用加密形式竖瘾。與cookie類似的另一個(gè)概念是會(huì)話(Session)沟突,會(huì)話一般是記錄客戶端和服務(wù)器端從客戶端瀏覽器連接上服務(wù)器端到關(guān)閉瀏覽器期間的持久信息。會(huì)話一般保存在內(nèi)存中捕传,不保存到磁盤上事扭。會(huì)話可以通過cookie機(jī)制來實(shí)現(xiàn),對(duì)于不支持cookie的客戶端乐横,會(huì)話可以采用URL重寫方式來實(shí)現(xiàn)〗褚埃可以將會(huì)話理解為內(nèi)存中的cookie葡公。
使用會(huì)話會(huì)對(duì)系統(tǒng)伸縮性造成負(fù)面影響,當(dāng)服務(wù)器端要在很多臺(tái)服務(wù)器上同步復(fù)制會(huì)話對(duì)象時(shí)条霜,系統(tǒng)性能會(huì)受到較大傷害催什,尤其會(huì)話對(duì)象較大時(shí)。這種情況下可以采用cookie宰睡,將需要記錄的信息保存在客戶端蒲凶,每次請(qǐng)求時(shí)發(fā)送到服務(wù)器端,服務(wù)器端不保留狀態(tài)信息拆内,避免在服務(wù)器端多臺(tái)機(jī)器上復(fù)制會(huì)話而造成的性能下降旋圆。
Cookie 基本操作
對(duì)于 Cookie 得常用操作有,存取麸恍,讀取灵巧,以及設(shè)置有效期搀矫;具體可以參照 JavaScript 操作 Cookie 一文;但刻肄,近期在前端編碼方面瓤球,皆以Vue為沖鋒利器,所以就有用到一款插件 vue-cookie,其代碼僅30行敏弃,堪稱精妙卦羡,讀取操作如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14

set: function (name, value, days) {
var d = new Date;
d.setTime(d.getTime() + 2460601000days);
window.document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString();
},

get: function (name) {
var v = window.document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
},

delete: function (name) {
this.set(name, '', -1);
}

cookie 域概念
路徑能解決在同一個(gè)域下訪問 cookie 的問題,咱們接著說 cookie 實(shí)現(xiàn)同域之間訪問的問題麦到。語法如下:
document.cookie = “name=value;path=path;domain=domain“

紅色的domain就是設(shè)置的 cookie 域的值绿饵。例如 “www.qq.com” 與 “sports.qq.com” 公用一個(gè)關(guān)聯(lián)的域名”qq.com”,我們?nèi)绻胱尅?a target="_blank" rel="nofollow">sports.qq.com” 下的cookie被 “www.qq.com” 訪問隅要,我們就需要用到cookie 的domain屬性蝴罪,并且需要把path屬性設(shè)置為 “/“。例:
document.cookie = “username=Darren;path=/;domain=qq.com“

注:一定的是同域之間的訪問步清,不能把domain的值設(shè)置成非主域的域名要门。
cookie 安全性
通常 cookie 信息都是使用HTTP連接傳遞數(shù)據(jù),這種傳遞方式很容易被查看廓啊,在控制臺(tái)下運(yùn)行document.cookie
,一目了然欢搜;所以 cookie 存儲(chǔ)的信息容易被竊取。假如 cookie 中所傳遞的內(nèi)容比較重要谴轮,那么就要求使用加密的數(shù)據(jù)傳輸炒瘟。所以 cookie 的這個(gè)屬性的名稱是“secure”,默認(rèn)的值為空第步。如果一個(gè) cookie 的屬性為secure疮装,那么它與服務(wù)器之間就通過HTTPS或者其它安全協(xié)議傳遞數(shù)據(jù)。語法如下:
document.cookie = “username=Darren;secure”

把cookie設(shè)置為secure粘都,只保證 cookie 與服務(wù)器之間的數(shù)據(jù)傳輸過程加密廓推,而保存在本地的 cookie文件并不加密。如果想讓本地cookie也加密翩隧,得自己加密數(shù)據(jù)樊展。
注: 就算設(shè)置了secure 屬性也并不代表他人不能看到你機(jī)器本地保存的 cookie 信息,所以說到底堆生,別把重要信息放cookie就對(duì)了专缠。
Session詳解
Session即回話,指一種持續(xù)性的淑仆、雙向的連接涝婉。Session與Cookie在本質(zhì)上沒有區(qū)別,都是針對(duì)HTTP協(xié)議的局限性而提出的一種保持客戶端和服務(wù)器間保持會(huì)話連接狀態(tài)的機(jī)制蔗怠。Session也是一個(gè)通用的標(biāo)準(zhǔn)嘁圈,但在不同的語言中實(shí)現(xiàn)有所不同省骂。針對(duì)Web網(wǎng)站來說,Session指用戶在瀏覽某個(gè)網(wǎng)站時(shí)最住,從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉這段時(shí)間內(nèi)的會(huì)話钞澳。由此可知,Session實(shí)際上是一個(gè)特定的時(shí)間概念涨缚。
使用Session可以在網(wǎng)站的上下文不同頁面間傳遞變量轧粟、用戶身份認(rèn)證、程序狀態(tài)記錄等脓魏。常見的形式就是配合Cookie使用兰吟,實(shí)現(xiàn)保存用戶登錄狀態(tài)功能。和Cookie一樣茂翔,session_start() 必須在程序最開始執(zhí)行混蔼,前面不能有任何輸出內(nèi)容,否則會(huì)出現(xiàn)警告珊燎。PHP的Session默認(rèn)通過文件的方式實(shí)現(xiàn)惭嚣,即存儲(chǔ)在服務(wù)器端的Session文件,每個(gè)Session一個(gè)文件悔政。
Session通過一個(gè)稱為PHPSESSID的Cookie和服務(wù)器聯(lián)系晚吞。Session是通過sessionID判斷客戶端用戶的,即Session文件的文件名谋国。sessionID實(shí)際上是在客戶端和服務(wù)端之間通過HTTP Request 和 HTTP Response傳來傳去槽地。sessionID按照一定的算法生成,必須包含在 HTTP Request 里面芦瘾,保證唯一性和隨機(jī)性捌蚊,以確保Session的安全。如果沒有設(shè)置 Session 的生成周期近弟, sessionID存儲(chǔ)在內(nèi)存中缅糟,關(guān)閉瀏覽器后該ID自動(dòng)注銷;重新請(qǐng)求該頁面藐吮,會(huì)重新注冊(cè)一個(gè)sessionID。如果客戶端沒有禁用Cookie逃贝,Cookie在啟動(dòng)Session回話的時(shí)候扮演的是存儲(chǔ)sessionID 和 Session 生存期的角色谣辞。Session過期后,PHP會(huì)對(duì)其進(jìn)行回收沐扳。
假設(shè)客戶端禁用Cookie泥从,可以通過URL或者隱藏表單傳遞sessionID;php.ini中把session.use_trans_sid 設(shè)成1沪摄,那么連接后就會(huì)自己加Session的ID躯嫉。
Session以文件的形式存放在本地硬盤的一個(gè)目錄中纱烘,當(dāng)比較多時(shí),磁盤讀取文件就會(huì)比較慢祈餐,因此把Session分目錄存放擂啥。
對(duì)于訪問量大的站點(diǎn),用默認(rèn)的Session存儲(chǔ)方式并不適合帆阳,較優(yōu)的方法是用Data Base存取Session哺壶。在大流量的網(wǎng)站中,Session入庫存在效率不高蜒谤、占據(jù)數(shù)據(jù)庫connection資源等問題山宾。針對(duì)這種情況,可以使用Memcached鳍徽、Redis等Key-Value數(shù)據(jù)存儲(chǔ)方案實(shí)現(xiàn)高并發(fā)资锰、大流量的Session存儲(chǔ)。
session與cookie的區(qū)別:
1阶祭,session 在服務(wù)器端绷杜,cookie 在客戶端(瀏覽器)2,session 存在在服務(wù)器的一個(gè)文件里(默認(rèn))胖翰,不是內(nèi)存3接剩,session 的運(yùn)行依賴 session id,而 session id 是存在 cookie 中的萨咳,也就是說懊缺,如果 瀏覽器禁用了 cookie ,同時(shí) session 也會(huì)失效(當(dāng)然也可以在 url 中傳遞)4培他,session 可以放在 文件鹃两,數(shù)據(jù)庫,或內(nèi)存中都可以舀凛。5俊扳,用戶驗(yàn)證這種場合一般會(huì)用 session因此,維持一個(gè)會(huì)話的核心就是客戶端的唯一標(biāo)識(shí)猛遍,即 session id
更為詳盡的說法:
由于HTTP協(xié)議是無狀態(tài)的協(xié)議馋记,所以服務(wù)端需要記錄用戶的狀態(tài)時(shí),就需要用某種機(jī)制來識(shí)具體的用戶懊烤,這個(gè)機(jī)制就是Session.典型的場景比如購物車梯醒,當(dāng)你點(diǎn)擊下單按鈕時(shí),由于HTTP協(xié)議無狀態(tài)腌紧,所以并不知道是哪個(gè)用戶操作的茸习,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的Session,用用于標(biāo)識(shí)這個(gè)用戶壁肋,并且跟蹤用戶号胚,這樣才知道購物車?yán)锩嬗袔妆緯崖_@個(gè)Session是保存在服務(wù)端的,有一個(gè)唯一標(biāo)識(shí)猫胁。在服務(wù)端保存Session的方法很多箱亿,內(nèi)存、數(shù)據(jù)庫杜漠、文件都有极景。集群的時(shí)候也要考慮Session的轉(zhuǎn)移,在大型的網(wǎng)站驾茴,一般會(huì)有專門的Session服務(wù)器集群盼樟,用來保存用戶會(huì)話,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的锈至,使用一些緩存服務(wù)比如Memcached之類的來放 Session晨缴。
思考一下服務(wù)端如何識(shí)別特定的客戶?這個(gè)時(shí)候Cookie就登場了峡捡。每次HTTP請(qǐng)求的時(shí)候击碗,客戶端都會(huì)發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn)Session跟蹤的们拙,第一次創(chuàng)建Session的時(shí)候稍途,服務(wù)端會(huì)在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個(gè)Session ID砚婆,以后每次請(qǐng)求把這個(gè)會(huì)話ID發(fā)送到服務(wù)器械拍,我就知道你是誰了。有人問装盯,如果客戶端的瀏覽器禁用了 Cookie 怎么辦坷虑?一般這種情況下,會(huì)使用一種叫做URL重寫的技術(shù)來進(jìn)行會(huì)話跟蹤埂奈,即每次HTTP交互迄损,URL后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識(shí)別用戶账磺。
Cookie其實(shí)還可以用在一些方便用戶的場景下芹敌,設(shè)想你某次登陸過一個(gè)網(wǎng)站,下次登錄的時(shí)候不想再次輸入賬號(hào)了垮抗,怎么辦氏捞?這個(gè)信息可以寫到Cookie里面,訪問網(wǎng)站的時(shí)候借宵,網(wǎng)站頁面的腳本可以讀取這個(gè)信息幌衣,就自動(dòng)幫你把用戶名給填了矾削,能夠方便一下用戶壤玫。這也是Cookie名稱的由來豁护,給用戶的一點(diǎn)甜頭。所以欲间,總結(jié)一下:Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu)楚里,用來跟蹤用戶的狀態(tài),這個(gè)數(shù)據(jù)可以保存在集群猎贴、數(shù)據(jù)庫班缎、文件中;Cookie是客戶端保存用戶信息的一種機(jī)制她渴,用來記錄用戶的一些信息达址,也是實(shí)現(xiàn)Session的一種方式。

Cookie與Session問答
Cookie運(yùn)行在客戶端趁耗,Session運(yùn)行在服務(wù)端沉唠,對(duì)嗎?A:不完全正確苛败。Cookie是運(yùn)行在客戶端满葛,有客戶端進(jìn)行管理;Session雖然是運(yùn)行在服務(wù)器端罢屈,但是sessionID作為一個(gè)Cookie是存儲(chǔ)在客戶端的嘀韧。

瀏覽器禁止Cookie,Cookie就不能用了缠捌,但Session不會(huì)受瀏覽器影響锄贷,對(duì)嗎?A:錯(cuò)鄙币。瀏覽器禁止Cookie肃叶,Cookie確實(shí)不能用了,Session會(huì)受瀏覽器端的影響十嘿。很簡單的實(shí)驗(yàn)因惭,在登錄一個(gè)網(wǎng)站后,清空瀏覽器的Cookie和隱私數(shù)據(jù)绩衷,單機(jī)后臺(tái)的連接蹦魔,就會(huì)因?yàn)閬G失Cookie而退出。當(dāng)然咳燕,有辦法通過URL傳遞Session勿决。

瀏覽器關(guān)閉后,Cookie和Session都消失了招盲,對(duì)嗎低缩?A:錯(cuò)。存儲(chǔ)在內(nèi)存中額Cookie確實(shí)會(huì)隨著瀏覽器的關(guān)閉而消失,但存儲(chǔ)在硬盤上的不會(huì)咆繁。更頑固的是Flash Cookie讳推,不過現(xiàn)在很多系統(tǒng)優(yōu)化軟件和新版瀏覽器都已經(jīng)支持刪除Flash Cookie。百度采用了這樣的技術(shù)記憶用戶:Session在瀏覽器關(guān)閉后也不會(huì)消失玩般,除非正常退出银觅,代碼中使用了顯示的unset刪除Session。否則Session可能被回收坏为,也有可能永遠(yuǎn)殘留在系統(tǒng)中究驴。

Session 比 Cookie 更安全嗎? 不應(yīng)該大量使用Cookie嗎匀伏?A:錯(cuò)誤洒忧。Cookie確實(shí)可能存在一些不安全因素,但和JavaScript一樣够颠,即使突破前端驗(yàn)證跑慕,還有后端保障安全。一切都還要看設(shè)計(jì)摧找,尤其是涉及提權(quán)的時(shí)候核行,特別需要注意。通常情況下蹬耘,Cookie和Session是綁定的芝雪,獲得Cookie就相當(dāng)于獲得了Session,客戶端把劫持的Cookie原封不動(dòng)地傳給服務(wù)器综苔,服務(wù)器收到后惩系,原封不動(dòng)地驗(yàn)證Session,若Session存在如筛,就實(shí)現(xiàn)了Cookie和Session的綁定過程堡牡。因此,不存在Session比Cookie更安全這種說法杨刨。如果說不安全晤柄,也是由于代碼不安全,錯(cuò)誤地把用作身份驗(yàn)證的Cookie作為權(quán)限驗(yàn)證來使用妖胀。

Session是創(chuàng)建在服務(wù)器上的芥颈,應(yīng)該少用Session而多用Cookie,對(duì)嗎赚抡?A:錯(cuò)爬坑。Cookie可以提高用戶體驗(yàn),但會(huì)加大網(wǎng)絡(luò)之間的數(shù)據(jù)傳輸量涂臣,應(yīng)盡量在Cookie中僅保存必要的數(shù)據(jù)盾计。

如果把別人機(jī)器上的Cookie文件復(fù)制到我的電腦上(假設(shè)使用相同的瀏覽器),是不是能夠登錄別人的帳號(hào)呢?如何防范署辉?A:是的灼舍。這屬于Cookie劫持的一種做法。要避免這種情況涨薪,需要在Cookie中針對(duì)IP、UA等加上特殊的校驗(yàn)信息炫乓,然后和服務(wù)器端進(jìn)行比對(duì)刚夺。

在IE瀏覽器下登錄某網(wǎng)站,換成Firefox瀏覽器是否仍然是未登錄狀態(tài)末捣?使用IE登錄了騰訊網(wǎng)站后侠姑,為什么使用Firefox能保持登錄狀態(tài)?A:不同瀏覽器使用不同的Cookie管理機(jī)制箩做,無法實(shí)現(xiàn)公用Cookie莽红。如果使用IE登錄騰訊網(wǎng)站,使用Firefox也能登錄邦邦,這是由于在安裝騰訊QQ軟件時(shí)安吁,你的電腦上同時(shí)安裝了針對(duì)這兩個(gè)瀏覽器的插件,可以識(shí)別本地已登錄QQ號(hào)碼進(jìn)而自動(dòng)登錄燃辖。本質(zhì)上鬼店,不屬于共用Cookie的范疇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黔龟,一起剝皮案震驚了整個(gè)濱河市妇智,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氏身,老刑警劉巖巍棱,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛋欣,居然都是意外死亡航徙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門陷虎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捉偏,“玉大人,你說我怎么就攤上這事泻红∝睬荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵谊路,是天一觀的道長讹躯。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么潮梯? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任骗灶,我火速辦了婚禮,結(jié)果婚禮上秉馏,老公的妹妹穿的比我還像新娘耙旦。我一直安慰自己,他們只是感情好萝究,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布免都。 她就那樣靜靜地躺著,像睡著了一般帆竹。 火紅的嫁衣襯著肌膚如雪绕娘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天栽连,我揣著相機(jī)與錄音险领,去河邊找鬼。 笑死秒紧,一個(gè)胖子當(dāng)著我的面吹牛绢陌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熔恢,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼下面,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绩聘?” 一聲冷哼從身側(cè)響起沥割,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿菩,沒想到半個(gè)月后机杜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衅谷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年椒拗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获黔。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚀苛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玷氏,到底是詐尸還是另有隱情堵未,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布盏触,位于F島的核電站渗蟹,受9級(jí)特大地震影響块饺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雌芽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一授艰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧世落,春花似錦淮腾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忘古,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诅诱,已是汗流浹背髓堪。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娘荡,地道東北人干旁。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像炮沐,于是被迫代替她去往敵國和親争群。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 什么是Cookie and Session 簡單來說Cookie就是在客戶端記錄信息確定用戶身份大年,而Session...
    字母31閱讀 415評(píng)論 0 1
  • 簡單來說换薄,session與cookie是為了滿足HTTP協(xié)議1.1所不能滿足需求,應(yīng)運(yùn)而生翔试。但是這對(duì)好基友卻不是協(xié)...
    guwenmei閱讀 470評(píng)論 0 0
  • 1. cookie 1.1 什么是cookie cookie 是存儲(chǔ)于訪問者的計(jì)算機(jī)中的變量轻要。每當(dāng)同一臺(tái)計(jì)算機(jī)通過...
    cbw100閱讀 4,051評(píng)論 0 13
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,222評(píng)論 0 51
  • 今天有些不平靜了。有些事情讓心頭一緊垦缅,然后做了各種想要紓解的嘗試冲泥。燒了壺水,沏了杯茶壁涎,讀了會(huì)兒書凡恍,開了下窗,吃了...
    大笑傳奇閱讀 503評(píng)論 0 0