有趣的小知识(二)浏览器内的秘密:了解Cookie基础知识

news2024/9/21 16:30:42

一、简介

        Cookie是一种小型的文本文件,由Web服务器发送给Web浏览器,并存储在用户的计算机硬盘上。它通常用于记录用户的偏好、登录状态、购物车信息等,以便在用户下次访问该网站时能够提供更好的用户体验。Cookie通常包含网站的名称、Cookie的过期时间以及一个由随机数生成的唯一标识符。
​         Cookie(也称为HTTP Cookie、Web Cookie、浏览器 Cookie等等)是服务器发送到用户浏览器并保存在本地的一小块数据,该数据通常是用户账号相关的信息,不同浏览器对Cookie的数量和大小限制不同,但一般来说,单域名下设置的cookie不能超过30个,单条cookie的大小不能超过4kb。如果Cookie超出浏览器限制,则会被浏览器忽略,不被保存。而且Cookie可以设置过期时间,到达过期时间后,浏览器就会把Cookie清除掉
        当用户访问网站时,Web浏览器将自动发送存储在计算机硬盘上的Cookie信息到Web服务器,以便服务器可以识别用户并提供相关服务。网站可以使用Cookie来跟踪用户的行为、收集用户的统计信息以及显示广告等。然而,由于Cookie是存储在用户计算机上的文本文件,因此存在一些安全隐患,例如Cookie可以被黑客窃取并用于恶意攻击。因此,浏览器提供了一些安全机制,如限制Cookie的有效期限、禁用第三方Cookie等,以保护用户的隐私安全。

 设置Cookie的方式有两种

服务端通过在HTTP响应头中的Set-Cookie字段设置,以及在前端通过JS的document.cookie设置。在浏览器在拥有Cookie之后,每次向服务器发送请求时,都会自动携带对应地址的Cookie。但是用户可以手动操作浏览器接受、拒绝和删除Cookie,以及是否向服务器发送Cookie。
服务器端设置Cookie:当Web服务器向客户端(如浏览器)发送响应时,可以通过设置HTTP响应头中的Set-Cookie字段来设置Cookie。Set-Cookie字段包含了要设置的Cookie的名称、值、过期时间、作用域等信息。

客户端(如浏览器)设置Cookie:浏览器可以通过JavaScript来设置Cookie。使用JavaScript设置Cookie的方法是document.cookie,该属性包含了当前网页中所有已设置的Cookie信息

 Cookie有两种类型

会话期Cookie持久性Cookie。会话期Cookie不设置具体失效时间,只会在当前会话结束之后,被删除掉。被存储在内存中,当会话关闭时,该Cookie永久丢失。重新发起会话时,会创建一个新的会话期Cookie。持久性Cookie会设置好具体的有效期,被存储在磁盘中,浏览器关闭不会影响该Cookie,只有当有效期结束时,才会从磁盘中将该Cookie删除。在有效期内,会一直复用该Cookie。

Cookie可以解决HTTP无状态引发生的问题。HTTP无状态是指HTTP协议属于一种无状态协议,表示服务端不会在两个请求之间,保留任何状态(数据),请求之间没有关联,相对独立。如果后续请求需要用到前面请求中的相关状态,那就得进行重传,导致后续请求传送的数据量增大。而借助Cookie就可以帮助HTTP记录稳定的状态信息,减少数据的重传。

二、 Cookie属性

 查找方式

如果您想查看某个网站设置的Cookie及其属性,可以按照以下步骤:

打开浏览器,并访问目标网站。
打开浏览器的开发者工具(通常可以通过按下F12键或Ctrl+Shift+I组合键来打开)。
切换到“网络”或“应用程序”面板。
在面板中找到包含目标网站域名的HTTP请求,并点击它。
在HTTP请求的详细信息面板中,找到“Cookie”或“Cookies”选项卡,并点击它。
在选项卡中,您可以查看该网站设置的所有Cookie及其属性,包括名称、值、域名、路径、过期时间等。
请注意,浏览器的开发者工具可能会因浏览器类型和版本的不同而略有差异,但通常都提供了类似的功能。

 cookie共拥有以下13条属性,前10条被广泛支持,后3条目前仅在chrome浏览器中能看到:

1.Name(名称):Cookie的名称,通常是一个字符串,可以用于在多个Cookie之间进行区分。不可包含空格制表符控制字符()<>,;:"/[]{}等多种特殊字符。

