转:Cookie详解

2023-11-15

没怎么坐过客户端相关的工作,所以写爬虫的时候,很多概念都很模糊,学习起来很困难。现在想攻坚一下,所以找了一下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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转:Cookie详解 的相关文章

随机推荐

  • 工厂三兄弟之工厂方法模式(四)

    5 重载的工厂方法 Sunny公司开发人员通过进一步分析 发现可以通过多种方式来初始化日志记录器 例如可以为各种日志记录器提供默认实现 还可以为数据库日志记录器提供数据库连接字符串 为文件日志记录器提供文件路径 也可以将参数封装在一个Obj
  • Puppeteer 安装与注意事项 《一》

    Puppeteer 安装与注意事项 1 安装node js 在使用puppeteer的时候 它一些低版本的node是不支持的 作者推荐使用8以上的版本 否则node在后面使用puppeteer的时候会 抛出 SyntaxError Unex
  • 从外部验证安全密码存储

    许多网站 包括 Adobe Yahoo LinkedIn Gawker等大型网站 不安全地存储用户密码 可以是纯文本格式的 也可以是加密的 可逆的 格式 或者是使用残破或蛮力的哈希函数 许多网站的密码存储机制仍然很差 所以呢 好吧 如果数据
  • js生成柱状图

  • 内存泄露的检测方法

    本文来自http blog csdn net lijun84 引用必须注明出处 在谈及内存泄漏时 对于没有太多经验的新人来说总是很头疼的一件事 因为如果项目早期没有将其纳入代码框架 后期部署上线之后 仅从进程 crash 的 dump 很难
  • openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句

    文章目录 openGauss学习笔记 36 openGauss 高级数据管理 TRUNCATE TABLE语句 36 1 语法格式 36 2 参数说明 36 3 示例 openGauss学习笔记 36 openGauss 高级数据管理 TR
  • Docker部署Emqx并配置ssl支持微信小程序

    1 端口介绍 1883 MQTT 协议端口 8084 MQTT SSL 端口 8083 MQTT WebSocket 端口 8080 HTTP API 端口 18083 Dashboard 管理控制台端口 2 拉取镜像 docker pul
  • 算法与数据结构—LeetCode刷题笔记

    算法刷题笔记 一 动态规划 53 最大子序和 300 最长上升子序列 70 爬楼梯 242 有效的字母异位词 463 岛屿的周长 文章与视频资源多平台更新 微信公众号 知乎 B站 头条 AI研习图书馆 一 动态规划 53 最大子序和 典型的
  • js执行时序 宏任务和微任务

    宏任务一般是 包括整体代码script setTimeout setInterval I O UI render 微任务主要是 Promise Object observe MutationObserver process nextTick
  • 【MySQL高性能】MyCat 2.分片策略以及原理分析

    简介 数据库分片可以把他理解成分库 将一张表拆分到多个数据库中 通常是在表数据大的情况进行拆分 根据InnerDB索引原理 主键索引类型bigint计算得出一张表达到2千万就需要进行拆分了 当然也需要提前做好拆分 数据量大查询效率会慢 阿里
  • android kernel devices睡眠唤醒调试

    主要是在kernel添加关键log 获取有用信息 可以调试suspend resume earlysuspend lateresume等方面的问题 如哪一过程时间过长 跟踪log才可以很好定位问题 解决问题 1 early suspend
  • PermissionError: [WinError 5] 拒绝访问

    使用Pycharm运行时 报错 PermissionError WinError 5 拒绝访问 但是使用终端 Terminal 运行就没有问题 尝试方案 三步解决python PermissionError WinError 5 拒绝访问的
  • vue 报错:Invalid prop: type check failed for prop “xxx“. Expected String with value “1“,Number...

    期望的是String类型 但是传的值是Number 类型 如果你传的是number类型的你需要先转化为字符串就可以了 改成
  • python 爬虫刷浏览量(单线程)---仅供学习目的,切莫有其他想法

    重要的事情说三遍 仅供学习使用 若有其他想法 请出门右转 仅供学习使用 若有其他想法 请出门右转 仅供学习使用 若有其他想法 请出门右转 准备 简单的网站浏览量无非就是访问次数 那么一直按F5就可以 做得比较好的网站会根据 ip 计算浏览量
  • (无需编译)使用官方prebuilt文件在win10下配置caffe for python

    网上给出的caffe安装教程基本上需要自己编译 我在编译的过程中遇到很多问题 弄了很久也没有配置好 然而官方给出了prebuilt的版本 网址 BVLC caffe at windows 之前看到过prebuilt版本但一直不知道怎么使用
  • Linux系统调用--fcntl函数详解

    Linux系统调用 fcntl函数详解 2007 11 06 15 09 分类 ARM Linux应用程序 今天在看 Linux设备驱动程序 第3版 碰到了fcntl系统调用 以前没接触过 在网上查到了这份资料 转载自 企鹅乐园 雅虎群组
  • arcgis10之获取面要素中心点坐标

    第一步 获取中心的文件 第二步 新建两个存储中心点做坐标的字段 第三步 计算要要素中心的xy坐标 同理 计算中心点Y坐标即可
  • 定义表单规则(判断两次密码输入是否一致)

    主要代码 required true validator validateRepassword trigger change export default name form data var validateRepassword rule
  • 微信小程序入门-随机人脸生成

    微信小程序入门 随机人脸生成 开发背景 工具准备 微信小程序开发过程 开发背景 this person does not exist 这个网站起源于英伟达公司研究人员们打造的AI机器人 其能够生成随机且极为逼真的人脸图像 而实际上这些人脸并
  • 转:Cookie详解

    没怎么坐过客户端相关的工作 所以写爬虫的时候 很多概念都很模糊 学习起来很困难 现在想攻坚一下 所以找了一下cookies相关的内容 HTTP cookies 通常又称作 cookies 早期Web开发面临的最大问题之一是如何管理状态 服务