掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
HTTP狀態(tài)管理機制

摘要
這篇文檔是為HTTP request 和 response之間創(chuàng)建一個有狀態(tài)的會話指明一個方法,并描述了兩個頭字段:Cookie和Set-cookie,用于攜帶服務(wù)端和客戶端之間的狀態(tài)信息。
術(shù)語
FQHN(fully-qualified host name):指的是主機的FQDN(fully-qualified domain name),比如以1級域名.com 或 .uk結(jié)尾的完全指定的域名,或者指主機的IP地址。(傾向于前者,后者不建議)
request-host:指的是客戶端發(fā)出請求指向的服務(wù)器端的主機(跟端口無關(guān)),這里request-host是一個FQHN.
request-URI:指的是客戶端發(fā)出請求指向的服務(wù)器端絕對路徑部分。
host-name:指的是一個IP地址或者一個FQHN字符串。
domain-match:滿足下面其中一種情況則A的host-name domain-match B的host-name:
語法
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] 。等號左右允許有空格。
服務(wù)器端
為了與客戶端之間的會話保持狀態(tài)信息,服務(wù)器端在response頭中使用Set-Cookie字段,而客戶端如果想保持狀態(tài)信息,得在request頭中加Cookie字段。服務(wù)器端若要終止這個會話,可以簡單的設(shè)置Set-Cookie為Max-Age=0。
服務(wù)器端可能會包含多個Set-cookie字段,不過網(wǎng)關(guān)會把這些合并成一個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嚴(yán)格上來說對客戶端是不透明的,然實際上通過檢查Set-Cookie字段還是可以讀到的。
Comment=comment:可選,描述該Cookie的用處。
Domain=domain:可選,指定了cookie有效的域。明確指定的domain必須以.開頭。
Max-Age=delta-seconds:可選,指cookie的存活時間,以秒為單位,非負(fù)數(shù)。Max-Age=0表示客戶端需要立即丟棄該cookie。
Path=path:可選,指在某URL的子路徑下cookie有效。
Secure:可選,(翻者注:有點難理解)查閱資料解釋如下:創(chuàng)建的 Cookie 會被以安全的形式向服務(wù)器傳輸,也就是只能在 HTTPS 連接中被瀏覽器傳遞到服務(wù)器端進行會話驗證,如果是 HTTP 連接則不會傳遞該信息,所以不會被竊取到Cookie 的具體內(nèi)容。
HTTP狀態(tài)管理機制 2011 補充
HttpOnly:可選,用于告訴客戶端不能通過”non-HTTP“的方式獲取cookie(比如瀏覽器的API:document.cookie)。
Version=version:必須。十進制的整數(shù),指狀態(tài)管理中cookie指向的版本。
控制緩存
如果cookie只給某一用戶使用,則Set-Cookie頭不能被緩存,相反則應(yīng)該緩存。
根據(jù)情況,服務(wù)器端應(yīng)該在response頭中添加一些字段:
HTTP/1.1服務(wù)器如果不確定下游是否有代理,則必須設(shè)置Expires: old-date。(譯者注:防止cookie被代理緩存,會產(chǎn)生bug)。Cache-Control指令會覆蓋Expires:old-date。
客戶端
客戶端在接收到Set-Cookie的response頭之后,會對其中可選的屬性應(yīng)用默認(rèn)值:
拒絕cookie
考慮安全,如果滿足下面的情況,客戶端將不會保存cookie:
舉例子:
Cookie 管理
如果Set-Cookie中的cookie名字已經(jīng)存在在客戶端里,并且Domain和Path都一樣,那么新的Cookie會覆蓋舊的;如果新的Cookie中Max-Age=0,那么新舊cookie都會被清除掉。
由于客戶端存儲cookie的空間有限,所以可能會應(yīng)用如LRU等算法來清除舊的cookie。
發(fā)送Cookie到服務(wù)器端
基于下面幾種,客戶端會在發(fā)送請求到服務(wù)器端的時候?qū)ookie包含在request頭中。
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
同時以上屬性的值有這樣的要求:如果有相應(yīng)的Set-Cookie response頭,則cookie-version的值應(yīng)該與此response中的cookie-version一致,否則為0.同理path也需一致,否則該屬性會被剔除掉。同理Domain的值也需一致,否則也會被剔除掉。
請求頭中可以包含哪些cookie有以下規(guī)則:
緩存代理服務(wù)器
緩存代理服務(wù)器必須遵循下面規(guī)范:

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流