Cookie和Session机制详解
简介
- Cookie:通过客户端记录消息确定用户身份.
- Session:通过服务器端记录消息确定用户身份.
Cookie机制
流程:
- 用户访问网站时,会提供个人消息.
- 服务器向客户端回传消息(存放在响应头中),包含Set-Cookie,用来指示需要设置Cookie,客户端收到后保存对应的Cookie.
- 此后,客户端向服务器发送请求时,会把相应的Cookie再次发回至服务器(放在HTTP请求头中).
- 服务器在收到客户端的请求时,通过分析请求头的Cookie可以得到客户端的信息,从而进行会话跟踪.
组成
- Name/Value:设置Cookie的名称及其对应的值.
- Expires属性:设置Cookie的生存期.两种:会话性和持久性.会话性:用户关闭浏览器时失效.持久性:保存在硬盘中.
- Path属性:定义Web站点可以访问该Cookie的目录.
- Domain属性:指定可以访问该Cookie的Web站点或域.
- Secure属性.指定是否使用HTTPS安全协议发送Cookie.
- HTTPOnly属性:防止客户端脚本通过document.cookie属性访问Cookie,保证Cookie不被跨站脚本篡改.
Cookie作用
- HTTP协议是无状态的,一次连接断开后,再次进行数据交换需要建立新的连接.
- 为了跟踪会话,网站采用Cookie跟踪会话.
Cookie的不可跨域名性
Cookie在客户端是由浏览器进行管理的,浏览器保证网站只能操作自己对应的Cookie而不会操作其他网站的Cookie,从而保证用户的隐私.
Cookie的有效期
- 若有效期为正数,则表示该Cookie在指定的时间之后自动失效.
- 若有效期为负,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie将失效.此为临时Cookie,不会被持久化.
- 若有效期为零,则表示删除该Cookie.
Cookie的修改和删除
Cookie不提供修改和删除.
要修改某个Cookie时,只需新建一个同名的Cookie,并添加到response中覆盖原来的Cookie.
若要删除一个Cookie时,需要新建一个同名Cookie,并设置其有效期为0.
Cookie的安全属性
HTTP是无状态的,也是不安全的.所有的数据不经过加密就直接在网络上传播.
可以设置Cookie的secure为true,使得浏览器只在HTTPS和SSL等安全协议中传输此类Cookie.
Session机制
Session是服务器端使用的一种记录客户端状态的机制.
Session称为会话,指的是客户端与服务器之间一系列交互的动作.
流程:
- 客户端访问服务器端.
- 服务器端根据客户端的消息创建对应的Session,保存在服务器端,并为这个Session生成唯一的Session id.
- 此后客户端访问服务器端时,通过携带Session id,服务器端可以用来获取已创建的Session.
Session的生命周期
Session生成后,只要用户继续访问,服务器将更新Session的最后访问时间,并维护该Session.用户每次访问服务器一次,无论是否读取Session,服务器认为该用户的Session活跃了一次.
Session的有效期
为了防止内存溢出,服务器把长时间内没有活跃的Session从内存删除.
若超过超过时间没访问过服务器,Session会自动失效.
Session对浏览器的要求
服务器向客户端发送一个JSESSIONID的Cookie,其值为Session id,Session根据该Cookie来识别是否为同一个用户.
不同浏览器访问服务器时,会生成不同的Session.若是浏览器打开的新窗口,子窗口会共享父窗口的Cookie,共享一个Session.
URL地址重写
对于客户端不支持Cookie,URL地址重写是将用户的Session id重写到URL地址中.服务器能够解析重写后的URL获取Session id.
若客户端支持Cookie,生成原URL地址.
若客户端不支持Cookie,传回重写后的带有jsessionid字符串的地址.
对于不支持Cookie,还有一个使用Session的技术是表单隐藏字段.服务器自动修改表单,添加一个隐藏字段,以便表单提交时能够把session id传递回服务器.
注:
关闭浏览器不会导致Session消失.
大部分Session机制都会使用会话Cookie来保存Session id,而关闭浏览器后这个Session id就会消失,再次连接服务器无法找到原来的Session.
若将设置的Cookie保存下来,再次打开浏览器时带上原来的Session id,则仍然可以找到原来的Session.
由于Session不会被删除,所有服务器为Session设置失效时间,若使用时间间隔超过失效时间,则删除Session以节省存储空间.
Cookie与Session的关系
- 存取方式不同:
- Cookie只保存ASCII字符串,其他数据类型需要先进行编码.
- Session能够存取任何数据类型的数据.相当于一个Java容器.
- 隐私策略不同:
- Cookie保存在客户端中,对客户端可见,客户端的程序可以查看并修改Cookie中的内容.
- Session保存在服务器端,对客户端是透明的,不存在信息泄露的发现.
- 有效期不同:
- 需要持久保存用户的消息,可以通过设置Cookie的过期时间为很大的数值.
- Session依赖于JSESSIONID的Cookie,其过期时间默认为-1,则关闭浏览器该Session就失效.且若设置Session的超时时间过长,服务器存储的Session很多,容易导致内存溢出.
- 服务器压力不同:
- Session保存在服务器端中.一个用户产生一个Session.若访问的用户很多,产生大量Session,消耗服务器的内存.
- Cookie保存在客户端中,不占用服务器的资源.
- 跨域支持不同:
- Cookie支持跨域名访问,通过设置domain属性,所有同一后缀的域名都能够访问该Cookie.
- Session不支持跨域名访问,仅在所在的域名内有效.
参考: