成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

cookie

bawn / 1303人閱讀

摘要:背景是一種無(wú)狀態(tài)的協(xié)議,它不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,即無(wú)法根據(jù)之前的狀態(tài)進(jìn)行本次請(qǐng)求的處理。為了保留無(wú)狀態(tài)協(xié)議這個(gè)特征的同時(shí)又要解決類似的矛盾問(wèn)題,于是引入了。主要目的是為防止跨站腳本攻擊對(duì)的信息竊取。

需求場(chǎng)景

一個(gè)Vue單頁(yè)應(yīng)用,A、B、C 三個(gè)頁(yè)面都引用了一個(gè)公用的時(shí)間選擇器。用戶在各自頁(yè)面選擇完時(shí)間后,A,B,C頁(yè)面互相切換時(shí)保存選擇的時(shí)間,在關(guān)閉瀏覽器tab后,清除選擇的時(shí)間,恢復(fù)初識(shí)值。一開始的想法是使用會(huì)話 cookie(不手動(dòng)設(shè)置過(guò)期時(shí)間),但是會(huì)話 cookie 在關(guān)閉瀏覽器 tab 的時(shí)候不會(huì)被清除。所以決定研究下會(huì)話 cookie 何時(shí)清除。

cookie

背景

HTTP 是一種無(wú)狀態(tài)的協(xié)議,它不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,即無(wú)法根據(jù)之前的狀態(tài)進(jìn)行本次請(qǐng)求的處理。假如要求登錄驗(yàn)證的 web 頁(yè)面本身無(wú)法進(jìn)行狀態(tài)的管理,那么每次跳轉(zhuǎn)新頁(yè)面就要再次登錄,或者要在請(qǐng)求報(bào)文中附加參數(shù)來(lái)管理登錄狀態(tài)。無(wú)狀態(tài)協(xié)議有它的優(yōu)點(diǎn),由于不必保存狀態(tài),可以減少服務(wù)器的 CPU 及內(nèi)存資源。為了保留無(wú)狀態(tài)協(xié)議這個(gè)特征的同時(shí)又要解決類似的矛盾問(wèn)題,于是引入了 cookie。

原理

cookie 技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入 cookie 信息來(lái)控制客戶端的狀態(tài)。cookie 會(huì)根據(jù)從服務(wù)器端發(fā)送的響應(yīng)報(bào)文內(nèi)的一個(gè)叫做 Set-Cookie 的首部字段信息,通知客戶端保存。當(dāng)下次客戶端再往該服務(wù)器發(fā)送請(qǐng)求時(shí),客戶端會(huì)自動(dòng)在請(qǐng)求報(bào)文中加入 cookie 值后發(fā)送出去。
服務(wù)端發(fā)現(xiàn)客戶端發(fā)送過(guò)來(lái)的 cookie 后,會(huì)去檢查究竟是從哪一個(gè)客戶端發(fā)來(lái)的連接請(qǐng)求,然后對(duì)比服務(wù)器上的記錄,最后得到之前的狀態(tài)信息。

客戶端設(shè)置

// 屬性之間由一個(gè)分號(hào)和一個(gè)空格隔開
document.cookie = "name=value; expires=date; path=path"

// 設(shè)置多個(gè)cookie
document.cookie = "name=irene; domain=www.baidu.com";
document.cookie = "age=18; path=/welcome";

document.cookie 一次只能設(shè)置一條 cookie,如果需要設(shè)置多條,需要多次設(shè)置??蛻舳丝梢栽O(shè)置的屬性有:expires、max-age、domain、path、secure(https協(xié)議下才能設(shè)置成功),不能設(shè)置 HttpOnly。

服務(wù)器端設(shè)置
  Set-Cookie: name=value[; expires=date][; domain=domain][; path=path][; secure]

  // 設(shè)置多個(gè)cookie
  Set-Cookie: name=irene; domain=www.baidu.com;
  Set-Cookie: age=18; path=/welcome;

一個(gè) Set-Cookie 只能設(shè)置一條 cookie,如果需要設(shè)置多條,需要多次使用 Set-Cookie。cookie 除了設(shè)置名稱和值之外,還可以設(shè)置其他的屬性。服務(wù)端可以設(shè)置的屬性有:expires、max-age、domain、path、secure、HttpOnly 等。

屬性
expires 和 max-age

設(shè)置 cookie 的失效時(shí)間。expires 的值是一個(gè)時(shí)間點(diǎn)(cookie 失效時(shí)刻 = expires),max-age?的值是秒數(shù)(cookie 失效時(shí)刻 = 創(chuàng)建時(shí)刻 + max-age)。expires?是 http/1.0 協(xié)議中的選項(xiàng),在新的 http/1.1 協(xié)議中 expires 已經(jīng)由?max-age?選項(xiàng)代替。如果兩者同時(shí)存在,max-age 的優(yōu)先級(jí)高于 expires。max-age 有兩種可能值:小于等于0:有效期為能表示的最早時(shí)間;大于0:有效期為當(dāng)前時(shí)間 + max-age。

