Cookie和Session的做用和工做原理

1、Cookie详解php

(1)简介html

由于HTTP协议是无状态的,即服务器不知道用户上一次作了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结账时,因为HTTP的无状态性,不经过额外的手段,服务器并不知道用户到底买了什么。为了作到这点,就须要使用到Cookie了。服务器能够设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。java

Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪储存在用户本地终端上的数据(一般通过加密)。数据库

Cookie是由服务端生成的,发送给客户端(一般是浏览器)的。Cookie老是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:跨域

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。浏览器

硬盘Cookie保存在硬盘里,有一个过时时间,除非用户手工清理或到了过时时间,硬盘Cookie不会被删除,其存在时间是长期的。因此,按存在时间,可分为非持久Cookie和持久Cookie。缓存


(2)工做原理
安全

一、建立Cookie服务器

当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行以下工做:cookie

①该用户生成一个惟一的识别码(Cookie id),建立一个Cookie对象

②默认状况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器以后被删除。若是网站但愿浏览器将该Cookie存储在磁盘上,则须要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);

③将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中。

④发送该HTTP响应报文。

二、设置存储Cookie

浏览器收到该响应报文以后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。

三、发送Cookie

当用户再次访问该网站时,浏览器首先检查全部存储的Cookies,若是某个存在该网站的Cookie(即该Cookie所声明的做用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。

四、读取Cookie

 服务器接收到用户的HTTP请求报文以后,从报文头获取到该用户的Cookie,从里面找到所须要的东西。

(3)做用

Cookie的根本做用就是在客户端存储用户访问网站的一些信息。典型的应用有:

一、记住密码,下次自动登陆。

二、购物车功能。

三、记录用户浏览数据,进行商品(广告)推荐。

(4)缺陷

①Cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。

②因为在HTTP请求中的Cookie是明文传递的,因此安全性成问题。(除非用HTTPS)

③Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的。


2、Session详解

(1)简介

Session表明服务器与浏览器的一次会话过程,这个过程是连续的,也能够时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。


Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

(2)工做原理

一、建立Session

当用户访问到一个服务器,若是服务器启用Session,服务器就要为该用户建立一个SESSION,在建立这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,若是包含了一个SESSION ID则说明以前该用户已经登录过并为此用户建立过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(若是查找不到,就有可能为他新建立一个),若是客户端请求里不包含有SESSION ID,则为该客户端建立一个SESSION并生成一个与此SESSION相关的SESSION ID。这个SESSION ID是惟一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器。 

二、使用Session

咱们知道在IE中,咱们能够在工具的Internet选项中把Cookie禁止,那么会不会出现把客户端的Cookie禁止了,那么SESSIONID就没法再用了呢?找了一些资料说明,能够有其余机制在COOKIE被禁止时仍然可以把Session id传递回服务器。

常常被使用的一种技术叫作URL重写,就是把Session id直接附加在URL路径的后面一种是做为URL路径的附加信息,表现形式为: 

http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764; 

另外一种是做为查询字符串附加在URL后面,表现形式为: 

http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时可以把Session id传递回服务器。

(3)做用

Session的根本做用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:

一、判断用户是否登陆。

二、购物车功能。


3、Cookie和Session的区别

一、存放位置不一样

Cookie保存在客户端,Session保存在服务端。

2 、存取方式的不一样

 Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 

而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。可以把Session看作是一个Java容器类。 

三、安全性(隐私策略)的不一样 

Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以致修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如帐号密码等尽可能不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以有效的保护。 

四、有效期上的不一样 

只须要设置Cookie的过时时间属性为一个很大很大的数字,Cookie就能够在浏览器保存很长时间。 因为Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过时时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

五、对服务器形成的压力不一样 

Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

六、 跨域支持上的不一样 

Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 


参考文献:

一、细说Cookie http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html#_label4

二、描述Cookie和Session的做用,区别和各自的应用范围,cookie、Session工做原理。

http://www.360doc.com/content/11/0706/15/3639038_131844581.shtml

三、深刻理解HTTP Session http://lavasoft.blog.51cto.com/62575/275589/

四、Web应用中的Session知多少?http://www.blogjava.net/ohyeah928/archive/2010/01/27/310952.html

五、Cookie和Session的区别-总结很好的文章 http://www.lai18.com/content/407204.html

六、Cookie/Session机制详解 http://blog.csdn.net/fangaoxin/article/details/6952954

七、老生常谈session,cookie的区别,安全性 http://blog.51yip.com/php/938.html

八、Session和Cookie的区别及Session的生命周期 http://blog.csdn.net/shuaishenkkk/article/details/8634917