cookie与session

以下内容转载自《session和cookie的区别》和《COOKIE安全与防护》两篇文章,感觉写的比较清楚,如有侵权,请联系本人删除~
 
一、概念理解
  首先呢,要了解session和cookie的区别先要了解以下几个概念:
  1、无状态的HTTP协议:协议,是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
  HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
  2、会话(Session)跟踪:会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
 
二、cookie
  1、 Cookie属性
    1)Cookie名称,Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。
    2)  Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。
    3)Expires,过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭后消失。
    4)  Path,一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
    5)Domain,子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com
    6)  Secure,安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用https协议连接时cookie才可以被页面访问。
    7)  HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。
  2、Cookie工作工程
  具体工作过程描述如下:
    1)Web客户端通过浏览器向 Web服务器发送连接请求 通过 HTTP 报文请求行中的 URL 打开某一 Web页面。
    2)Web服务器接收到请求后,根据用户端提供的信息产生一个 Set-Cookies Head
    3)将生成的Set-Cookies Header通过 Response Header存放在HTTP报文中回传给Web客户端,建立一次会话连接。
    4)Web客户端收到HTTP应答报文后,如果要继续已建立的这次会话,则将Cookies的内容从HTTP报文中取出,形成一个Cookies文本文件储存在客户端计算机的硬盘中或保存在客户端计算机的内存中。
    5)当Web客户端再次向Web服务器发送连接请求时,Web浏览器首先根据要访问站点的URL在本地计算机上寻找对应的 Cookies文本文件或在本地计算机的内存中寻找对应的Cookies内容。如果找到则将此Cookies内容存放在HTTP请求报文中发给Web服务器。
    6)Web服务器接收到包含Cookies内容的HTTP请求后,检索其Cookies中与用户有关的信息,并根据检索结果生成一个客户端所请求的页面应答传递给客户端 。
  3、 Cookie 特点
    1)由服务器写入,保存在本地,传输于HTTP头部
    2)Cookie由三元组【名字name,域名domain,路径path】确定,会出现重名,即cookie不唯一
    3)Cookie 存在同源策略,仅以domain和path 作为同源限制,不区分端口和协议。Cookie 的同源策略类似于Web的同源策略(sop),但比其安全性高。Web的同源策略以协议,端口,域名作为同源限制。Web同源策略的目的是为了保护用户信息的安全,防止恶意的网站窃取数据。Cookie的同源策略目的也是为了安全性。
    Domain向上通配:一个页面可以为本域和任何父域设置cookie。
    eg:  服务器写入cookie时,当页面为 http://www.bank.com ,cookie为X时:
      Ø Set-Cookie: user1=aaa; domain=.bank.com; path=/;      -------> domain不配陪  
      Ø Set-Cookie: user2=bbb; domain=www.bank.com; path=/;  -------> domain匹配
      Ø Set-Cookie: user3=ccc; domain=.www.bank.com; path=/;  ------->domian匹配
      Ø Set-Cookie: user4=ddd; domain=other.bank.com;path=/; ------->domain不匹配
 
    Path向下通配:一个页面可以为本路径和任何子路径设置cookie。
    Eg:  服务器写入cookie时,当页面为 http://www.bank.com ,path为/hello时:
      Ø Set-Cookie: user1=aaa; domain=www.bank.com; path=/;         -------> path不配陪  
      Ø Set-Cookie: user1=aaa; domain=www.bank.com; path=/hello;      -------> path配陪  
      Ø Set-Cookie: user2=bbb; domain=www.bank.com; path=/hello/world; -------> path匹配
 
 
三、Session
  Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
  1、两个问题:
    1)什么东西可以让你每次请求都把SessionId自动带到服务器呢?显然就是cookie了,如果你想为用户建立一次会话,可以在用户授权成功时给他一个唯一的cookie。当一个用户提交了表单时,浏览器会将用户的SessionId自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionId所对应的用户。试想,如果没有 SessionId,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。
    2)储存需要的信息。服务器通过SessionId作为key,读写到对应的value,这就达到了保持会话信息的目的。
  2、session的创建:
  当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。
  3、禁用cookie:
  如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。
    1)URL重写,就是把sessionId直接附加在URL路径的后面。
    2)表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
  4、Session共享:
  对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间SessionId的共享。由于域名不同(aaa.test.combbb.test.com),而SessionId又分别储存在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话。解决的方法是通过修改cookies的域名为父域名达到cookie共享目的,从而实现SessionId的共享。带来的弊端就是,子站间的cookie信息也同时被共享了。  
 
四、总结
  1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
  2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
  3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
  4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
 
 
 
 
 
 
posted @ 2020-01-04 17:47  阳光倾林  阅读(247)  评论(0编辑  收藏  举报