http中的cookie和session概念

1  背景

HTTP协议本身是无状态的,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息;

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

 

 

2  cookie机制

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。

而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在HTTP请求头上发送给服务器。

 

 

组成

cookie的内容主要包括:name=value即键值对,expires 和 Max-Age,Domain和Path,secure和HttpOnly。

除了键值对,其他属性通常是浏览器用来判断如何对待cookie,何时删除、屏蔽或者如何发送name-value对给Server,这些Cookie属性是不会被浏览器发送回给Server的。

 

a) Domain and Path

作用:定义Cookie的生效作用域,只有当域名和路径同时满足的时候,浏览器才会将Cookie发送给Server。

b) Expires and Max-Age

作用:设置浏览器何时删除Cookie

Expires的规定格式是:“Wdy, DD-Mon-YYYY HH:MM:SS GMT”。

相对于Expires的精准的时间设置,在RFC 2965中规范提供了一个替代方案:Max-Age:seconds,来设置cookie在设置后多长秒后失效。

C) Secure and HttpOnly

作用:设置Cookie的安全属性

特质:Secure和HttpOnly都是没有value字段的。

Secure字段告诉浏览器在https通道时,对Cookie进行安全加密,这样即时有黑客监听也无法获取cookie内容。

HttpOnly字段告诉浏览器,只有在HTTP协议下使用,对浏览器的脚本不可见,所以跨站脚本攻击时也不会被窃取。

 

 

交互流程

Step1.客户端发起http请求到Server

GET /index.php HTTP/1.1

Host: www.webryan.net

(这里是省去了User-Agent,Accept等字段)

 

Step2. 服务器返回http response,其中可以包含Cookie设置

HTTP/1.1 200 OK

Content-type: text/html

Set-Cookie: name=value

Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

(content of page)

 

Step3. 后续访问webryan.net的相关页面

GET /spec.html HTTP/1.1

Host: www.webryan.net

Cookie: name=value; name2=value2

Accept: */*

 

 

用途

a.会话管理

1.记录用户的登录状态是cookie最常用的用途。通常web服务器会在用户登录成功后下发一个签名来标记session的有效性,这样免去了用户多次认证和登录网站。

2.记录用户的访问状态,例如导航,用户的注册流程等。

 

b.个性化信息

1.Cookie也经常用来记忆用户相关的信息,以方便用户在使用和自己相关的站点服务。例如:ptlogin会记忆上一次登录的用户的QQ号码,这样在下次登录的时候会默认填写好这个QQ号码。

2.Cookie也被用来记忆用户自定义的一些功能。用户在设置自定义特征的时候,仅仅是保存在用户的浏览器中,在下一次访问的时候服务器会根据用户本地的cookie来表现用户的设置。例如google将搜索设置(使用语言、每页的条数,以及打开搜索结果的方式等等)保存在一个COOKIE里。

 

c.记录用户的行为

最典型的是公司的TCSS系统。它使用Cookie来记录用户的点击流和某个产品或商业行为的操作率和流失率。当然功能可以通过IP或http header中的referrer实现,但是Cookie更精准一些。

 

 

类别

a.Session Cookie

这个类型的cookie只在会话期间内有效,即当关闭浏览器的时候,它会被浏览器删除。设置session cookie的办法是:在创建cookie不设置Expires即可。

 

b.Persistent Cookie

当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。

 

c.Secure cookie

安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。这样做大大的降低的cookie内容直接暴露在黑客面前及被盗取的概率。

 

d.HttpOnly Cookie

设置成httponly的cookie只能在http(https)请求上传递。也就是说httponly cookie对客户端脚本语言(javascript)无效,从而避免了跨站攻击时JS偷取cookie的情况。当你使用javascript在设置同样名字的cookie时,只有原来的httponly值会传送到服务器。

 

e.3rd-party cookie

第三方cookie则是种植在不同于浏览器地址栏的域名下。例如:用户访问a.com时,在ad.google.com设置了个cookie,在访问b.com的时候,也在ad.google.com设置了一个cookie。这种场景经常出现在google adsense,阿里妈妈之类的广告服务商。广告商就可以采集用户的一些习惯和访问历史。

 

 

 

 

3  session机制

Session代表服务器与浏览器的一次会话过程,存放在服务器端的内存中,浏览器得到的只是SessionID;

服务器使用一种类似于hash table的结构来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session id,如果已包含则说明已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

 

session因为请求(request对象)而产生,同一个会话中多个request共享session对象,可以直接从请求中获取到session对象。

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。

当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:

Cookie:JSESSIONID = 客户端第一次拿到的session ID,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。

 

Session删除的时间是:

1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间;

2)程序调用HttpSession.invalidate();

3)服务器关闭或服务停止。

 

 

Session id的保存方式

保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。

 

URL重写

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为

http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764

另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764

 

表单隐藏

服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器,目前很少使用。

 

 

 

参考资料

http://www.2cto.com/kf/201206/135471.html

http://lavasoft.blog.51cto.com/62575/275589/

http://www.webryan.net/2011/08/wiki-of-http-cookie/

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。