Cookie 筆記

HTTP Cookie般贼,通常直接叫做cookie,最初是在客戶端用于存儲會話信息的遥诉。該標準要求服務器對任意HTTP請求發(fā)送Set-Cookie HTTP頭作為響應的一部分碍遍,其中包含會話信息。例如改基,這種服務器響應頭可能如下:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Other-header: other-header-value

這個HTTP響應設置以name為名稱繁疤,以value為值的一個cookie,名稱和值在傳送時都必須是URL編碼的秕狰。瀏覽器會存儲這樣的會話信息稠腊,并在這之后,通過為每個請求添加Cookie HTTP頭將信息發(fā)送回服務器鸣哀。如下所示:

GET /index.html HTTP/1.1
Cookie: name=value
Other-header: other-header-value

發(fā)送回服務器的額外信息可以用于唯一驗證客戶來自于發(fā)送的哪個請求架忌。

限制

cookie在性質(zhì)上是綁定在特定的域名下的。當設定了一個cookie后我衬,再給創(chuàng)建它的域名發(fā)送請求時鳖昌,都會包含這個cookie。這個限制確保了儲存在cookie中的信息只能讓批準的接受者訪問低飒,而無法被其他域訪問。

由于cookie是存在客戶端計算機上的懂盐,還加入了一些限制確保cookie不會被惡意使用褥赊,同時蛇占有太多磁盤空間。每個域的cookie總數(shù)是有限的莉恼,不過瀏覽器之間各有不同拌喉。

