成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Http的狀態管理機制(cookie)

開發 前端
這篇文檔是為HTTP request 和 response之間創建一個有狀態的會話指明一個方法,并描述了兩個頭字段:Cookie和Set-cookie,用于攜帶服務端和客戶端之間的狀態信息。

[[171103]]

HTTP狀態管理機制

摘要

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

術語

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

request-host:指的是客戶端發出請求指向的服務器端的主機(跟端口無關),這里request-host是一個FQHN.

request-URI:指的是客戶端發出請求指向的服務器端絕對路徑部分。

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

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

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

語法

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

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

其中:

av-pair = attr ["=" value]

attr = token

value = word

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

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

服務器端

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

服務器端可能會包含多個Set-cookie字段,不過網關會把這些合并成一個Set-cookie字段,用逗號,分隔。

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嚴格上來說對客戶端是不透明的,然實際上通過檢查Set-Cookie字段還是可以讀到的。

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

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

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

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

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

HTTP狀態管理機制 2011 補充

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

Version=version:必須。十進制的整數,指狀態管理中cookie指向的版本。

控制緩存

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

根據情況,服務器端應該在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。(譯者注:這條跟下面一條區別在哪里沒看出)
  • 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服務器如果不確定下游是否有代理,則必須設置Expires: old-date。(譯者注:防止cookie被代理緩存,會產生bug)。Cache-Control指令會覆蓋Expires:old-date。

客戶端

客戶端在接收到Set-Cookie的response頭之后,會對其中可選的屬性應用默認值:

  • Version:根據Netscape規范。
  • Domain:默認為request-host(不是以.開頭)(譯者注:服務器端有時候會不設置這個Domain,以為到了客戶端之后會設置成客戶端的域名,其實是目標服務器的域名)。
  • Max-Age:默認行為是如果客戶端存在這個cookie,那這個cookie會被清除掉。
  • Path:請求URL中的path,不右邊最右邊的'/'。
  • Secure:客戶端將通過一條不安全的通道發送cookie(譯者注:也就是Http)。

拒絕cookie

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

  • Path不是request-URI的前綴。
  • Domain的值不是以.開頭或者沒有內含的點(eg: .com沒有,segmentfault.com有)。
  • request-host不 domain-match Domain的值。
  • request-host是個FQDN并且格式為HD,其中D是Domain的值,H是一個包含.的字符串。

      舉例子:

  • request-host = x.foo.com,Domain = .foo.com 通過。
  • Domain=.com 或者 Domain=.com. 不通過,因為沒有內含的點.。
  • Domain=ajax.com 不通過,因為沒有以.開頭。

Cookie 管理

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

由于客戶端存儲cookie的空間有限,所以可能會應用如LRU等算法來清除舊的cookie。

發送Cookie到服務器端

基于下面幾種,客戶端會在發送請求到服務器端的時候將cookie包含在request頭中。

  • request-host
  • request-URI
  • cookie的存活時間

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

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

請求頭中可以包含哪些cookie有以下規則:

  • Domain:服務器端的FQHN必須domain-match Domain的值。
  • Path:Path的值必須是request-URI的前綴。
  • Max-Age:不能是已經過期了。

緩存代理服務器

緩存代理服務器必須遵循下面規范:

  • 依據緩存驗證規則。
  • 將response頭(包含Set-cookie)傳遞到客戶端。
  • 將request頭(包含Cookie)傳遞給服務器端。
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2010-12-10 15:40:58

JVM內存管理

2009-07-08 15:10:00

Servlet會話管理

2013-09-29 15:11:46

Linux運維內存管理

2010-07-23 09:34:48

Python

2010-09-26 13:23:13

JVM內存管理機制

2022-06-01 16:01:58

MySQL內存管理系統

2009-09-25 12:59:53

Hibernate事務

2021-12-15 06:58:27

Go多版本管理

2010-04-08 15:43:28

Oracle緩沖塊

2011-06-29 17:20:20

Qt 內存 QOBJECT

2009-09-23 17:48:00

Hibernate事務

2020-11-08 14:32:01

JavaScript變量內存管理

2022-02-28 10:25:17

Python參數傳遞拷貝

2016-10-09 14:41:40

Swift開發ARC

2011-11-10 14:46:54

Windows8電源管理

2010-09-27 13:26:31

JVM內存管理機制

2017-08-17 17:09:28

PostgreSQL 數據塊機制

2019-01-23 17:08:52

Python內存管理RealPython

2020-08-18 19:15:44

Redis內存管理

2011-08-18 13:28:35

Objective-C內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品免费视频大全最热 | 日日日色 | 国产精品久久久久久吹潮 | 羞羞的视频在线观看 | 国产一伦一伦一伦 | 国产一区二| 国产高清免费 | 日韩亚洲欧美综合 | 国产精品美女久久久久久免费 | 日本aⅴ中文字幕 | 在线欧美一区 | 孕妇一级毛片 | 欧美在线一区二区三区 | 在线免费中文字幕 | 国产精品久久久久久久久久久久 | 一区二区三区免费 | 99久久精品一区二区成人 | 欧美a v在线 | 在线播放亚洲 | 欧美日韩中文字幕在线播放 | 日韩www| 91成人精品视频 | 欧美中文| 尤物视频在线免费观看 | 免费国产视频在线观看 | 欧美黄色片 | 国产成人精品久久二区二区 | 色婷婷精品久久二区二区蜜臂av | 日韩精品在线观看免费 | 久久丝袜 | 欧美一级www片免费观看 | 男人的天堂一级片 | 亚洲情视频| 国产ts人妖系列高潮 | 一区二区三区四区电影视频在线观看 | 欧美午夜精品 | 岛国精品| 一区二区三区四区国产 | 欧美激情精品久久久久久变态 | 午夜寂寞福利视频 | 精品国产一区一区二区三亚瑟 |