当前位置: 首页 > 科技观察

Http状态管理机制(cookie)

时间:2023-03-13 22:21:32 科技观察

HTTP状态管理机制总结本文档规定了一种在HTTP请求和响应之间创建有状态会话的方法,并描述了两个头字段:Cookie和Set-cookie,用于携带HTTP请求和响应之间的状态信息服务器和客户端。FQHN(fully-qualifiedhostname)一词:指主机的FQDN(fully-qualifieddomainname),如以一级域名.com或.uk结尾的全称域名,或指到主机的IP地址。(倾向于前者,不推荐后者)request-host:指客户端向其发送请求的服务器端主机(与端口无关),其中request-host是一个FQHN.request-URI:指客户端发送的请求所指向的服务器端绝对路径部分。host-name:IP地址或FQHN字符串。domain-match:如果满足以下条件之一,则A的host-name与B的host-namedomain-match:两个host-name都是IP,完全一致。两个主机名都是FQDN字符串并且完全一致。一致A的主机名是FQDN字符串,格式为NB,其中N是非空字符串,B的格式为.C,C是FQDN字符串。也就是说A=N.C,B=.C的情况。例如:域x.y.com将域匹配域.y.com,而域x.y.com将不会域匹配域y.com。(这个定义对于某个域的cookie是否可以使用是非常关键的。)同时需要注意的是,A域-匹配B不能解释B域-数学A,还需要通过判断这个定义。语法Set-cookie和Cookie这两个头字段具有相似的语法。(Set-cookie/Cookie)=av-pair*(";"av-pair)其中:av-pair=attr["="value]attr=tokenvalue=wordword=token|quoted-string(带引号的字符串)这里token的定义得看HTTP/1.1规范[RFC2068]。等号周围允许有空格。为了让服务器在与客户端的会话中保持状态信息,服务器在响应头中使用了Set-Cookie字段,如果客户端想要保持状态信息,则必须在请求头中加入Cookie字段。如果服务器端想终止这个会话,它可以简单地设置Set-Cookie为Max-Age=0。服务器端可能包含多个Set-cookie字段,但网关会将这些字段组合成一个Set-cookie字段,以逗号分隔。Set-Cookieset-cookie="Set-Cookie:"cookieswherecookies=1#cookiecookie=NAME"="VALUE*(";"cookie-av)NAME=attrVALUE=valuecookie-av="Comment""="value|“域”“=值|“最大年龄”“=值|“路径”“=值|“安全”|"Version""="1*DIGITNAME=VALUE:必填,虽然严格来说VALUE对客户端是不透明的,但实际上可以通过查看Set-Cookie字段来读取。comment=comment:可选,描述cookie的使用。Domain=domain:可选,指定cookie的有效域。明确指定的域必须以.Max-Age=delta-seconds:可选,指cookie的存活时间,单位秒,非负数。Max-Age=0表示客户端需要立即丢弃该cookie。Path=path:可选,表示cookie在某个URL的子路径下有效。Secure:optional,(译者注:有点难理解)信息解释如下:创建的cookie会以安全的形式传输到服务器,即只能由浏览器在HTTPS连接中进行session验证,如果是HTTP连接,则不会传递信息,所以不会窃取Cookie的具体内容。HTTP状态管理机制2011补充HttpOnly:可选,用于告诉客户端不能通过“非HTTP”(如浏览器API:document.cookie)获取cookie。版本=版本:必需。十进制整数,表示状态管理中cookie指向的版本。控制缓存如果cookie只被某个用户使用,Set-Cookie头不能缓存,相反应该缓存。根据情况,服务器应该在响应头中添加一些字段:禁用Set-Cookie头的缓存,然后:Cache-control:no-cache="set-cookie"。禁止在共享缓存中缓存私有文档:Cache-control:private。允许缓存文档,但要求代理缓存(不是用户代理缓存)在将其返回给客户端之前对其进行验证:Cache-control:proxy-revalidate。(译者注:我看不出这和下面的有什么区别)允许缓存文档并请求在将其返回给客户端之前对其进行验证(通过“预过期”它):Cache-control:max-age=0HTTP/1.1服务器如果不确定下游是否有代理,则必须设置Expires:old-date。(译者注:阻止cookies被代理缓存会导致bug)。Cache-Control指令覆盖Expires:old-date。Client收到Set-Cookie的响应头后,会对可选属性应用默认值:Version:根据Netscape规范。Domain:默认是request-host(不以.开头)Max-Age:默认行为是如果cookie在客户端存在,cookie会被清除。Path:请求URL中的路径,不是最右边的'/'。Secure:客户端会通过一个不安全的通道(译者注:Http)发送cookie。拒绝cookie被认为是安全的。如果满足以下条件,客户端将不会保存cookie:Path不是request-URI的前缀。域值不以开头。或包含点(例如:.com没有,segmentfault.com有)。request-host与Domain的值不匹配。request-host是一个FQDN,格式为HD,其中D是Domain的值,H是包含.示例:request-host=x.foo.com,Domain=.foo.com通过。域=.com或域=.com。不通过,因为没有封闭的点..Domain=ajax.com不通过,因为它不是以.Cookie管理如果Set-Cookie中的cookie名称在客户端已经存在,并且Domain和Path相同,则新的cookie会覆盖旧的;如果新cookie中的Max-Age=0,则新旧cookie都会被清除掉。由于客户端存储cookie的空间有限,可以采用LRU等算法清除旧cookie。向服务端发送Cookie是基于以下的,客户端在向服务端发送请求时会在请求头中包含cookie。request-hostrequest-URIcookie存活时间Cookie头语法:cookie="Cookie:"cookie-version1*((","|";")cookie-value)where:cookie-value=NAME"="="VALUE";"pathcookie-version="$Version""="valueNAME=attrVALUE=valuepath="$Path""="valuedomain="$Domain""="value同时,上述属性的值有这样的要求:如果有对应的Set-Cookie响应头,cookie-version值要和响应中的cookie-version一致,否则为0。同样,路径也必须一致,否则这个属性会同理,Domain的值也必须一致,否则会被删除。以下规则适用于哪些cookie可以包含在请求头中:Domain:服务器端的FQHN必须有domain-的值matchDomain.Path:Path的值必须是request-URI的前缀Max-Age:不能过期CachingProxyServersCachingproxyservers必须符合以下规范:根据缓存验证规则。将响应头(包括Set-cookie)传递给客户端。将请求头(包括Cookie)传递给服务器。