2.Value(值):Cookie的值,通常也是一个字符串,用于存储具体的数据信息。同样不可包含空格制表符控制字符()<>,;:"/[]{}等多种特殊字符。与cookiename属性以=号连接。

3.Expires(过期时间):Cookie的过期时间,表示该Cookie的有效期限。可以通过设置一个过去的日期来使该Cookie立即过期,或者设置一个未来的日期来指定该Cookie的过期时间。如果不设置该属性,则该Cookie默认在会话结束时过期,即浏览器关闭时。

4.Domain(作用域):Cookie的作用域,表示该Cookie适用于哪些域名。默认情况下,该Cookie仅在设置该Cookie的域名及其子域名中可用。例如,如果设置了一个名为foo的Cookie,其域名为example.com,则该Cookie在example.com及其所有子域名(如www.example.com、blog.example.com等)中均可用。

 注意: 如果设置Domain的域名前面加 . ,则表示包含该域名的子域名,否则仅作用于该域名。在部分浏览器中只要设置了cookie的Domain属性,则浏览器在存储cookie时,会自动给域名前面加 .,使得子域名也能访问该cookie;相反,如果没有设置cookie的Domain属性,从而采取默认设置,则浏览器不会自动给域名前面加 .,子域名也就无法访问该cookie。(有待验证!!!)

5.Path(路径):Cookie的路径,表示该Cookie适用于哪些URL路径。默认情况下,该Cookie仅在设置该Cookie的路径及其子路径中可用。例如,如果设置了一个名为foo的Cookie,其路径为/example,则该Cookie仅在/example及其子路径(如/example/foo、/example/bar等)中可用。

// 设置cookie的path为 /c
'cookie1=cookie1;Domain=.a.com;path=/c'
// 则 https://www.a.com/c、https://www.a.com/c/c1、https://www.a.com/c/c1/c11等
// 都可以携带该cookie

// 如果设置cookie的path为 /c/c1
'cookie1=cookie1;Domain=.a.com;path=/c/c1'
// 则 https://www.a.com/c/c1、https://www.a.com/c/c1/c11等路径可以携带该cookie
// 但是https://www.a.com/c 不会携带该cookie

6.Secure(安全):该属性表示是否只在安全连接(如HTTPS)中使用该Cookie。如果设置了该属性,则该Cookie仅在通过安全连接发送的请求中发送给服务器端。

7.HttpOnly(只读):该属性表示是否禁止客户端使用JavaScript等脚本语言来访问该Cookie。如果设置了该属性,​ 设置cookie是否可以被前端通过JS的document.cookie访问到,如果设置为true,则不能被JS操作,只能被浏览器和服务端操作,在请求中会被正常携带,反之,则可以被JS操作。通常设置该属性的cookie,都用于存储一些用户身份或者安全凭证之类的信息,可以防范XSS攻击(跨站脚本攻击)。

8.SameSite(跨站点策略):该属性表示是否允许该Cookie在跨站点请求中使用。

 9.Max-Age(最大存活时间):该属性表示该Cookie的最大存活时间,以秒为单位。如果设置了该属性,则该Cookie在到达指定的最大存活时间后将被自动删除,即使该Cookie还没有到达过期时间。如果同时设置了Expires和Max-Age属性,则Max-Age优先级更高

注意:如果属性值为正数,表示该cookie会在正数秒后失效,然后被浏览器清除掉。如果属性值为**0,则表示该cookie立即失效,被浏览器清除掉。如果属性值为负数**,则表示该cookie是一个临时cookie,存储在浏览器内存中,仅在当前浏览器窗口以及本窗口打开的相关子窗口有效,当窗口关闭后,该cookie就会失效,然后被浏览器清除掉。
10.Priority(优先级)该属性表示该Cookie的优先级,可以是default、low、medium、high中的一个。默认情况下,所有Cookie的优先级均为default。在容量有限的情况下,浏览器可能会删除优先级较低的Cookie,以释放更多的空间。当cookie数量超出时,低优先级的cookie会被优先清除。

11.Size(大小):该属性表示该Cookie的大小,通常以字节为单位。Cookie的大小包括名称、值、属性等信息。在容量有限的情况下,浏览器可能会删除较大的Cookie,以释放更多的空间。一般单条cookie的总大小不能超过4kb,也就是4096字节

