HTTP cookies 詳解

HTTP cookies,通常又稱作"cookies",已經(jīng)存在了很長(zhǎng)時(shí)間,但是仍舊沒(méi)有被予以充分的理解。首要的問(wèn)題是存在了諸多誤區(qū),認(rèn)為cookies是后門(mén)程序或病毒,或壓根不知道它是如何工作的。第二個(gè)問(wèn)題是對(duì)于cookies缺少一個(gè)一致性的接口。盡管存在著這些問(wèn)題,cookies仍舊在web開(kāi)發(fā)中起著如此重要的作用,以至于如果cookie在沒(méi)有可替代品出現(xiàn)的情況下消失,我們?cè)S多喜歡的Web應(yīng)用將變得毫無(wú)用處。

cookies的起源

早期Web開(kāi)發(fā)面臨的最大問(wèn)題之一是如何管理狀態(tài)。簡(jiǎn)言之,服務(wù)器端沒(méi)有辦法知道兩個(gè)請(qǐng)求是否來(lái)自于同一個(gè)瀏覽器。那時(shí)的辦法是在請(qǐng)求的頁(yè)面中插入一個(gè)token,并且在下一次請(qǐng)求中將這個(gè)token返回(至服務(wù)器)。這就需要在form中插入一個(gè)包含token的隱藏表單域,或著在URL的qurey字符串中傳遞該token。這兩種辦法都強(qiáng)調(diào)手工操作并且極易出錯(cuò)。

LouMontulli,那時(shí)是網(wǎng)景通訊的一個(gè)雇員,被認(rèn)為在1994年將“magic cookies”的概念應(yīng)用到了web通訊中。他意圖解決的是web中的購(gòu)物車(chē),現(xiàn)在所有購(gòu)物網(wǎng)站都依賴購(gòu)物車(chē)。他的最早的說(shuō)明文檔提供了一些cookies工作原理的基本信息該文檔在RFC2109中被規(guī)范化(這是所有瀏覽器實(shí)現(xiàn)cookies的參考依據(jù)),并且最終逐步形成了REF2965.Montulli最終也被授予了關(guān)于cookies的美國(guó)專(zhuān)利。網(wǎng)景瀏覽器在它的第一個(gè)版本中就開(kāi)始支持cookies,并且當(dāng)前所有web瀏覽器都支持cookies。

cookie是什么?

坦白的說(shuō),一個(gè)cookie就是存儲(chǔ)在用戶主機(jī)瀏覽器中的一小段文本文件。Cookies是純文本形式,它們不包含任何可執(zhí)行代碼。一個(gè)Web頁(yè)面或服務(wù)器告之瀏覽器來(lái)將這些信息存儲(chǔ)并且基于一系列規(guī)則在之后的每個(gè)請(qǐng)求中都將該信息返回至服務(wù)器。Web服務(wù)器之后可以利用這些信息來(lái)標(biāo)識(shí)用戶。多數(shù)需要登錄的站點(diǎn)通常會(huì)在你的認(rèn)證信息通過(guò)后來(lái)設(shè)置一個(gè)cookie,之后只要這個(gè)cookie存在并且合法,你就可以自由的瀏覽這個(gè)站點(diǎn)的所有部分。再次,cookie只是包含了數(shù)據(jù),就其本身而言并不有害。

Cookie總是保存在客戶端中,按在客戶端中的存儲(chǔ)位置,可分為內(nèi)存Cookie和硬盤(pán)Cookie。內(nèi)存Cookie由瀏覽器維護(hù),保存在內(nèi)存中,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的。硬盤(pán)Cookie保存在硬盤(pán)里,有一個(gè)過(guò)期時(shí)間,除非...