當超過單個域名限制之后還要設置cookie,瀏覽器就會清楚以前設置的cookie俐银,IEOpera會刪除最近最少使用過的(LRU尿背,Least Recently UsedcookieFirefox看上去好像是隨機決定要清楚哪個cookie捶惜,所以考慮cookie限制非常重要田藐,以免出現(xiàn)不可預期的后果。

瀏覽器中對于cookie的尺寸也有限制。大多數(shù)瀏覽器都有大約4096B(加減1)的長度限制汽久。為了最佳的瀏覽器兼容性鹤竭,最好將整個cookie長度限制在4095B以內(nèi)。尺寸限制影響到一個域下所有的cookie景醇,而并非每個cookie單獨限制臀稚。
如果嘗試創(chuàng)建超過最大尺寸限制cookie,那么該cookie會被悄無聲息的丟掉三痰。注意吧寺,雖然一個字符通常占用一字節(jié),但是多字節(jié)情況則有不同散劫。

cookie的構成

cookie由瀏覽器保存的以下幾塊信息構成稚机。

  • 名稱:一個唯一確定cookie的名稱。cookie名稱是不區(qū)分大小寫的舷丹,所以myCookieMyCookie被認為是同一個cookie抒钱。然而,實踐中最好將cookie名稱看作是區(qū)分大小寫的颜凯,因為某些服務器會這樣處理cookie谋币,cookie的名稱必須是經(jīng)過URL編碼的。
  • 值:儲存在cookie里的字符串值症概。值必須被URL編碼蕾额。
  • 域:cookie對哪個域是有效的。所有向該域發(fā)送的請求中都會包含這個cookie信息彼城。這個值可以包含子域诅蝶,也可以不包含它。如果沒有明確設定募壕,那么這個域會被人做來自設置cookie的那個域调炬。
  • 路徑:對于指定域中的那個路徑,應該向服務器發(fā)送cookie舱馅。例如缰泡,你可以指定cookie只有從http://www.wrox.com/books/中才能訪問,那么http://www.wrox.com的頁面就不會發(fā)送cookie信息代嗤,即使請求都是來自同一個域的棘钞。
  • 失效時間:表示cookie何時應該被刪除的時間戳(也就是,何時應該停止向服務器發(fā)送這個cookie)干毅。默認情況下宜猜,瀏覽器會話結束時即將所有cookie刪除;不過也可以自己設置刪除時間硝逢。這個值是GMT格式的日期姨拥,用于指定應該刪除cookie的精確時間绅喉。因此,cookie可以在瀏覽器關閉后依然保存在用戶的機器上垫毙。如果你設置的失效日期是個以前的時間霹疫,那么cookie則會被立刻刪除。
  • 安全標志: 指定后综芥,cookie只有在使用SSL連接的時候才發(fā)送到服務器丽蝎。

每一段信息都作為Set-Cookie頭的一部分,使用分號加空格分隔每一段膀藐,如下例所示屠阻。

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com
Other-header: other-header-value

該頭信息指定了一個叫做namecookie,它會在格林威治時間2007年1月22日7:10:24失效额各,同時對于www.wrox.comwrox.com的任何子域都有效国觉。
secure標志是cookie中唯一一個非名值對兒的部分,直接包含一個secure單詞虾啦。如下:

HTTP/1.1 200 OK
Content-type: text/html
Set-cookie: name=value; domain=.wrox.com; path=/; secure

這里麻诀,創(chuàng)建了一個對于所有wrox.com的子域和域名下(由path參數(shù)指定的)所有頁面都有效的cookie,因為設置了secure標志傲醉,這個cookie只能通過SSL連接才能傳輸蝇闭。
尤其要注意,域硬毕、路徑呻引、失效時間和secure標志都是服務器給瀏覽器的指示,以指定合適應該發(fā)送cookie吐咳,這些參數(shù)并不會作為發(fā)送到服務器的cookie信息的一部分逻悠,只有名值對兒才會被發(fā)送。

JS中的cookie

在JS中處理cookie有些復雜韭脊,因為其眾所周知的蹩腳接口童谒,即BOMdocument.cookie屬性。這個屬性的獨特之處在于它會因為使用它的方式不同表現(xiàn)出不同的行為沪羔。當用來獲取屬性值時饥伊,document.cookie返回當前頁面可用的(根據(jù)cookie的域、路徑任内、失效時間和安全設置)所有cookie字符串,一系列由分號隔開的名值對兒融柬,如下所示死嗦。

name1 = value1; name2 = value2; name3 = value3;

所有名字和值都是經(jīng)過URL編碼的,所以必須使用decodeURIComponent()來解碼粒氧。
當用于設置值得時候越除,document.cookie屬性可以設置為一個新的cookie字符串。這個cookie字符串會被解釋并添加到現(xiàn)有的cookie集合中。設置document.cookie并不會覆蓋cookie摘盆,除非設置的cookie的名稱已經(jīng)存在翼雀。設置cookie的格式如下,和Set-Cookie頭中使用的格式一樣孩擂。

name = value; expires = expiration_time; path = domain_path; domain = domain_name; secure

這些參數(shù)中狼渊,只有cookie的名字和值是必需的,下面是一個簡單的例子类垦。

document.cookie = 'name = Ann';

這段代碼創(chuàng)建了一個叫namecookie狈邑,值為Ann。當客戶端每次向服務器端發(fā)送請求的時候蚤认,都會發(fā)送這個cookie米苹,當瀏覽器關閉的時候,它就會被刪除砰琢。雖然這段代碼沒問題蘸嘶,但因為這里恰好名稱和值都無需編碼,所以最好每次設置cookie時都使用encodeURIComponent()陪汽。

document.cookie = encodeURIComponent('name') + '=' + encodeURIComponent('Ann');

要給被創(chuàng)建的cookie指定額外的信息训唱,只要將參數(shù)追加到該字符串,和Set-Cookie頭中的格式一樣掩缓,如下所示雪情。

document.cookie = encodeURIComponent('name') + '=' + encodeURIComponent('Ann') + '; domain=.wrox.com; path=/';

HTTP專有cookie

還有一類cookie被稱為“HTTP專有cookie”。HTTP專有cookie可以從瀏覽器或者服務器設置你辣,但是只能從服務器端讀取巡通,因為JS無法獲取HTTP專有cookie的值。
由于所有的cookie都會由瀏覽器作為請求頭發(fā)送舍哄,所以在cookie中存儲大量信息會影響到特定域的請求性能宴凉。cookie信息越大,完成對服務器請求的時間也就越長表悬。盡管瀏覽器對cookie進行了大小限制弥锄。不過最好還是盡可能在cookie中少存儲信息,以避免影響性能蟆沫。

Tips

一定不要在cookie中存儲重要和敏感的數(shù)據(jù)籽暇。cookie數(shù)據(jù)并非存儲在一個安全環(huán)境中,其中包含的任何數(shù)據(jù)都可以被他人訪問饭庞。所以不要在cookie總存儲如信用卡號或者個人地址之類的數(shù)據(jù)戒悠。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舟山,隨后出現(xiàn)的幾起案子绸狐,更是在濱河造成了極大的恐慌卤恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒矿,死亡現(xiàn)場離奇詭異突琳,居然都是意外死亡,警方通過查閱死者的電腦和手機符相,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門拆融,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人主巍,你說我怎么就攤上這事冠息。” “怎么了孕索?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵逛艰,是天一觀的道長。 經(jīng)常有香客問我搞旭,道長散怖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任肄渗,我火速辦了婚禮镇眷,結果婚禮上,老公的妹妹穿的比我還像新娘翎嫡。我一直安慰自己欠动,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布惑申。 她就那樣靜靜地躺著具伍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圈驼。 梳的紋絲不亂的頭發(fā)上人芽,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音绩脆,去河邊找鬼萤厅。 笑死,一個胖子當著我的面吹牛靴迫,可吹牛的內(nèi)容都是我干的惕味。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼玉锌,長吁一口氣:“原來是場噩夢啊……” “哼名挥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芬沉,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤躺同,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丸逸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋艺,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年黄刚,在試婚紗的時候發(fā)現(xiàn)自己被綠了捎谨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡憔维,死狀恐怖涛救,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情业扒,我是刑警寧澤检吆,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站程储,受9級特大地震影響蹭沛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章鲤,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一摊灭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败徊,春花似錦帚呼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至根欧,卻和暖如春怜珍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凤粗。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工酥泛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫌拣。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓柔袁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親异逐。 傳聞我的和親對象是個殘疾皇子捶索,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • HTTP cookie(也稱為web cookie,網(wǎng)絡cookie,瀏覽器cookie或者簡稱cookie)是網(wǎng)...
    留七七閱讀 17,868評論 2 71
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,224評論 0 51
  • 背景在HTTP協(xié)議的定義中,采用了一種機制來記錄客戶端和服務器端交互的信息灰瞻,這種機制被稱為cookie腥例,cooki...
    時芥藍閱讀 2,357評論 1 17
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理辅甥,服務發(fā)現(xiàn),斷路器燎竖,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • 你不覺得這紫霞很美嗎构回? 紫霞—— 五百年很漫長么夏块?你以為你頭戴金箍,手持金箍棒纤掸,一路西行求取真經(jīng)脐供,就真的忘的了紫霞...
    愛R的N閱讀 245評論 0 1