1、概念理解:html
首先cookie是服务端识别客户的惟一标识的依据,客户在访问网站时候,服务端为了记住这个客户,会在服务端按照它的规则制做一个cookie数据,会将这个cookie数据保留在服务端一段时间,同时会给客户的一份它本身保留,这样就无需每次都要登陆来认证本身了。 跨域
先来了解几个概念。浏览器
一、无状态的HTTP协议:安全
协议是指计算机通讯网络中两台计算机之间进行通讯所必须共同遵照的规定或规则,超文本传输协议(HTTP)是一种通讯协议,它容许将超文本标记语言(HTML)文档从Web服务器服务器
传送到客户端的浏览器。cookie
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据须要创建新的链接。这
就意味着服务器没法从链接上跟踪会话。网络
二、会话(Session)跟踪:session
会话,指用户登陆网站后的一系列动做,好比浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中经常使用的技术,用来跟踪用户的整个会话。经常使用的会话跟踪技术dom
是Cookie与Session。Cookie经过在客户端记录信息肯定用户身份,Session经过在服务器端记录信息肯定
2、Cookie
因为HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。服务器要想识别每一个客户端,怎么办,那就给每一个访问个人用户的客户的一个通行证,这样服务器就能从通行证上确认客户身份了,这个通行证就是cookie的工做原理。
ide
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。
一、cookie的内容主要包括:名字,值,过时时间,路径和域。路径与域一块儿构成cookie的做用范围。
#Name 和 Value 属性由程序设定,默认值都是空引用。
#Domain属性的默认值为当前URL的域名部分,无论发出这个cookie的页面在哪一个目录下的。
#Path属性的默认值是根目录,即 ”/” ,无论发出这个cookie的页面在哪一个目录下的。能够由程序设置为必定的路径来进一步限制此cookie的做用范围。
#Expires 属性,这个属性设置此Cookie 的过时日期和时间。
二、Path和Domain属性
--path: 若是http://www.china.com/test/index.html 创建了一个cookie,那么在http://www.china.com/test/目录里的全部页面,以及该目录下面任何子目录里 的页面均可以访问这个cookie。这就是说,在http://www.china.com/test/test2/test3 里的任何页面均可以访问http://www.china.com/test/index.html 创建的cookie。可是,若是http://www.china.com/test/ 须要访问http://www.china.com/test/index.html设置的cookes,该怎么办? 这时,咱们要把cookies的path属性设置成“/”。在指定路径的时候,凡是来自同一服务器,URL里有相同路径的全部WEB页面均可以共享cookies。 --Domain: 好比: http://www.baidu.com/xxx/login.aspx 页面中发出一个cookie,Domain属性缺省就是www.baidu.com ,能够由程序设置此属性为须要的值。 值是域名,好比www.china.com。这是对path路径属性的一个延伸。若是咱们想让 www.china.com可以访问bbs.china.com设置的cookies,该怎么办? 咱们能够把 domain属性设置成“china.com”, 并把path属性设置成“/”。 3、会话Cookie和持久Cookie 若不设置过时时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie通常不存储在 硬盘上而是保存在内存里,固然这种行为并非规范规定的。 若设置了过时时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过时时间。存储在硬盘上的cookie能够在浏览器的不一样进程间共享。 这种称为持久Cookie。
Cookie具备不可跨域名性
就是说,浏览器访问百度不会带上谷歌的cookie。
三. Session
Session是另外一种记录客户状态的机制,不一样的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录
在服务器上。这就是Session。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。
每一个用户访问服务器都会创建一个session,那服务器是怎么标识用户的惟一身份呢?事实上,用户与服务器创建链接的同时,服务器会自动为其分配一个SessionId。
①、咱们须要知道:
1)SessionId的重要性:
什么东西可让你每次请求都把SessionId自动带到服务器呢?显然就是cookie了,若是你想为用户创建一次会话,能够在用户受权成功时给他一个惟一的cookie。当一个用户提交了表单时,浏览器会将用户的SessionId自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionId所对应的用户。试想,若是没有 SessionId,当有两个用户同时进行注册时,服务器怎样才能知道究竟是哪一个用户提交了哪一个表单呢。
2)储存须要的信息。服务器经过SessionId做为key,读写到对应的value,这就达到了保持会话信息的目的。
②、session的建立:
当程序须要为某个客户端的请求建立一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,若是已包含则说明之前已经为此客户端建立过session,服务器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),若是客户端请求不包含sessionId,则为此客户端建立一个session而且生成一个与此session相关联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。
③、禁用cookie和session共享
禁用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> Session共享: 对于多网站(同一父域不一样子域)单服务器,咱们须要解决的就是来自不一样网站之间SessionId的共享。因为域名不一样(aaa.test.com和bbb.test.com),而SessionId又分别储存在各自的cookie中,所以服务器会认为对于两个子站的访问,是来自不一样的会话。解决的方法是经过修改cookies的域名为父域名达到cookie共享的目的,从而实现SessionId的共享。带来的弊端就是,子站间的cookie信息也同时被共享了。
4、总结:
一、咱们须要知道cookie在客户端,session在服务端,cookie的产生是在服务端产生的
二、cookie只是一个通行证,但并非安全的,任何安全的校验必需要在服务端上完成,cookie只是存在客户端上面的一个惟一标识它且由服务端定制的信息,本地能够改,可是无论怎么改,最后仍是须要把它拿上发送给服务端进行匹配校验
三、session和cookie的存储都存在时效性,这是颇有必要的
四、单个cookie保存的数据不能超过4kb,不少浏览器都限制了一个站点最多保存20个cookie
五、不论是cookie仍是session,都是创建在安全性的大前提下,session中不只仅有cookie的信息,同时会有该用户的相关重要且安全的信息存储,因此session是在服务器的,而cookie只是服务器将一些不重要的信息拿出来丢给客户的存在,以备之后快速匹配校验用。