HTTP之cookie基础学习

目录

Cookie

什么是Cookie

Cookie分类

Cookie版本

Cookie工作原理

Cookie详解

创建cookie

cookie编码

cookie过期时间选项

Cookie流程

Cookie使用

会话管理

个性化信息

记录用户的行为

Cookie属性

domain选项

path选项

secure选项

cookie使用失效日期

httponly

cookie自动删除

Cookie的缺陷

HTTP Cookie总结

HTTP Session工作流程总结

传输安全

Session和Cookie的区别

报文分类与格式

HTTP响应报文

状态行(Status-Line)

响应头部(Response Header Fields)

消息体(Message Body)

Cookie

什么是Cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

Cookie分类

会话 Cookie会话 Cookie 是临时 Cookie,当前会话结束(浏览器退出)时 Cookie 会被删除。会话 Cookie 和持久 Cookie 的区别在于过期时间,如果设置了 Discard 参数(Cookie 版本1)或者没有设置 Expires(Cookie 版本 0)或 Max-Age(Cookie 版本1)设置过期时间,则此 Cookie 为会话 Cookie。

持久 Cookie持久 Cookie 会存储在用户的硬盘上,浏览器(客户端)退出,然后重新启动后 Cookie 仍然存在。

Cookie版本

Cookie 有两个版本,一个是版本 0(Netscape Cookies)和版本 1(RFC 2965),目前大多数服务器使用的 Cookie 0。

Cookie工作原理

Cookie 就像服务器给用户贴的标签,用户访问一个 web 站点的时候,服务器就可以通过这个标签来识别是哪一个用户。Cookie 中包含了一个有名字=值(name=value)这样的信息构成的任意列表,并通过 Set-Cookie 或 Set-Cookie2 Http 响应(扩展)的 header 来设置标签。

cooke 可以包含任意信息,但他们通常都只包含一个服务器为了进行追踪而产生的独特的识别码。浏览器会记住从服务器返回的 Set-Cookie 或 Set-Cookie2 header 中的 Cookie 内容,并将 Cookie 集存储在浏览器的 Cookie 数据库中。将来用户访问统一站点时,浏览器会选中那个服务器贴到用户上的那些 Cookie,并请求的 header 中将起传给服务器。

Cookie详解

创建cookie

