一、为什么会有cookie
首先要明白Cookie是如何产生的,是服务器端生成能够标识用户的一串数据或文本,保存在客户端,再次访问时便会携带Cookie信息,方便进行用户认证或标识。
从服务器端,发送cookie给客户端,是对应的Set-Cookie。包括了对应的cookie的名称,值,以及各个属性。从客户端发送cookie给服务器的时候,是不发送cookie的各个属性的,而只是发送对应的名称和值。
除了服务器可以设置cookie值之外,还可以通过浏览器内置的一些脚本,比如javascript,去设置对应的cookie,对应实现是操作js中的document.cookie。
二、cookie的分类
分为两种:会话cookie和持久cookie。会话cookie是仅在本次浏览器打开时有效,关闭浏览器,cookie便失效。持久cookie是有有效期的,过期了才会失效。
区分这两种cookie的方法,如果设置了Discard参数或者没有设置Expires或者Max-Age来说明过期时间的,就是一个会话cookie。
三、cookie的属性
1、cookie的域属性
该属性主要是为了告诉浏览器将cookie发给哪个站点的,如果不设置这个属性,那么cookie不属于任一站点,浏览器可以将该cookie发给所有站点,每个站点都能获取到用户信息,这是有违设计初衷,并且会泄露用户信息的。
但是,实际使用的时候,依然有web服务器的cookie机制的设计不够完善,比如如果a网站没有设计到该属性,就会出现以下现象,我访问完a网站保存了用户名和密码,或者发表了一篇博客时填写了标题titleXXX,在访问b网站时自动填充了我的用户名和密码,或者在提交文本时自动出现提示下拉框,内容是titleXXX。
2、cookie的路径属性
可以允许用户将cookie与一个站点的部分web站点关联起来,比如,如果设置了该属性,name只有在cookie中设定的路径下,才能够访问到该cookie,有效的进行了控制。
3、过期之前如果修改了密码,cookie会有什么变化?(引用V2EE论坛上别人的观点)
cookie里面放的是signature 也就是签名,但是这个签名是属于token机制的,它与时间戳等其他相关,修改完密码之后原来signiture就会失效,换成了新的token和新的signature。
用户的信息确实要验证,但是现在的验证部分要通过比对,但是大部分的请求采用很快的的方法了,通过memcache类型的数据,在nginx端就直接将要验证的信息作为索引去取cache中的内容,但是如果用户关键信息变了的话,如果还是这样的请求,会将response状态转为重新登录,然后memcache中的该用户信息就会换为新的,你去试试微信,大象笔记,利用heartbeat保持session,如果用户的签名发生改变,就会让所有的heartbeat的客户端全部重新登录,cookie失效。
------------待更新--------------