文档章节

Cookie

學習是一种信仰
 學習是一种信仰
发布于 2017/05/29 22:26
字数 2263
阅读 17
收藏 0

Cookie来源

早期的 Web 应用面临的最大问题之一就是如何维持状态。简言之,服务器无法知道两个请求是否来自于同一个浏览器。Cookie是当前识别用户,实现持久会话的最好方式。简单地说,cookie就是浏览器储存在用户电脑上的一小段文本文件。cookie是纯文本格式,不包含任何可执行的代码。一个Web页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,Web服务器就可以使用这些信息来识别不同的用户

Cookie的类型

会话cookie(Session cookie) :在会话结束时(浏览器关闭)会被删除,临时cookie。

setMaxAge参数为负表明是会话cookie,临时储存,不会产生cookie文件,只会存在浏览器内存中;另外cookie本身没有提供删除方法,失效的cookie会被浏览器自动从内存中删除,参数设置为0实现的就是让cookie失效。

持久化cookie(Persistent cookie):在到达失效日期时会被删除,存储在硬盘,浏览器退出计算机重启时它们仍然存在。二者唯一区别就是它们的过期时间。

如果浏览器中的cookie数量达到限制,那么cookie会被删除以为新建的cookie创建空间,具体可以参考

cookie的主要属性

name

这个显而易见,就是代表cookie的名字的意思,一个域名下绑定的cookie,name不能相同,相同的name的值会被覆盖掉。

value

这个就是每个cookie拥有的一个属性,它表示cookie的值。

对于cookie的值进行编码一直都存在一些困惑。普遍认为 cookie 的值必须经过 URL 编码,但其实这是一个谬论,尽管通常都这么做。原始规范中明确指出只有三个字符必须进行编码:分号、逗号和空格,规范中还提到可以进行 URL 编码,但并不是必须,在 RFC 中没有提及任何编码。然而,几乎所有的实现都对 cookie 的值进行了一系列的 URL 编码。对于name=value格式,通常会对name和value分别进行编码,而不对等号进行编码操作。

过期时间选项

紧跟cookie值后面的每个选项都以分号和空格分开,每个选择都指定了cookie在什么情况下应该被发送至服务器。第一个选项是过期时间(expires),指定了cookie何时不会再被发送至服务器,随后浏览器将删除该cookie。该选项的值是一个日期格式的值,例如:

Set-Cookie: name=Nicholas; expires=Sat, 02 May 2009 23:38:25 GMT

没有设置expires选项时,cookie的生命周期仅限于当前会话中,关闭浏览器意味着这次会话的结束,所以会话cookie 仅存在于浏览器打开状态之下。这就是为什么为什么当你登录一个Web应用时经常会看到一个复选框,询问你是否记住登录信息:如果你勾选了复选框,那么一个expires选项会被附加到登录cookie中。如果expires设置了一个过去的时间点,那么这个cookie会被立即删掉。

domain选项

指定了cookie将要被发送至哪个或哪些域中。默认情况下,domain会被设置为创建该cookie的页面所在的域名(默认为产生Set-Cookie响应的服务器的主机名),所以当给相同域名发送请求时该cookie会被发送至服务器。浏览器会把domain的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的cookie发送至服务器。

domain选项的值必须是发送Set-Cookie消息头的主机名的一部分,例如我不能在google.com上设置一个 cookie,因为这会产生安全问题。不合法的domain选择将直接被忽略。

path选项

另一个控制Cookie消息头发送时机的选项是path选项,和domain选项类似,path选项指定了请求的资源URL 中必须存在指定的路径时,才会发送Cookie消息头。这个比较通常是将path选项的值与请求的URL 从头开始逐字符比较完成的。如果字符匹配,则发送Cookie消息头,例如:

Set-Cookie:name=Nicholas;path=/blog

在这个例子中,path 选项值会与 /blog,/blogrool 等等相匹配;任何以 /blog 开头的选项都是合法的。需要注意的是,只有在domain选项核实完毕之后才会对path属性进行比较。path属性的默认值是发送Set-Cookie消息头所对应的URL中的path部分。

