Http的状态管理机制(cookie)

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)传递给服务器端。

作者:zhoushx3

来源:51CTO

时间: 2024-10-21 17:48:21

Http的状态管理机制(cookie)的相关文章

详解HTTP Cookie状态管理机制_php实例

HTTP cookies,通常又称作"cookies",已经存在了很长时间,但是仍旧没有被予以充分的理解.首要的问题是存在了诸多误区,认为cookies是后门程序或病毒,或压根不知道它是如何工作的.第二个问题是对于cookies缺少一个一致性的接口.尽管存在着这些问题,cookies仍旧在web开发中起着如此重要的作用,以至于如果cookie在没有可替代品出现的情况下消失,我们许多喜欢的Web应用将变得毫无用处. 一.cookie 起源 cookie 最早是网景公司的雇员 Lou Mo

HTTP状态管理机制之Cookie(转)

一.cookie 起源 cookie 最早是网景公司的雇员 Lou Montulli 在1993年3月发明,后被 W3C 采纳,目前 cookie 已经成为标准,所有的主流浏览器如 IE.Chrome.Firefox.Opera 等都支持. cookie 的诞生是由于 HTTP 协议的天生缺陷,HTTP 是一种无状态的协议,简单的 Request 和 Response 一旦请求/响应结束,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪会话,即服务器

ASP.NET状态管理之五(Cookie)

Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法. 例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息. 什么是 Cookie? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递. Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息. 例如,如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间

《HttpClient 官方文档》第三章 HTTP 状态管理

通常 HTTP 被设计为无状态,面向请求/响应的协议,对于有一些逻辑相关的请求/响应交换的有状态会话没有特别的规定.正当 HTTP 协议越来越流行和被认可,越来越多之前没有打算使用它的系统,现在也开始为了应用程序而使用它.例如电子商务应用的内容传输.因此,支持 HTTP 状态管理变得非常有必要. NetScape(网景公司),曾经引领网页客户端和服务器端软件的发展,在他们的产品中基于专有的规范,提供了 HTTP 状态管理的支持.之后,NetScape 尝试通过发布规范草案来标准化这种机制.这些努

[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

原文:[Asp.Net]状态管理(Session.Application.Cache.Cookie .Viewstate.隐藏域 .查询字符串) Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了.当客户在20分钟之内没有访问服务器,会话结束,销毁session.(当然也可以在Web.config中设置缓存时间)可以在Global.aspx的Session_Start()事件处理程序中,可以初始化会话变量.在下面的实例中,名为mydata的会话状态被初始化为0:

Asp.Net的状态管理:ViewState和Cookie

简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接.而且服务器会在处理页面完毕后销毁页面对象. 应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议. Http协议是无状态的,不会记得上次和网页"发生了什么.服务器不记得上次给了浏览器什么. 对网站造成的影响:如果用户录入了一些信息,当跳转到下一

ASP.NET中的状态管理

asp.net 我们在ASP中能够通过cookie.查询字符串.应用程序.对话等轻易地解决这些问题.现在到了ASP.NET环境中,我们仍然可以使用这些功能,只是它们的种类更多了,功能也更强大了. 管理互联网网页主要有二种不同的方法:客户端和服务器端. 1.客户端的状态管理: 在客户端.服务器之间的多次请求-应答期间,服务器上不保存信息,信息将被存储在网页或用户的计算机上. A.Cookie cookie是存储在客户端文件系统的文本文件中或客户端浏览器对话的内存中的少量数据,它主要用来跟踪数据设置

PHP使用者状态管理功能的应用

使用者状态管理(session support)是 PHP 4.0 一个让大家期待已久的新功能.在 PHP 3.0 的时代,程序设计员必须使用其它人写好的函式库来实作状态管理功能,或者就干脆放弃这项功能不用算了.而状态管理功能的缺乏事实上是 PHP 3.0 最让人感到失望的地方之一.不过现在状况已经得到改变,从 PHP 4.0 的早期测试版开始,使用者状态管理便已经成为 PHP 内建的功能之一了. 你可以使用状态管理功能来管理使用者从进入网站开始一直到离开网站为止这段期间内的所有相关变量(只要使

深入理解和改进JSP/Servlet会话管理机制

js|servlet 在Web服务器端编程中,会话状态管理是一个经常必须考虑的重要问题.本文分析JSP/Servlet的会话管理机制及其所面临的问题,然后提出了一种改进的会话管理方法. 一.Servlet的会话管理机制 根据设计,HTTP是一种无状态的协议.它意味着Web应用并不了解有关同一用户以前请求的信息.维持会话状态信息的方法之一是使用Servlet或者JSP容器提供的会话跟踪功能.Servlet API规范定义了一个简单的HttpSession接口,通过它我们可以方便地实现会话跟踪. H