Web 服务器通过发送一个称为 Set-Cookie 的 HTTP 消息头来创建一个 cookie,Set-Cookie 消息头是一个字符串,其格式如下(中括号中的部分是可选的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

消息头的第一部分,value 部分,通常是一个 name=value 格式的字符串。事实上,这种格式是原始规范中指定的格式,但是浏览器并不会对 cookie 值按照此格式来验证。实际上,你可以指定一个不含等号的字符串,它同样会被存储。然而,最常用的使用方式是按照 name=value 格式来指定 cookie 的值(大多数接口只支持该格式)。

当存在一个 cookie,并允许设置可选项,该 cookie 的值会在随后的每次请求中被发送至服务器,cookie 的值被存储在名为 Cookie 的 HTTP 消息头中,并且只包含了 cookie 的值,忽略全部设置选项。例如:

Cookie: value

通过 Set-Cookie 指定的可选项只会在浏览器端使用,而不会被发送至服务器端。发送至服务器的 cookie 的值与通过 Set-Cookie 指定的值完全一样,不会有进一步的解析或转码操作。如果请求中包含多个 cookie,它们将会被分号和空格分开,例如:

Cookie: value1; value2; name1=value1

服务器端框架通常包含解析 cookie 的方法,可以通过编程的方式获取 cookie 的值。

cookie编码

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

cookie过期时间选项

紧跟 cookie 值后面的每个选项都以分号和空格分开,每个选择都指定了 cookie 在什么情况下应该被发送至服务器。第一个选项是过期时间(expires),指定了 cookie 何时不会再被发送至服务器,随后浏览器将删除该 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 仅存在于浏览器打开状态之下。这就是为什么为什么当你登录一个 Web 应用时经常会看到一个复选框,询问你是否记住登录信息:如果你勾选了复选框,那么一个 expires 选项会被附加到登录 cookie 中。如果 expires 设置了一个过去的时间点,那么这个 cookie 会被立即删掉。

Cookie流程

大部分 web 网站都会使用到 cookie,使用它的基本流程可以概括为 3 步,浏览器向服务器请求一个从未请求过的 web 页面:

GET /index.html HTTP/1.1Host: www.haicoder.net

...

浏览器会在接下来的 http 请求的 header 中把以上 cookie 原样返回给服务器:

HTTP/1.0 200 OKContent-type: text/htmlSet-Cookie: theme=lightSet-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2020 10:18:14 GMT

...

服务器返回浏览器此页面,并在返回 http 包的 header 中设置 set-cookie 属性:

GET /spec.html HTTP/1.1Host: www.haicoder.netCookie: theme=light; sessionToken=abc123

上面示例设置了两个 cookies: 第一个是 theme,由于没有设置它的 Expires 或 Max-Age 属性,所以是个 session cookie,它会在浏览器关闭时直接被删除掉。 第二个是 SessionToken,它有过期时间,所以只会在指定的过期时间后才会被删除(也可手动删除)。

浏览器访问时,会把上一步的 cookies 设置在 header 中原样返回给服务器,当然不需要再指定 cookie 的其它属性,只需要把 key-value 返回即可。服务器根据设置的 cookies 就能知道标识这个客户,把无状态的 HTTP 请求变成了有状态的请求。

浏览器的 Cookie 头部信息如下:

Cookie使用

会话管理

  1. 记录用户的登录状态是 cookie 最常用的用途。通常 web 服务器会在用户登录成功后下发一个签名来标记 session 的有效性,这样免去了用户多次认证和登录网站。
  2. 记录用户的访问状态,例如导航啊,用户的注册流程啊。

个性化信息

  1. Cookie 也经常用来记忆用户相关的信息,以方便用户在使用和自己相关的站点服务。例如:ptlogin 会记忆上一次登录的用户的 QQ 号码,这样在下次登录的时候会默认填写好这个 QQ 号码。
  2. Cookie 也被用来记忆用户自定义的一些功能。用户在设置自定义特征的时候,仅仅是保存在用户的浏览器中,在下一次访问的时候服务器会根据用户本地的 cookie 来表现用户的设置。例如 google 将搜索设置(使用语言、每页的条数,以及打开搜索结果的方式等等)保存在一个 COOKIE 里。

记录用户的行为

最典型的是公司的 TCSS 系统。它使用 Cookie 来记录用户的点击流和某个产品或商业行为的操作率和流失率。当然功能可以通过 IP 或 http header 中的 referrer 实现,但是 Cookie 更精准一些。

Cookie属性

一般 Cookie 所具有的属性,包括:

domain选项

domain,指定了 cookie 将要被发送至哪个或哪些域中。默认情况下,domain 会被设置为创建该 cookie 的页面所在的域名,所以当给相同域名发送请求时该 cookie 会被发送至服务器。domain 选项可用来扩充 cookie 可发送域的数量,例如:

Set-Cookie: name=Nicholas; domain=haicoder.net

像 Yahoo! 这种大型网站,都会有许多 name.yahoo.com 形式的站点(例如:my.yahoo.com, finance.yahoo.com 等等)。将一个 cookie 的 domain 选项设置为 yahoo.com,就可以将该 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,/blogtool 等等相匹配;任何以 /blog 开头的选项都是合法的。需要注意的是,只有在 domain 选项核实完毕之后才会对 path 属性进行比较。path 属性的默认值是发送 Set-Cookie 消息头所对应的 URL 中的 path 部分。

secure选项

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

Set-Cookie: name=Nicholas; secure

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

cookie使用失效日期

当 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 就可以实现。

需要记得的是失效日期是以浏览器运行的电脑上的系统时间为基准进行核实的。没有任何办法来来验证这个系统时间是否和服务器的时间同步,所以当服务器时间和浏览器所处系统时间存在差异时这样的设置会出现错误。

httponly

表示此 Cookie 必须用于 http 或 https 传输。这意味着,浏览器脚本,比如 javascript 中,是不允许访问操作此 Cookie 的。

cookie自动删除

cookie 会被浏览器自动删除,通常存在以下几种原因:

  1. 会话 cooke (Session cookie) 在会话结束时(浏览器关闭)会被删除。
  2. 持久化 cookie(Persistent cookie)在到达失效日期时会被删除。
  3. 如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。

Cookie的缺陷

  • cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量。
  • 由于在 HTTP 请求中的 cookie 是明文传递的,所以安全性成问题。(除非用 HTTPS)
  • Cookie 的大小限制在 4KB 左右。对于复杂的存储需求来说是不够用的。

HTTP Cookie总结

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

HTTP Session工作流程总结

  • 浏览器第一次请求网站, 服务端生成 Session ID。
  • 把生成的 Session ID 保存到服务端存储中。
  • 把生成的 Session ID 返回给浏览器,通过 set-cookie。
  • 浏览器收到 Session ID, 在下一次发送请求时就会带上这个 Session ID。
  • 服务端收到浏览器发来的 Session ID,从 Session 存储中找到用户状态数据,会话建立。
  • 此后的请求都会交换这个 Session ID,进行有状态的会话。

传输安全

最后再聊聊传输安全,有一种叫做 Session ID 劫持的,假如 Session ID 是基于 HTTP 协议传输的,因为是明文传输,那么它就可能被中间的路由器劫持。 攻击者得到 Session ID 后,把它带到自己的请求中,就能够进入你的账户。

所以一些 Web 框架还提供了 Session 的一些安全保护,比如间隔时间内动态刷新 Session ID,加上 Token 等

Session和Cookie的区别

  1. cookie 数据存放在客户端,session 数据放在服务器上。
  2. cookie 不是很安全,别人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗考虑到安全应当使用 session。
  3. session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 Cookie。
  4. 单个 Cookie 保存的数据长度不能超过 4K,很多浏览器都限制一个网址最多保存 20 个 cookie。
  5. 将登陆信息等重要信息存放为 SESSION,其他信息如果需要保留,可以放在 COOKIE 中。
  6. Session 的运行依赖 Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。

报文分类与格式

所有的 HTTP 报文都可以分为两类:请求报文和响应报文。请求和响应报文的基本报文结构相同。请求报文的格式:

<method> <request-URL> <version>

<headers>

<entity-body>

 

响应报文的格式(注意,只有起始行的语法有所不同):

<version> <status> <reason-phrase>

<headers>

<entity-body>

HTTP响应报文

一个 http 响应报文也由四个部分组成:

  1. 状态行(Status-Line)
  2. 响应头部(Response Header Fields)
  3. 回车换行(CRLF)
  4. 消息体(Message Body)

状态行(Status-Line)

HTTP/1.1 200 OK

上面是一个典型的 http 响应状态行,我们可以看到也是由三部分组成的:

  1. http 协议版本
  2. 状态码(Status Code)
  3. 状态码的文本描述(Reason-Phrase)

响应头部(Response Header Fields)

和请求头部类似,就是两者之间有一些不同的头部字段。

消息体(Message Body)

返回给客户端的具体消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港大学余涛组推出开源XLANG Agent!支持三种Agent模式

作者 |小戏、ZenMoore 一个新的未来又逐渐开始从理论走向现实走到我们身边了。 语言的意义在于使用&#xff0c;而从 ChatGPT 以来这些大规模语言模型的意义&#xff0c;也必然绝不止于 Chat&#xff0c;在四个月前&#xff0c;我们介绍了清华大学关于工具学习的综述《清华发布…

Python-OpenCV中的图像处理-图像特征

Python-OpenCV中的图像处理-图像特征 图像特征Harris角点检测亚像素级精度的角点检测Shi-Tomasi角点检测SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 图像特征 特征理解特征检测特征描述 Harris角点检测 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭车仓储解决方案在电子商务行业中的应用

随着现代物流&#xff0c;尤其是智能化物流的飞速发展&#xff0c;河北沃克金属制品有限公司看到了智能物流领域背后的巨大价值和市场空间&#xff0c;深知物流与供应链对企业发展的重要性。于是&#xff0c;引进了先进的高科技智能技术—HEGERLS四向穿梭车技术&#xff0c;并迅…

自制手写机器人

写字机器人模拟在画图板上写字效果 写了一套写字机器人代码&#xff0c;有多种字体可供选择&#xff0c;需要的朋友私信获取代码和软件

Spring5学习笔记— 工厂高级特性

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

创建型模式-原型模式

文章目录 一、原型模式1. 概述2. 结构3. 实现4. 案例1.5 使用场景1.6 扩展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型模式包含如下角色&#xff1a; …

使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功 1. Linux(centos8…

【Vue-Router】路由入门

路由&#xff08;Routing&#xff09;是指确定网站或应用程序中特定页面的方式。在Web开发中&#xff0c;路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 npm init vuelatest //或者 npm init vitelatest安装依赖和路由 npm install npm instal…

ATF BL1 UFS初始化简单分析

ATF BL1 UFS初始化分析 1 ATF的下载链接2 ATF BL1 UFS 初始化简易流程图3 ATF BL1 ufs初始化简单过程分析3.1 调用过程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960为例来介绍&#xff0c;简单介绍在ATF BL1阶段的初始化处理。 1 ATF的下载链接 https:/…

蓝帽杯 取证2022

网站取证 网站取证_1 下载附件 并解压 得到了一个文件以及一个压缩包 解压压缩包 用火绒查病毒 发现后门 打开文件路径之后 发现了一句话木马 解出flag 网站取证_2 让找数据库链接的明文密码 打开www文件找找 查看数据库配置文件/application/database.php&#xff08;CodeI…

截止到目前全量主体总数有多少?

企业主体类型 企业主体类型有很多种&#xff0c;一般我们会分为公司&#xff08;有限责任&#xff09;、合伙企业、个人独资企业、个体经营户这些类别。 今天我们按照企业&#xff0c;个体&#xff0c;组织的分类方式来看各个主体的总数。 企业&#xff1a;统一社会信用代码…

ARTS 挑战打卡的第7天 --- Ubuntu中的WindTerm如何设置成中文,并且关闭shell中Tab键声音(Tips)

前言 &#xff08;1&#xff09;Windterm是一个非常优秀的终端神器。关于他的下载我就不多说了&#xff0c;网上很多。今天我就分享一个国内目前没有找到的这方面的资料——Ubuntu中的WindTerm如何设置成中文&#xff0c;并且关闭shell中Tab键声音。 将WindTerm设置成中文 &…

Unity zSpace 开发

文章目录 1.下载 zSpace 开发环境1.1 zCore Unity Package1.2 zView Unity Package 2. 导入工程3. 发布设置4.功能实现4.1 用触控笔来实现对模型的拖拽&#xff1a; 5. 后续更新 1.下载 zSpace 开发环境 官网地址 1.1 zCore Unity Package zSpace 开发核心必须 1.2 zView …

机器人CPP编程基础-05完结The End

非常不可思议……之前四篇博文竟然有超过100的阅读量…… 此文此部分终结&#xff0c;没有继续写下去的必要了。 插入一个分享&#xff1a; 编程基础不重要了&#xff0c;只要明确需求&#xff0c;借助AI工具就能完成一个项目。 当然也不是一次成功&#xff0c;工具使用也需要…

计算机视觉一 —— 介绍与环境安装

傲不可长 欲不可纵 乐不可极 志不可满 一、介绍 研究理论和应用 - 研究如何使机器“看”的科学 - 让计算机具有人类视觉的所有功能 - 让计算机从图像中&#xff0c;提取有用的信息&#xff0c;并解释 - 重构人眼&#xff1b;重构视觉皮层&#xff1b;重构大脑剩余部分 计…

利用ChatGPT绘制思维导图——以新能源汽车竞品分析报告为例

随着人们对环境保护的日益关注和传统燃油汽车的限制&#xff0c;全球范围内对新能源汽车的需求不断增长。新能源汽车市场的激烈竞争使得了解各个竞品的特点和优劣成为关键。然而&#xff0c;针对这一领域的详尽竞品分析却常常需要大量时间和精力。 在此背景下&#xff0c;人工智…

Qt+C++自定义控件仪表盘动画仿真

程序示例精选 QtC自定义控件仪表盘动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC自定义控件仪表盘动画仿真>>编写代码&#xff0c;代码整洁&#xff0c;规则&…

2023国赛数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

PHP原生类

什么是php原生类 原生类就是php内置类&#xff0c;不用定义php自带的类&#xff0c;即不需要在当前脚本写出&#xff0c;但也可以实例化的类 我们可以通过脚本找一下php原生类 <?php $classes get_declared_classes(); foreach ($classes as $class) {$methods get_clas…

Docker的基本概念及镜像加速器的配置

1.Docker的概念 由于代码运行环境不同&#xff0c;代码运行会出现水土不服的情况。运用docker容器会把环境进行打包&#xff0c;避免水土不服。docker是一种容器技术&#xff0c;它解决软件跨环境迁移的问题。 2&#xff0c;安装Docker 3.Docker架构 4.Docker镜像加速器的配…