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: 语法 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头中添加一些字段: HTTP/1.1服务器如果不确定下游是否有代理,则必须设置Expires: old-date。(译者注:防止cookie被代理缓存,会产生bug)。Cache-Control指令会覆盖Expires:old-date。 客户端 客户端在接收到Set-Cookie的response头之后,会对其中可选的属性应用默认值: 拒绝cookie 考虑安全,如果满足下面的情况,客户端将不会保存cookie: 举例子: Cookie 管理 如果Set-Cookie中的cookie名字已经存在在客户端里,并且Domain和Path都一样,那么新的Cookie会覆盖旧的;如果新的Cookie中Max-Age=0,那么新旧cookie都会被清除掉。 由于客户端存储cookie的空间有限,所以可能会应用如LRU等算法来清除旧的cookie。 发送Cookie到服务器端 基于下面几种,客户端会在发送请求到服务器端的时候将cookie包含在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 同时以上属性的值有这样的要求:如果有相应的Set-Cookie response头,则cookie-version的值应该与此response中的cookie-version一致,否则为0.同理path也需一致,否则该属性会被剔除掉。同理Domain的值也需一致,否则也会被剔除掉。 请求头中可以包含哪些cookie有以下规则: 缓存代理服务器 缓存代理服务器必须遵循下面规范: