转:Cookie详解
没怎么坐过客户端相关的工作,所以写爬虫的时候,很多概念都很模糊,学习起来很困难。现在想攻坚一下,所以找了一下cookies相关的内容。
HTTP cookies,通常又称作"cookies"
早期Web开发面临的最大问题之一是如何管理状态。服务器端没有办法知道两个请求是否来自于同一个浏览器。那时的办法是在请求的页面中插入一个token,并且在下一次请求中将这个token返回(至服务器)。这就需要在form中插入一个包含token的隐藏表单域,或着在URL的qurey字符串中传递该token。这两种办法都强调手工操作并且极易出错。
cookies工作原理的基本信息在RFC2109中被规范化
cookie是什么?
一个cookie就是存储在用户主机浏览器中的一小段文本文件。
Cookies是纯文本形式,它们不包含任何可执行代码。
一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。Web服务器之后可以利用这些信息来标识用户。
通过HTTP的Set-Cookie消息头,Web服务器可以指定存储一个cookie。
Set-Cookie消息的格式如下面的字符串(中括号中的部分都是可选的)
Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]
value部分,通常是一个name=value格式的字符串。事实上有很多浏览器用自己的格式,有细微的不同。
当一个cookie存在,并且可选条件允许的话,该cookie的值会在接下来的每个请求中被发送至服务器。
cookie的值被存储在名为Cookie的HTTP消息头中,并且只包含了cookie的值,其它的选项全部被去除。
可选项只是存在于浏览器端,并不需要发给服务端。
例如: Cookie : value
如果在指定的请求中有多个cookies,那么它们会被分号和空格分开,例如:
Cookie:value1 ; value2 ; name1=value1
有效期选项(The expires option)
指定了cookie过期的时间,过期后可能会被浏览器删掉。
格式为Wdy,DD-Mon–YYYY HH:MM:SS GMT,例如:
Set-Cookie:name=Nicholas;expires=Sat, 02 May 2009 23:38:25 GMT
在没有expires选项时,cookie的寿命仅限于单一的会话中。浏览器的关闭意味这一次会话的结束,所以会话cookie只存在于浏览器保持打开的状态之下。
domain选项(The domain option)
指示cookie将要发送到哪个域或那些域中。默认情况下,domain会被设置为创建该cookie的页面所在的域名。
domain选项被用来扩展cookie值所要发送域的数量。例如:
Set-Cookie:name=Nicholas;domain=www.baidu.com
很多时候大网站存在二级域名,例如fanyi.baidu.com。cookies可能只发给对应的二级域名。
Path选项(The path option)
在请求相匹配的路径的时候,才会发送cookie
例如:
Set-Cookie:name=Nicholas;path=/blog
在这个例子中,path选项值会与/blog,/blogrool等等相匹配;任何以/blog开头的选项都是合法的。
secure选项(The secure option)
该选项只是一个标记并且没有其它的值。只有当请求是通过SSL和HTTPS创建时,才会发送。
这种cookie的内容意指具有很高的价值并且可能潜在的被破解以纯文本形式传输。例如
Set-Cookie:name=Nicholas;secure
现实中,机密且敏感的信息绝不应该在cookies中存储或传输,因为cookies的整个机制都是原本不安全的。
默认情况下,在HTTPS链接上传输的cookies都会被自动添加上secure选项。
cookie的维护和生命周期(cookie maintenance and lifecycle)
任意数量的选项都可以在单一的cookie中指定,并且这些选项可以以任何顺序存在,例如
Set-Cookie:name=Nicholas; domain=nczonline.net; path=/blog
这个cooke有四个标识符:cookie的name,domain,path,secure标记。
要想在将来改变这个cookie的值,需要发送另一个具有相同cookie name,domain,path的Set-Cookie消息头。
例如:
Set-Cooke:name=Greg; domain=nczonline.net; path=/blog
这将以一个新的值来覆盖原来cookie的值。
然而,仅仅只是改变这些选项的某一个也会创建一个完全不同的cookie,
例如:
Set-Cookie:name=Nicholas; domain=nczonline.net; path=/
在返回这个消息头后,会存在两个同时拥有“name”的不同的cookie。
如果你访问在www.nczonline.NET/blog下的一个页面,以下的消息头将被包含进来:
Cookie:name=Greg;name=Nicholas
在这个消息头中存在了两个名为“name”的cookie,path值越详细则cookie越靠前。domain-path越详细则cookie字符串越靠前。假设我在ww.nczonline.Net/blog下并且发送了另一个cookie,其设置如下:
Set-Cookie:name=Mike
那么返回的消息头现在则变为:
Cookie:name=Mike;name=Greg;name=Nicholas
由于包含“Mike”的cookie使用了域名(www.nczonline.net)作为其domain值并且以全路径(/blog)作为其path值,则它较其它两个cookie更加详细。
使用失效日期(using expiration dates)
当cookie创建时包含了失效日期,这个失效日期则关联了以name-domain-path-secure为标识的cookie。
要改变一个cookie的失效日期,必须指定同样的组合。当改变一个cookie的值时,你不必每次都设置失效日期,因为它不是cookie标识信息的组成部分。
例如:
Set-Cookie:name=Mike;expires=Sat,03 May 2025 17:44:22 GMT
现在已经设置了cookie的失效日期,所以下次我想要改变cookie的值时,我只需要使用它的名字:
Set-Cookie:name=Matt
在cookie上的失效日期并没有改变,因为cookie的标识符是相同的。实际上,只有你手工的改变cookie的失效日期,否则其失效日期不会改变。这意味着在同一个会话中,一个会话cookie可以变成一个持久化cookie(一个可以在多个会话中存在的),反之则不可。为了要将一个持久化cookie变为一个会话cookie,你必须删除这个持久化cookie,这只要设置它的失效日期为过去某个时间之后再创建一个同名的会话cookie就可以实现。
需要记得的是失效日期是以浏览器运行的电脑上的系统时间为基准进行核实的。没有任何办法来来验证这个系统时间是否和服务器的时间同步,所以当服务器时间和浏览器所处系统时间存在差异时这样的设置会出现错误。
cookie自动删除(automatic cookie removal)
cookie会被浏览器自动删除,通常存在以下几种原因:
会话cooke(Session cookie)在会话结束时(浏览器关闭)会被删除
持久化cookie(Persistent cookie)在到达失效日期时会被删除
如果浏览器中的cookie限制到达,那么cookies会被删除以为新建cookies创建空间。
对于任何这些自动删除来说,Cookie管理显得十分重要,因为这些删除都是无意识的。
Cookie限制条件(Cookie restrictions)
在cookies上存在了诸多限制条件,来阻止cookie滥用并保护浏览器和服务器免受一些负面影响。
有两种cookies的限制条件:cookies的属性和cookies的总大小。
原始的规范中限定每个域名下不超过20个cookies,早期的浏览器都遵循该规范,并且在IE7中有个更近一步的提升。
在微软的一次更新中,他们在IE7中增加cookies的限制到50个,与此同时Opera限定cookies个数为30.Safari和Chrome对与每个域名下的cookies个数没有限制。
发向服务器的所有cookies的最大数量(空间)仍旧维持原始规范中所指出的:4KB。
所有超出该限制的cookies都会被截掉并且不会发送至服务器。
Subcookies
鉴于cookie的数量限制,开发者提出的subcookies的观点来增加cookies的存储量。
Subcookies是一些存储在一个cookie的value中的一些name-value对,并且通常与以下格式类似:
name=a=b&c=d&e=f&g=h
这种方式允许在单个cookie中保存多个name-value对,而不会超过浏览器cookie的数量限制。
通过这种方式创建cookies的负面影响是,需要自定义解析方式来提取这些值,相比较而言cookies的格式会更为简单。服务器端框架已开始支持subcookies的存储。
注意:本文转自《Cookie详解》
作者:csdn 肥宝Fable
转:Cookie详解的更多相关文章
- cookie详解
一.cookie详解 (1)设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId ...
- ASP.NET 操作Cookie详解 增加,修改,删除
ASP.NET 操作Cookie详解 增加,修改,删除 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它 ...
- 网络基础 cookie详解
cookie详解 by:授客 QQ:1033553122 cookie干嘛用的? 参见文章http 会话(session)详解: 网络基础 http 会话(session)详解 cookie分类 ...
- cookie详解(含vue-cookie)
今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9Ekm0u33w 原文如下,记录到此供以 ...
- Session和Cookie详解(1)
面试常问的有关session和cookie的问题: 1.session在分布式环境下怎么解决 2.集群下如何保证session踩中 3.cookie的大小 4.服务器怎么识别一个用户的 5.sessi ...
- JavaWeb Cookie详解
代码地址如下:http://www.demodashi.com/demo/12713.html Cookie的由来 首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie.我们知道Http协 ...
- Cookie 详解以及实现一个 cookie 操作库
Cookie 详解以及实现一个 cookie 操作库 cookie 在前端有着大量的应用,但有时我们对它还是一知半解.下面来看看它的一些具体的用法 Set-Cookie 服务器通过设置响应头来设置客户 ...
- [转]Cookie详解
从事 Web 开发已有近17个月:在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感-差不多是了解一二,然而又非真切的明晰:这就使得再用的时候,总要去再搜索一番:如此颇为难受,倒不 ...
- Cookie的使用、Cookie详解、HTTP cookies 详解、获取cookie的方法、客户端获取Cookie、深入解析cookie
Cookie是指某些网站为了辨别用户身份.进行session跟踪而存储在用户本地终端上的数据(通常经过加密),比如说有些网站需要登录才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我 ...
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...
随机推荐
- 时间序列数据的定义,读取与指数平滑(Java)
应上头的要求,需要实现以下指数平滑进行资源调度负载的预测,那就是用我最喜欢的Java做一下吧. 引用<计量经济学导论>的一句话:时间序列数据区别于横截面数据的一个明显特点是,时间序列数据集 ...
- 16flask错误处理
1,A secret key is required to use CSRF 使用CSRF需要一个密钥,也就是说没有设置秘钥
- 阅源-jdk8-FunctionalInterface注解
package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indic ...
- tcp 输入 简析 转载
正常来说 TCP 收消息过程会涉及三个队列: Backlog Queue sk->sk_backlog Prequeue tp->ucopy.prequeue Receive Queue ...
- 剑指offer刷题(Tree)
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...
- 前端知识之HTML标签
1.HTML是一个标准,规定了大家怎么写网页. 2.HTML->>学标签 <标签名> --> 标记语言(HTML.XML) 3.标签分类 双标签.单标签 (1)& ...
- Spring Cloud Gateway原理
1.使用 compile 'org.springframework.cloud:spring-cloud-starter-gateway' 2.包结构 actuate中定义了一个叫GatewayCon ...
- Zabbix监控笔记
了解zabbix,有必要了聊一下监控系统相关内容 企业中常用的开源监视系统目前有 cacti.Nagios.Open-Falcon.zabbix.prometheus等 使用监控系统的目的在于 /1. ...
- 粉丝少的UP主如何赚大钱
常逛B站的小伙伴应该知道,B站官方经常会推出各类征稿活动,奖金池也非常高,少则几万,多则上百万,可以说非常受UP主们的欢迎. 图1:B站各类活动 要知道,除了少数头部UP主可能因为没(有)有(钱)看( ...
- Sound Forge批量转换音频格式,实现高效编辑音频
Sound Forge的批量处理功能可以实现批量格式转换.批量添加效果等功能,让用户可以在处理其他音频编辑任务的同时,自动完成格式转换.效果添加等重复性任务.接下来,一起来看看如何借助批处理转换器实现 ...