12.SameParty : 是指在同一站点的不同子域之间共享Cookie的属性。同一站点指的是域名相同,而子域指的是域名前缀不同。例如,www.example.com 和 api.example.com 属于同一站点,但是它们是不同的子域。

当一个Cookie被设置为SameParty属性时,它将只在同一站点的不同子域之间共享。这可以帮助防止跨站点攻击,并增强站点的安全性。例如,如果站点的子域之间需要共享用户的登录状态,则可以设置一个带有SameParty属性的Cookie,以确保登录状态不会被跨站点攻击者窃取或劫持。

需要注意的是,SameParty属性是一个比较新的属性,目前只有部分浏览器支持,包括Google Chrome和Microsoft Edge。此外,该属性默认是禁用的,需要手动在Cookie中设置该属性,否则该属性将被忽略。同时,如果浏览器不支持或未启用SameParty属性,则会将其视为普通Cookie,可以被任何子域共享。

13.Partition Key 是一种 Cookie 属性,用于将一个网站的 Cookie 划分为多个分区。每个分区可以有自己的 Cookie 值和过期时间,并且不同分区之间的 Cookie 不会互相干扰

使用 Partition Key 属性可以为同一个域名下的不同应用或不同用户创建独立的 Cookie 分区。例如,一个网站可能有多个不同的子应用,如购物车、用户中心等,每个子应用都需要使用自己的 Cookie 存储用户的状态信息。通过使用 Partition Key 属性,可以为每个子应用创建独立的 Cookie 分区,避免不同子应用之间的 Cookie 冲突问题。

需要注意的是,Partition Key 属性是一个比较新的属性,目前只有部分浏览器支持,包括 Chrome 和 Safari。此外,该属性默认是禁用的,需要手动在 Cookie 中设置该属性,否则该属性将被忽略。

三、 Cookie操作

Cookie 是一种在客户端保存数据的技术,可以通过 JavaScript 在客户端创建、读取和修改 Cookie。

1.创建 Cookie

通过设置 document.cookie 属性可以在客户端创建一个新的 Cookie。Cookie 的格式为 key=value,多个 Cookie 之间用分号 ; 分隔。例如,创建一个名为 username,值为 Alice 的 Cookie,可以通过以下代码实现:

document.cookie = "username=Alice";

2.读取 Cookie

通过 document.cookie 属性可以读取当前网页保存的所有 Cookie。读取 Cookie 可以通过字符串的 split() 方法和正则表达式来实现。例如,读取名为 username 的 Cookie 的值,可以通过以下代码实现:

var cookies = document.cookie.split("; ");
for (var i = 0; i < cookies.length; i++) {
  var cookie = cookies[i].split("=");
  if (cookie[0] === "username") {
    var username = cookie[1];
    console.log("Username is: " + username);
    break;
  }
}

3.修改 Cookie

可以通过修改 Cookie 的值、过期时间和路径等属性来修改 Cookie。修改 Cookie 的方法与创建 Cookie 的方法相似,只需要重新设置 document.cookie 属性即可。例如,将名为 username 的 Cookie 的过期时间设置为 1 小时后,可以通过以下代码实现

var date = new Date();
date.setTime(date.getTime() + 60 * 60 * 1000); // 1 hour
document.cookie = "username=Alice; expires=" + date.toUTCString();

4.删除 Cookie

可以通过设置 Cookie 的过期时间来删除一个 Cookie。将 Cookie 的过期时间设置为一个过去的时间即可立即删除该 Cookie。例如,删除名为 username 的 Cookie,可以通过以下代码实现:

document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC";

需要注意的是,所有 Cookie 操作都必须在客户端上执行。由于 Cookie 存储在客户端,因此不能通过服务器端直接修改 Cookie。服务器端可以通过设置 HTTP 响应头的 Set-Cookie 字段来创建、修改和删除 Cookie
 

四、总结

Cookie 是一种在客户端保存数据的技术,通过设置 HTTP 响应头的 Set-Cookie 字段来创建、修改和删除 Cookie。

Cookie 的属性包括名称、值、过期时间、路径、域、安全标识、SameSite 策略、Partition Key 和 SameParty。其中,名称和值是必须的属性,过期时间和路径是可选的属性。Cookie 的名称必须是唯一的,而 Cookie 的值可以是任意字符串。