// expires
document.cookie="name=irene; expires=Wed, 13 Jun 2019 10:28:27 GMT"
// max-age > 0
document.cookie="name=irene; max-age=3600"
// max-age <= 0
document.cookie="name=irene; max-age=0"

注意:一旦 cookie 從服務(wù)器端發(fā)送至客戶端,服務(wù)器端就不存在可以顯式刪除 cookie 的方法。但可通過(guò)覆蓋 cookie,實(shí)現(xiàn)對(duì)客戶端 cookie 的刪除操作。

domain & path

Domain 設(shè)置域名,默認(rèn)是當(dāng)前域名。path 設(shè)置路徑,默認(rèn)是當(dāng)前目錄。domain 和 path 一起限制了哪些請(qǐng)求可以帶上該 cookie。比如上面第二個(gè)的 cookie,若請(qǐng)求的 URL 的域名是 juejin.com 或 xxx.juejin.com,并且 URL 的路徑是 / 或 子路徑 "/home",則瀏覽器會(huì)將此 cookie 添加到該請(qǐng)求的 cookie 頭部中。

// 在 https://juejin.im/welcome/frontend 設(shè)置如下 cookie,則瀏覽器 Cookie 面板顯示的 domain=juejin.im,path=/welcome
document.cookie = "name=irene"
// 在 https://juejin.im/welcome/frontend 設(shè)置如下 cookie,則瀏覽器 Cookie 面板顯示的 domain=.juejin.im(有前綴.),
document.cookie = "name=irene; domain=juejin.im; path=/welcome/frontend"
// 關(guān)于 domain 有無(wú)前綴點(diǎn)可參考 http://www.it1352.com/548425.html
HttpOnly

當(dāng)設(shè)置了 HttpOnly,瀏覽器就不會(huì)將該 cookie 添加到非 HTTP 請(qǐng)求的頭部。
設(shè)置 cookie 是否能通過(guò) js 去訪問(wèn)(讀取、修改、刪除等)。默認(rèn)情況下,cookie 不會(huì)帶 HttpOnly 選項(xiàng),所以客戶端是可以通過(guò) js 代碼去訪問(wèn)這個(gè) cookie 的。當(dāng) cookie 帶 HttpOnly 選項(xiàng)時(shí),客戶端則無(wú)法通過(guò) js 代碼去訪問(wèn)這個(gè)cookie。主要目的是為防止跨站腳本攻擊對(duì) cookie 的信息竊取。HttpOnly 只能從服務(wù)端設(shè)置,不能通過(guò)客戶端設(shè)置。

Secure

設(shè)置僅在 HTTPS 安全連接時(shí),才可以發(fā)送 cookie。

瀏覽器對(duì)于是否攜帶 cookie 項(xiàng)的策略
domain-matching

一個(gè)字符串(str)匹配(domain-matches)一個(gè)給定的域名字符串(domain str)至少需要滿足以下條件中的一個(gè):

str 和 domain str 完全相同(轉(zhuǎn)成小寫后比較)。

或者同時(shí)滿足以下條件:
2.1 domain str 是 str 的后綴。
2.2 str 中最后一個(gè)不包含在 domain str 中的字符是點(diǎn)(.)。

domain str = google.com;  str = map.googole.com  =>  符合
domain str = google.com;  str = map.mgoogle.com  =>  最后一個(gè)不包含在 domain str 中的字符是 m,不符合 

2.3 str 必須是一個(gè)域名,而不是 IP 地址。

path-matching

一個(gè)請(qǐng)求路徑(request-path)匹配(path-matches)一個(gè)給定的 cookie-path 至少需要滿足以下條件中的一個(gè):

request-path 和 cookie-path 完全一樣。

cookie-path 是 request-path 的前綴,并且 cookie-path 的最后一個(gè)字符是 / 。

cookie-path 是 request-path 的前綴,并且 request-path 中第一個(gè)不包含在 cookie-path 中的字符是 / 。

注意:domain-matching & path-matching 只是瀏覽器決定是否攜帶 cookie 諸多參考項(xiàng)中的其中兩個(gè),瀏覽器還會(huì)參考諸如是否過(guò)期等項(xiàng)。

實(shí)踐
問(wèn)題:

cookie 不設(shè)置失效時(shí)間的話,默認(rèn)是會(huì)話結(jié)束失效,這個(gè)會(huì)話結(jié)束是指瀏覽器的所有窗口都關(guān)閉,還是說(shuō)這個(gè)網(wǎng)站的頁(yè)面全部關(guān)閉就可以了?

具體場(chǎng)景:

Chrome瀏覽器開了兩個(gè)窗口A B,A打開了網(wǎng)站1的兩個(gè)標(biāo)簽頁(yè)(tab1 & tab2)和網(wǎng)站2的兩個(gè)標(biāo)簽頁(yè)(tab3 & tab4),B打開了網(wǎng)站1的兩個(gè)標(biāo)簽頁(yè)(tab1 & tab2)和網(wǎng)站2的兩個(gè)標(biāo)簽頁(yè)(tab3 & tab4),如果想網(wǎng)站1的cookie失效的話,是不是把窗口A B關(guān)于網(wǎng)站1的tab頁(yè)關(guān)掉就行 還是 需要把瀏覽器的所有窗口都關(guān)閉?

