亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Http的狀態(tài)管理機(jī)制(cookie)

Original 2016-11-10 17:34:58 527
abstract:這篇文檔是為HTTP request 和 response之間創(chuàng)建一個(gè)有狀態(tài)的會(huì)話指明一個(gè)方法,并描述了兩個(gè)頭字段:Cookie和Set-cookie,用于攜帶服務(wù)端和客戶端之間的狀態(tài)信息。HTTP狀態(tài)管理機(jī)制摘要這篇文檔是為HTTP request 和 response之間創(chuàng)建一個(gè)有狀態(tài)的會(huì)話指明一個(gè)方法,并描述了兩個(gè)頭字段:Cookie和Set-cookie,用于攜帶服務(wù)端和客戶端之間的狀態(tài)信

這篇文檔是為HTTP request 和 response之間創(chuàng)建一個(gè)有狀態(tài)的會(huì)話指明一個(gè)方法,并描述了兩個(gè)頭字段:Cookie和Set-cookie,用于攜帶服務(wù)端和客戶端之間的狀態(tài)信息。

HTTP狀態(tài)管理機(jī)制

摘要

這篇文檔是為HTTP request 和 response之間創(chuàng)建一個(gè)有狀態(tài)的會(huì)話指明一個(gè)方法,并描述了兩個(gè)頭字段:Cookie和Set-cookie,用于攜帶服務(wù)端和客戶端之間的狀態(tài)信息。

術(shù)語

FQHN(fully-qualified host name):指的是主機(jī)的FQDN(fully-qualified domain name),比如以1級(jí)域名.com 或 .uk結(jié)尾的完全指定的域名,或者指主機(jī)的IP地址。(傾向于前者,后者不建議)

request-host:指的是客戶端發(fā)出請(qǐng)求指向的服務(wù)器端的主機(jī)(跟端口無關(guān)),這里request-host是一個(gè)FQHN.

request-URI:指的是客戶端發(fā)出請(qǐng)求指向的服務(wù)器端絕對(duì)路徑部分。

host-name:指的是一個(gè)IP地址或者一個(gè)FQHN字符串。

domain-match:滿足下面其中一種情況則A的host-name domain-match B的host-name:

  • 兩者的host-name都是IP并完全一致

  • 兩者的host-name都是FQDN字符串且完全一致

  • A的host-name是FQDN字符串并且格式為NB,其中N是一個(gè)非空字符串,B個(gè)格式是.C,而C是一個(gè)FQDN字符串。也就是說A = N.C,B = .C的情況。比如:域x.y.com就domain-match 域.y.com,而域x.y.com就不domain-match 域y.com。(這個(gè)定義對(duì)是否能使用某個(gè)域的cookie非常關(guān)鍵)同時(shí)要注意,A domain-match B,不能說明B domain-math A,同樣需要通過這個(gè)定義來判斷。

語法

Set-cookie 和 Cookie這兩個(gè)頭字段有相似的語法。

(Set-cookie/Cookie) = av-pair *(";" av-pair)

其中:

av-pair = attr ["=" value]

attr = token

value = word

word = token | quoted-string(帶引號(hào)的字符串)

這里邊,token的定義得去查看HTTP/1.1 specification [RFC 2068] 。等號(hào)左右允許有空格。

服務(wù)器端

為了與客戶端之間的會(huì)話保持狀態(tài)信息,服務(wù)器端在response頭中使用Set-Cookie字段,而客戶端如果想保持狀態(tài)信息,得在request頭中加Cookie字段。服務(wù)器端若要終止這個(gè)會(huì)話,可以簡單的設(shè)置Set-Cookie為Max-Age=0。

服務(wù)器端可能會(huì)包含多個(gè)Set-cookie字段,不過網(wǎng)關(guān)會(huì)把這些合并成一個(gè)Set-cookie字段,用逗號(hào),分隔。

Set-Cookie

set-cookie = "Set-Cookie:" cookies

其中

cookies = 1#cookie

cookie = NAME "=" VALUE *(";" cookie-av)

NAME = attr

VALUE = value

cookie-av = "Comment" "=" value | "Domain" "=" value | "Max-Age" "=" value | "Path" "=" value | "Secure" | "Version" "=" 1*DIGIT

NAME=VALUE:必須的,雖然VALUE嚴(yán)格上來說對(duì)客戶端是不透明的,然實(shí)際上通過檢查Set-Cookie字段還是可以讀到的。

Comment=comment:可選,描述該Cookie的用處。

Domain=domain:可選,指定了cookie有效的域。明確指定的domain必須以.開頭。

Max-Age=delta-seconds:可選,指cookie的存活時(shí)間,以秒為單位,非負(fù)數(shù)。Max-Age=0表示客戶端需要立即丟棄該cookie。

Path=path:可選,指在某URL的子路徑下cookie有效。

Secure:可選,(翻者注:有點(diǎn)難理解)查閱資料解釋如下:創(chuàng)建的 Cookie 會(huì)被以安全的形式向服務(wù)器傳輸,也就是只能在 HTTPS 連接中被瀏覽器傳遞到服務(wù)器端進(jìn)行會(huì)話驗(yàn)證,如果是 HTTP 連接則不會(huì)傳遞該信息,所以不會(huì)被竊取到Cookie 的具體內(nèi)容。