Cookie總是保存在客戶端中,按在客戶端中的存儲(chǔ)位置,可分為內(nèi)存Cookie和硬盤(pán)Cookie。內(nèi)存Cookie由瀏覽器維護(hù),保存在內(nèi)存中,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的。硬盤(pán)Cookie保存在硬盤(pán)里,有一個(gè)過(guò)期時(shí)間,除非用戶手工清理或到了過(guò)期時(shí)間,硬盤(pán)Cookie不會(huì)被刪除,其存在時(shí)間是長(zhǎng)期的。所以,按存在時(shí)間,可分為非持久Cookie和持久Cookie。

1.cookie的屬性

一般cookie所具有的屬性,包括:

Domain:域,表示當(dāng)前cookie所屬于哪個(gè)域或子域下面。

此處需要額外注意的是,在C#中,如果一個(gè)cookie不設(shè)置對(duì)應(yīng)的Domain,那么在CookieContainer.Add(cookies)的時(shí)候,會(huì)死掉。對(duì)于服務(wù)器返回的Set-Cookie中,如果沒(méi)有指定Domain的值,那么其Domain的值是默認(rèn)為當(dāng)前所提交的http的請(qǐng)求所對(duì)應(yīng)的主域名的。比如訪問(wèn) http://www.example.com,返回一個(gè)cookie,沒(méi)有指名domain值,那么其為值為默認(rèn)的www.example.com。

Path:表示cookie的所屬路徑。

Expire time/Max-age:表示了cookie的有效期。expire的值,是一個(gè)時(shí)間,過(guò)了這個(gè)時(shí)間,該cookie就失效了?;蛘呤怯胢ax-age指定當(dāng)前cookie是在多長(zhǎng)時(shí)間之后而失效。如果服務(wù)器返回的一個(gè)cookie,沒(méi)有指定其expire time,那么表明此cookie有效期只是當(dāng)前的session,即是session cookie,當(dāng)前session會(huì)話結(jié)束后,就過(guò)期了。對(duì)應(yīng)的,當(dāng)關(guān)閉(瀏覽器中)該頁(yè)面的時(shí)候,此cookie就應(yīng)該被瀏覽器所刪除了。

secure:表示該cookie只能用https傳輸。一般用于包含認(rèn)證信息的cookie,要求傳輸此cookie的時(shí)候,必須用https傳輸。

httponly:表示此cookie必須用于http或https傳輸。這意味著,瀏覽器腳本,比如javascript中,是不允許訪問(wèn)操作此cookie的。

2.服務(wù)器發(fā)送cookie給客戶端

從服務(wù)器端,發(fā)送cookie給客戶端,是對(duì)應(yīng)的Set-Cookie。包括了對(duì)應(yīng)的cookie的名稱,值,以及各個(gè)屬性。

例如:

Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly

Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.com

Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly

3.從客戶端把cookie發(fā)送到服務(wù)器

從客戶端發(fā)送cookie給服務(wù)器的時(shí)候,是不發(fā)送cookie的各個(gè)屬性的,而只是發(fā)送對(duì)應(yīng)的名稱和值。

例如:

GET /spec.html HTTP/1.1

Host: www.example.org

Cookie: name=value; name2=value2

Accept: */*

4.關(guān)于修改,設(shè)置cookie

除了服務(wù)器發(fā)送給客戶端(瀏覽器)的時(shí)候,通過(guò)Set-Cookie,創(chuàng)建或更新對(duì)應(yīng)的cookie之外,還可以通過(guò)瀏覽器內(nèi)置的一些腳本,比如javascript,去設(shè)置對(duì)應(yīng)的cookie,對(duì)應(yīng)實(shí)現(xiàn)是操作js中的document.cookie。

5.Cookie的缺陷

(1)cookie會(huì)被附加在每個(gè)HTTP請(qǐng)求中,所以無(wú)形中增加了流量。

(2)由于在HTTP請(qǐng)求中的cookie是明文傳遞的,所以安全性成問(wèn)題。(除非用HTTPS)

(3)Cookie的大小限制在4KB左右。對(duì)于復(fù)雜的存儲(chǔ)需求來(lái)說(shuō)是不夠用的。


轉(zhuǎn)載 -- http://www.169it.com/article/3217120921.html

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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