實(shí)驗(yàn)對(duì)象:

https://segmentfault.com。它的 PHPSESSION 是會(huì)話結(jié)束失效,所以用來(lái)測(cè)試。

工具:

通過(guò)chrome://settings/cookies/detail?site=segmentfault.com查看該網(wǎng)站下的所有cookie。

結(jié)論:

瀏覽器的所有窗口都關(guān)閉,網(wǎng)站1的cookie(會(huì)話cookie)才失效。windows 在瀏覽器窗口都關(guān)閉的情況下,會(huì)退出程序,所以 cookie 會(huì)失效;mac 在瀏覽器窗口都關(guān)閉的情況下,不會(huì)退出程序,所以 cookie 不會(huì)失效,需要退出程序 cookie 才失效。

規(guī)范

如果一個(gè) cookie 同時(shí)設(shè)置了 Max-Age 和 Expires 屬性,Max-Age 的優(yōu)先級(jí)更高。如果兩個(gè)都沒(méi)有設(shè)置,UA 會(huì)保存該 cookie 直到當(dāng)前 會(huì)話結(jié)束。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/54077.html

相關(guān)文章

  • Servlet第五篇【介紹會(huì)話技術(shù)、Cookie的API、詳解、應(yīng)用】

    摘要:保存中文上面我們的例子保存的是英文字符,下面我們來(lái)看下保存中文字符會(huì)怎么樣。出異常了中文屬于字符,英文數(shù)據(jù)字符,中文占個(gè)字符或者個(gè)字符,英文占個(gè)字符。如果為,則表示刪除該。的值規(guī)定為域名的隱私安全機(jī)制決定是不可跨域名的。 什么是會(huì)話技術(shù) 基本概念: 指用戶開一個(gè)瀏覽器,訪問(wèn)一個(gè)網(wǎng)站,只要不關(guān)閉該瀏覽器,不管該用戶點(diǎn)擊多少個(gè)超鏈接,訪問(wèn)多少資源,直到用戶關(guān)閉瀏覽器,整個(gè)這個(gè)過(guò)程我們稱為一...

    binaryTree 評(píng)論0 收藏0
  • Cookic

    摘要:追蹤記錄和分析用戶行為。屬性返回一個(gè)布爾值,表示瀏覽器是否打開功能不同瀏覽器對(duì)數(shù)量和大小的限制,是不一樣的。請(qǐng)求的發(fā)送瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),每個(gè)請(qǐng)求都會(huì)帶上相應(yīng)的。屬性必須為絕對(duì)路徑,默認(rèn)為當(dāng)前路徑。屬性值必須是當(dāng)前發(fā)送的域名的一部分。 概述Cookie 與 HTTP 協(xié)議HTTP 回應(yīng):Cookie 的生成HTTP 請(qǐng)求:Cookie 的發(fā)送Cookie 的屬性Expires,M...

    phoenixsky 評(píng)論0 收藏0
  • 客戶端數(shù)據(jù)存儲(chǔ)----Cookie From 《高程3》

    摘要:首先先來(lái)一段總結(jié)用于本地?cái)?shù)據(jù)存儲(chǔ),出現(xiàn)在服務(wù)器和瀏覽器交互的響應(yīng)頭部和請(qǐng)求頭部中,受到單域名下的數(shù)量單個(gè)大小性能安全限制。子技術(shù)的出現(xiàn)緩解了單域名下的數(shù)量限制,關(guān)于子有一整套工具函數(shù)可以使用。 前言 本篇主要介紹Cookie技術(shù)的讀書總結(jié),但是我認(rèn)為邏輯上最好會(huì)和Web Storage技術(shù)放在一起進(jìn)行對(duì)比,因此后續(xù)會(huì)再總結(jié)一篇關(guān)于WEB存儲(chǔ)的姊妹總結(jié),敬請(qǐng)期待。 首先先來(lái)一段總結(jié):Co...

    馬忠志 評(píng)論0 收藏0
  • 客戶端數(shù)據(jù)存儲(chǔ)----Cookie From 《高程3》

    摘要:首先先來(lái)一段總結(jié)用于本地?cái)?shù)據(jù)存儲(chǔ),出現(xiàn)在服務(wù)器和瀏覽器交互的響應(yīng)頭部和請(qǐng)求頭部中,受到單域名下的數(shù)量單個(gè)大小性能安全限制。子技術(shù)的出現(xiàn)緩解了單域名下的數(shù)量限制,關(guān)于子有一整套工具函數(shù)可以使用。 前言 本篇主要介紹Cookie技術(shù)的讀書總結(jié),但是我認(rèn)為邏輯上最好會(huì)和Web Storage技術(shù)放在一起進(jìn)行對(duì)比,因此后續(xù)會(huì)再總結(jié)一篇關(guān)于WEB存儲(chǔ)的姊妹總結(jié),敬請(qǐng)期待。 首先先來(lái)一段總結(jié):Co...

    since1986 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

bawn

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<