可以通过 JavaScript 在客户端创建、读取和修改 Cookie。创建 Cookie 可以通过设置 document.cookie 属性来实现,读取和修改 Cookie 可以通过字符串的 split() 方法和正则表达式来实现。删除 Cookie 可以通过设置 Cookie 的过期时间来实现。

SameSite 策略是一种防止跨站点请求伪造的技术,Partition Key 是一种在同一站点下隔离 Cookie 的技术,SameParty 是一种允许同一站点下的第三方 Cookie 共享的技术。这些技术可以提高 Cookie 的安全性和隔离性,保护用户的隐私和安全。

需要注意的是,所有 Cookie 操作都必须在客户端上执行,不能通过服务器端直接修改 Cookie。由于 Cookie 存储在客户端,因此可以被用户随意修改或删除。因此,应该在使用 Cookie 时注意安全性和隐私保护。

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

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

相关文章

2023年工业自动化,机器人与控制工程国际会议(IARCE 2023)

2023年工业自动化&#xff0c;机器人与控制工程国际会议&#xff08;IARCE 2023&#xff09; 重要信息 会议网址&#xff1a;www.iarce.org 会议时间&#xff1a;2023年10月27-29日 召开地点&#xff1a;中国成都 截稿时间&#xff1a;2023年9月21日 录用通知&#xff1a;…

[创业之路-57] :商业计划书BP如何书写?总体框架!

引言&#xff1a;BP (Buiness Plan) &#xff0c;即商业计划书&#xff0c;本质上还是一份计划&#xff0c;是一份商业计划&#xff0c;即一种关于如何赚钱的计划&#xff0c;是一份通过组建公司&#xff0c;运营项目&#xff0c;进而赚钱的项目计划。什么是商业&#xff1f;商…

【计算机网络】ISO/OSI参考模型与TCP/IP模型

ISO/OSI参考模型与TCP/IP模型 一、ISO/OSI参考模型&#xff08;七层&#xff09; 一个理论模型&#xff0c;并未商用。 OSI参考模型有七层&#xff0c;自上而下分别为 应用层 &#xff1a; 所有能产生网络流量的应用程序都属于是应用层 典型协议&#xff1a;FTP&#xff08…

分布式锁详解

文章目录分布式锁是什么基于 Redis 实现分布式锁如何基于Redis实现一个简单的分布式锁为什么要给锁设置一个过期时间&#xff1f;如何实现锁的优雅续期&#xff1f;如何实现可重入锁&#xff1f;Redis 如何解决集群情况下分布式锁的可靠性&#xff1f;分布式锁是什么 java单机…

从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制

如何确保IM 不丢消息是个相对复杂的话题&#xff0c;从客户端发送数据到服务器&#xff0c;再从服务器抵达目标客户端&#xff0c;最终在 UI 成功展示&#xff0c;其间涉及的环节很多&#xff0c;这里只取其中一环「接收端如何确保消息不丢失」来探讨&#xff0c;粗略聊下我接触…

crmeb商城部署(踩坑及解决方法)

源码地址&#xff1a; https://gitee.com/ZhongBangKeJi/CRMEB 原版是PHP版&#xff0c;我也不懂PHP&#xff0c;但看到功能很全&#xff0c;而且有docker-compose的脚本可以部署&#xff0c;并且教程也很完善&#xff0c;就拿来部署试下。 所以也适用于和我一样&#xff0c;…

【NodeJs】NodeJs专题之理解企业BFF框架原理

BFF—服务于前端的后端 一、什么是BFF框架 BFF框架指的是一种逻辑分成,而非一种新技术即 Backend For Frontend&#xff08;服务于前端的后端&#xff09;&#xff0c;也就是服务器设计 API 时会考虑前端的使用&#xff0c;并在服务端直接进行业务逻辑的处理&#xff0c;又称…

每日记录自己的Android项目(一)

Jetpack之Navigation今天新创建一个项目&#xff0c;选的是这个。首先映入眼帘的是一个这样的界面。由ViewBinding绑定好XML布局和根布局和标题栏。这个应该是Navigationg里面的内容还有个字段private AppBarConfiguration appBarConfiguration;Overrideprotected void onCreat…

C# 序列化时“检测到循环引用”错误的彻底解决方案