HTTP狀態(tài)管理機(jī)制 2011 補(bǔ)充

HttpOnly:可選,用于告訴客戶端不能通過”non-HTTP“的方式獲取cookie(比如瀏覽器的API:document.cookie)。

Version=version:必須。十進(jìn)制的整數(shù),指狀態(tài)管理中cookie指向的版本。

控制緩存

如果cookie只給某一用戶使用,則Set-Cookie頭不能被緩存,相反則應(yīng)該緩存。

根據(jù)情況,服務(wù)器端應(yīng)該在response頭中添加一些字段:

  • 禁止緩存Set-Cookie頭,則:Cache-control:no-cache="set-cookie"。

  • 禁止在共享緩存中緩存私密文檔:Cache-control:private。

  • To allow caching of a document, but to require that proxy caches (not user agent caches) validate it before returning it to the client:Cache-control:proxy-revalidata。(譯者注:這條跟下面一條區(qū)別在哪里沒看出)

  • To allow caching of a document and request that it be validated before returning it to the client (by "pre-expiring" it): Cache-control:max-age=0

HTTP/1.1服務(wù)器如果不確定下游是否有代理,則必須設(shè)置Expires: old-date。(譯者注:防止cookie被代理緩存,會(huì)產(chǎn)生bug)。Cache-Control指令會(huì)覆蓋Expires:old-date。

客戶端

客戶端在接收到Set-Cookie的response頭之后,會(huì)對(duì)其中可選的屬性應(yīng)用默認(rèn)值:

  • Version:根據(jù)Netscape規(guī)范。

  • Domain:默認(rèn)為request-host(不是以.開頭)(譯者注:服務(wù)器端有時(shí)候會(huì)不設(shè)置這個(gè)Domain,以為到了客戶端之后會(huì)設(shè)置成客戶端的域名,其實(shí)是目標(biāo)服務(wù)器的域名)。

  • Max-Age:默認(rèn)行為是如果客戶端存在這個(gè)cookie,那這個(gè)cookie會(huì)被清除掉。

  • Path:請(qǐng)求URL中的path,不右邊最右邊的'/'。

  • Secure:客戶端將通過一條不安全的通道發(fā)送cookie(譯者注:也就是Http)。

拒絕cookie

考慮安全,如果滿足下面的情況,客戶端將不會(huì)保存cookie:

  • Path不是request-URI的前綴。

  • Domain的值不是以.開頭或者沒有內(nèi)含的點(diǎn)(eg: .com沒有,segmentfault.com有)。

  • request-host不 domain-match Domain的值。

  • request-host是個(gè)FQDN并且格式為HD,其中D是Domain的值,H是一個(gè)包含.的字符串。

    舉例子:

  • request-host = x.foo.com,Domain = .foo.com 通過。

  • Domain=.com 或者 Domain=.com. 不通過,因?yàn)闆]有內(nèi)含的點(diǎn).。

  • Domain=ajax.com 不通過,因?yàn)闆]有以.開頭。

Cookie 管理

如果Set-Cookie中的cookie名字已經(jīng)存在在客戶端里,并且Domain和Path都一樣,那么新的Cookie會(huì)覆蓋舊的;如果新的Cookie中Max-Age=0,那么新舊cookie都會(huì)被清除掉。

由于客戶端存儲(chǔ)cookie的空間有限,所以可能會(huì)應(yīng)用如LRU等算法來清除舊的cookie。

發(fā)送Cookie到服務(wù)器端

基于下面幾種,客戶端會(huì)在發(fā)送請(qǐng)求到服務(wù)器端的時(shí)候?qū)ookie包含在request頭中。

request-host

request-URI

cookie的存活時(shí)間

Cookie頭的語法:

cookie = "Cookie:" cookie-version 1*((","|";") cookie-value)

其中:

cookie-value = NAME "=" VALUE";" path

cookie-version = "$Version" "=" value

NAME = attr

VALUE = value

path = "$Path" "=" value

domain = "$Domain" "=" value

同時(shí)以上屬性的值有這樣的要求:如果有相應(yīng)的Set-Cookie response頭,則cookie-version的值應(yīng)該與此response中的cookie-version一致,否則為0.同理path也需一致,否則該屬性會(huì)被剔除掉。同理Domain的值也需一致,否則也會(huì)被剔除掉。

請(qǐng)求頭中可以包含哪些cookie有以下規(guī)則:

Domain:服務(wù)器端的FQHN必須domain-match Domain的值。

Path:Path的值必須是request-URI的前綴。

Max-Age:不能是已經(jīng)過期了。

緩存代理服務(wù)器

緩存代理服務(wù)器必須遵循下面規(guī)范:

  • 依據(jù)緩存驗(yàn)證規(guī)則。

  • 將response頭(包含Set-cookie)傳遞到客戶端。

  • 將request頭(包含Cookie)傳遞給服務(wù)器端。


Release Notes

Popular Entries