Cookie和Session机制详解

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不支持跨域名访问,仅在所在的域名内有效.

参考:

原文地址:https://www.cnblogs.com/truestoriesavici01/p/13214047.html