目录 一&#xff0c;问题表现 二、没有技术含量的解决方案 三、本人彻底的解决方案 简要说明 贴代码 思路解析 思路 一&#xff0c;问题表现 示例代码如下&#xff1a; [Serializable] public class NodeTest {public NodeTest (){new List<NodeTest> ();}p…

SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties

ConfigurationProperties 这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性 为yml某个类注入 只要将对应的yml类对象声明实体pojo并交给spring容器管理&#xff0c;再在类上使用ConfigurationProperties绑定对应的类名即可 涉及到两个知识点&#xff0c;这个类对…

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲&#xff0c;但是迟迟没有开始复习&#xff0c;一方面是因为学校学业却是繁忙&#xff0c;另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰&#xff0c;但如今&#xff0c;复习必须开始了。今天我从C语言的最…

Linux/MacOS 生成双击可执行文件

双击可执行文件包含两种&#xff1a;终端shell脚本 Unix可执行文件 1.终端shell脚本 随意新建一个文件&#xff08;可使用command键N&#xff0c;前提是有已打开的文件&#xff09;&#xff0c;输入shell格式的测试代码&#xff0c;比如&#xff1a; #! /bin/sh echo “h…

双喜临门|炼石荣获2023年中国网络和数据安全高峰论坛双奖项

2023年2月23日-24日&#xff0c;工业和信息化部、四川省人民政府联合主办以“新征程 新思路 高质量发展”为主题的“2023年中国网络和数据安全产业高峰论坛”在成都隆重召开。工信安全中心第一届网络安全高成长性企业“勇攀之星”正式揭晓&#xff0c;炼石以高成长性、高创新性…

【vue】iframe相关问题

一、刷新iframe页面iframe的地址没有改变的话&#xff0c;每打开一次iframe页面&#xff0c;都不会主动更新页面的。以下有几种方法&#xff0c;都可以实现&#xff0c;每打开一次页面&#xff0c;就刷新一下给iframe添加key<template><div id"Iframe">&…

一名IC验证工程师的成长路径是怎么样的?来听听工程师的见解

IC验证这个岗位对于非科班的学生是比较友好的&#xff0c;因为验证需要具备的技能UVM&#xff0c;SV&#xff0c;C等&#xff0c;非科班和科班的差距不会拉开太大。因其岗位需求量巨大而格外受到了大家的青睐&#xff0c;甚至成为不少学生的转行首选。 验证对于IC的重要性 IC…

汽车 12V 和 24V 电池输入保护推荐

简介汽车电池电源线路在运行系统时容易出现瞬变。所需的典型保护包括过压、过载、反极性和跨接启动。在汽车 的生命周期中&#xff0c;交流发电机可能会被更换为非OEM 部件。售后市场上的交流发电机可能具有不同的负载突降&#xff08;LOAD DUMP&#xff09;保护或没有负载突降…

论文阅读-Attention Bottlenecks for Multimodal Fusion(多模态特征融合)

一、论文信息 论文题目&#xff1a;Attention Bottlenecks for Multimodal Fusion paperwithcode&#xff1a;https://paperswithcode.com/paper/attention-bottlenecks-for-multimodal-fusion Github&#xff1a;https://github.com/google-research/scenic/tree/main/scen…

产品故事:语雀两度生死局

语雀是一款文档和知识库产品&#xff0c;2016 年从一个技术团队支付宝体验技术部生长出来&#xff0c;2021 年蚂蚁成立了智能协同事业部&#xff0c;重点产品即为语雀&#xff0c;以独立 BU 运作&#xff0c;算是完成了“成人礼”。我们和玉伯聊了聊语雀的成长故事。 极客时间&…

C++基础知识【3】控制语句

目录 前言 一、条件语句 1.1、if 语句 1.2、if-else 语句 1.3、switch 语句 二、循环语句 2.1、while 循环 2.2、do-while 循环 2.3、for 循环 三、跳转语句 3.1、break语句 3.2、continue语句 3.3、goto语句 四、一些新特性 4.1、if 语句和 switch 语句…

【数据结构与算法】图遍历算法 ( 深度优先搜索代码示例 )

文章目录一、深度优先搜索算法二、完整代码示例完整代码示例执行结果一、深度优先搜索算法 深度优先搜索算法步骤 : 将 深度优先搜索 算法步骤 转为代码 ; ① 访问初始结点 : 访问 初始结点 v , 并将该 初始结点 v 标记为 " 已访问 " ; 设置一个 访问标记 数组 , 数…