在同一应用服务器内多个应用共享cookie,设置cookie.setPath("/")

secure选项

不像其它选项,该选项只是一个标记而没有值。只有当一个请求通过SSL或HTTPS创建时,包含secure选项的cookie才能被发送至服务器。这种cookie的内容具有很高的价值,如果以纯文本形式传递很有可能被篡改,例如:

Set-Cookie: name=Nicholas; secure

事实上,这个属性并不能对客户端cookie进行加密,不能保证绝对的安全性,机密且敏感的信息绝不应该在cookie中存储或传输,因为cookie的整个机制原本都是不安全的。默认情况下,在HTTPS 链接上传输的cookie都会被自动添加上secure选项。

HTTP-Only选项

微软的IE6 SP1在cookie中引入了一个新的选项:HTTP-only,HTTP-Only背后的意思是告之浏览器该cookie绝不能通过 JavaScript的document.cookie属性访问。设计该特征意在提供一个安全措施来帮助阻止通过JavaScript发起的跨站脚本攻击 (XSS)窃取cookie的行为。

要创建一个HTTP-Only cookie,只要向你的cookie中添加一个HTTP-Only标记即可:

Set-Cookie: name=Nicholas; HttpOnly

其它特性

cookie不可跨域

domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com(必须以“.”开始)从而实现cookie跨域共享;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
 

Cookie限制条件   

cookie存在许多限制条件,来阻止cookie滥用并保护浏览器和服务器免受一些负面影响。有两种cookie限制条件:cookie的属性和 cookie的总大小。原始规范中限定每个域名下不超过20个cookie,早期的浏览器都遵循该规范,并且在IE7 中有更近一步的提升。在微软的一次更新中,他们在IE7中增加cookie的限制数量到50个,与此同时Opera限定cookie数量为30 个,Safari和Chrome对与每个域名下的cookie个数没有限制。
发向服务器的所有cookie 的最大数量(空间)仍旧维持原始规范中所指出的:4KB。所有超出该限制的cookie都会被截掉并且不会发送至服务器。

Subcookies

鉴于cookie的数量存在限制,开发者提出subcookies的观点来增加cookie的存储量。Subcookies是存储在一个cookie值中的一些name=value对,这种方式允许在单个cookie中保存多个name=value对,而不会超出浏览器cookie数量的限制。

与LocalStorage、SessionStorage的区别

localStorage是HTML5 标准中新加入的技术,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。

sessionStorage是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。

在实际开发过程中,遇到的最多的问题就是localStorage的同源策略问题。

参考链接

https://www.jianshu.com/p/1b7aa6fb81ec

https://www.jianshu.com/p/432ec6097003

http://bubkoo.com/2014/04/21/http-cookies-explained/#undefined

https://juejin.im/post/59d1f59bf265da06700b0934

© 著作权归作者所有

學習是一种信仰
粉丝 4
博文 64
码字总数 84420
作品 0
杭州
私信 提问

暂无文章

HeyUI组件库按需加载功能上线,盘点HeyUI组件库有哪些独特功能?

HeyUI组件库 如果你还不了解heyui组件库,欢迎来我们的官网或者github参观。 官网 github 当然,如果能给我们一颗✨✨✨,那是最赞的了! 按需加载 当heyui组件库的组件越来越多的时候,按需...

vvpvvp
18分钟前
3
0
Dockerfile文件详解

Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker bui...

Jeam_
31分钟前
0
0
阿里云PolarDB发布重大更新 支持Oracle等数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统...

zhaowei121
39分钟前
0
0
在数据数据探索过程中的一些常用操作

###pandas在做数据探索时,分组统计均值和中位数参考资料:http://www.cnblogs.com/nxld/p/6058591.htmlhttp://python.jobbole.com/85742/按字典重新赋值,可以直接使用pandas中的repla...

KYO4321
42分钟前
0
0
好程序员分享干货 弹性分布式数据集RDD

一、RDD定义 RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变(数据和元数据)、可分区、里面的元素可并行计算的集合。其特点在于自动容...

好程序员IT
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部