当前位置: 首页 > article >正文

cookie详解

一、cookie出现原因

http是无状态的,浏览器无法记录当前是哪个人浏览的,所以出现了cookie

作用:会话状态管理(用户登录状态、购物车、游戏分数)、个性化设置(主题、自定义设置)、浏览器行为跟踪(跟踪分析用户行为)

二、cookie作用过程

服务器可以在 HTTP 请求响应标头中添加一个或多个 Set-Cookie 属性来设置 cookie,它是由键/值对以及可选属性组成的相应字符串:

Set-Cookie: myfirstcookie=somecookievalue

cookie 是服务器可以存储在用户浏览器并保存到本地中的小块数据,浏览器收到响应后通常会保存下 Cookie,并将其放在 HTTP Cookie标头内,向同一服务器发出请求时一起发送(会造成一定性能开销)。

Cookie: myfirstcookie=somecookievalue

三、cookie属性值

1.过期时间max-age和expires

默认情况下,cookie 在用户关闭会话时即关闭浏览器时过期(不过有一些浏览器重启的时候会使用会话恢复延长会话时间)。要持久化cookie,我们可以通过expiresMax-Age属性

Set-Cookie: myfirstcookie=somecookievalue; expires=Tue, 09 Jun 2020 15:46:52 GMT; Max-Age=1209600

expires:在指定时间失效,设置成过去的时间代表立即删除cookie

Max-Age:在多少秒之后失效,如果设置为-1代表立即失效

注意:Max-Age优先于expires

2.定义cookie发送的位置: path 和domain

DomainPath 标识定义了 Cookie 的作用域:即允许 Cookie 应该发送给哪些 URL。

  • Domain属性

Domain 指定了哪些主机可以接受 Cookie。如果不指定,该属性默认为同一 host 设置 cookie,不包含子域名。如果指定了 Domain,则一般包含子域名。

例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。

注意:

1.设置domain之后,端口号和协议不一致不会影响cookie

2.设置domain为.mozilla.org和设置为mozilla.org效果是一样的,但是如果不设置,默认为mozilla.org,此时只在当前域下(不包括子域)

3.在子域中可以给父域设置cookie,比如:

可以在a.com和b.a.com中获取到这个cookie

4.不能在当前域的子域或者跨域设置cookie,比如:

  • Path属性

Path 属性指定了一个 URL 路径,该 URL 路径必须存在于请求的 URL 中,并且子路径也会被匹配

例如,设置 Path=/docs,则以下地址都会匹配:

  • /docs

  • /docs/

  • /docs/Web/

  • /docs/Web/HTTP

具有给定路径path属性的cookie不能被发送到另一个不相关的路径,即使这两个路径位于同一域中。

注意:在cookie创建过程中省略Path时,浏览器默认为/

3.cookie的安全保证:secure和HttpOnly

  • secure属性

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端,它永远不会使用不安全的 HTTP 发送(本地主机除外),可以预防中间人攻击

注意:当我们设置secure属性之后去访问http网站是不会带着这个cookie的

  • HttpOnly属性

设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 Document.cookie 属性、XMLHttpRequestRequest APIs、Cookie Store APIs 进行访问。(通过接口网络数据可以看到,但是不能通过代码拿到),可以有效的防止XSS攻击

注意:只能通过服务器的set-cookie设置,我们自己设置会被浏览器忽略掉

4.跨站请求时不会被发送:SameSite属性

服务器要求某个 Cookie 在跨站请求(顶级域名和二级域名一样认为是同站)时不会被发送,从而可以阻止CSRF攻击

  • SameSite 属性有三个可选值

1. None:无论是否跨站都会发送cookie

2. Strict:跨站不会携带cookie

3. Lax:新版本浏览器默认设置为 Lax。与 Strict 类似,但特定条件也可发送跨域请求。

  • URL 必须发生变化
  • HTTP 请求方式必须是安全的,例如 GETHEAD、OPTIONS,它们不改变数据

        举个例子,用户从 a.com 跳转到 b.com,URL 发生了变化的同时请求方式为 GET,所以 设置了 Lax的 Cookie 会被发送过去 ,除此之外还有图片加载、iframe 调用等等。

  • SameSite 和 Domain 的区别

Domain 属性限制了接收 Cookie 的域名,而 SameSite属性限制了发送 Cookie 的域名

举个例子:

Set-Cookie: Foo=bar; Path=/; Secure; Domain=scar.site;

无论是从 scar.site 还是 foo.example.com 发起的请求,只要被发送到了 scar.site 或者它的子域名,那 Cookie 就能发过去。

Set-Cookie: name=scar; Path=/; Secure; Domain=scar.site;SameSite=strict;

如果设置了 SameSite=strict,那么这个请求只能从 scar.site 发起 Cookie 才能带过去。

四、cookie携带注意事项

1.同源策略下会自动携带

如果请求的 ​URL 域名、路径、协议与 Cookie 设置的 Domain 和 Path 属性匹配,浏览器会自动将符合条件的 Cookie 附加到请求头的 Cookie 字段中

Domain 属性
  • Domain 属性指定 Cookie 可以被访问的域名,默认为当前域名,只能被设置它的域名或其子域名访问。

  • 示例

    • 如果 Cookie 设置为 Domain=example.com,它可以在 example.comsub.example.com 下访问。

    • 如果 Cookie 设置为 Domain=sub.example.com,它只能在 sub.example.com 下访问。

Path 属性
  • Path 属性指定 Cookie 可以被访问的路径,默认为/,只能被设置它的路径或其子路径访问。

  • 示例

    • 如果 Cookie 设置为 Path=/api,它可以在 /api 及其子路径(如 /api/v1)下访问。

    • 如果 Cookie 设置为 Path=/,它可以在整个域名下访问。

2. 跨域请求的受限携带

跨域请求中 cookie 的携带受到 CORS(跨域资源共享)的限制。默认情况下,浏览器不会在跨域请求中发送 cookie,需要服务器配置 CORS 头。

为了允许跨域请求携带 cookie,服务器需要返回特定的响应头:

  • 设置 Access-Control-Allow-Origin 为请求的源,而不是通配符 *,因为 * 不允许携带 cookie
  • 设置Access-Control-Allow-Credentials 为 true,这样浏览器才会发送 cookie。
  • 根据需求配置 Access-Control-Allow-Methods、Access-Control-Allow-Headers 等
  • Cookie 的 SameSite 属性未设置为 Strict 或 Lax。若需跨站携带,需设置为 SameSite=None; Secure(仅限 HTTPS)

3.子域名与父域名的交互

  • 父域名 Cookie 影响子域名:

    若父域名(example.com)设置了 Cookie,子域名(api.example.com)的请求不会自动携带该 Cookie,除非显式设置Domain=.example.com

  • 子域名 Cookie 不影响父域名:

    子域名(api.example.com)设置的 Cookie(未显式设置Domain)仅在该子域名下有效,父域名(example.com)的请求不会携带它

五、如何判断两个 Cookie 是否是同一个 Cookie

同一个cookie:相同的名称(Name)、域(Domain)、路径(Path)

Cookie 覆盖条件

  1. 相同的名称、域和路径:如果新设置的 Cookie 的名称、域和路径与已存在的 Cookie 完全相同,那么新 Cookie 会覆盖旧 Cookie。

  2. 服务器设置新的 Cookie:当服务器通过 Set-Cookie 响应头设置一个新 Cookie 时,如果新 Cookie 的名称、域和路径与现有 Cookie 完全匹配,浏览器会用新 Cookie 替换旧 Cookie。


如果想对cookie做进一步了解,可看下面的文章:

Cookie 从入门到进阶:一文彻底弄懂其原理以及应用-阿里云开发者社区

前端必要懂的,完整的 HTTP cookie 指南 - 终身学习者 - SegmentFault 思否

浏览器自动携带cookie注意事项_cookie 什么时候会自动带上-CSDN博客

前端Cookie手把手教程哔哩哔哩bilibili

相关文章:

cookie详解

一、cookie出现原因 http是无状态的,浏览器无法记录当前是哪个人浏览的,所以出现了cookie 作用:会话状态管理(用户登录状态、购物车、游戏分数)、个性化设置(主题、自定义设置)、浏览器行为跟…...

Mayo Clinic Platform在人工智能医疗领域的现状及启示意义研究

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,人工智能(AI)已逐渐渗透至各个行业,医疗领域作为关乎人类生命健康的重要领域,也迎来了人工智能技术带来的深刻变革。人工智能医疗,作为人工智能与医疗行业深度融合的产物,正重塑着全球医疗的格局。 从全球范围来看,…...

Rust基础语法

以下是 Rust 语言基础语法的核心要点,结合与 JavaScript 的对比,帮助前端开发者快速掌握核心概念: 一、变量与常量 1. 变量声明 Rust:变量默认不可变,需用 mut 显式声明可变性。let x 5; // 不可变变量 le…...

如何将 Java 应用做成 EXE 的可执行软件

目录 前言一、情景介绍二、实现步骤1. 打 Jar 包2. 编写 bat 批处理文件3. bat 转 exe 前言 最近使用 GUI 帮朋友写了一个软件,为了方便他处理工作上的重复性且很麻烦的事情,程序是使用 Java 写的,就不得不面对一个问题:我必须将…...

第一篇:系统分析师首篇

目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复…...

自动关机监控器软件 - 您的电脑节能助手

## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具,旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动,在设定的无活动时间后自动关闭计算机,特别适合需要长时间离开电脑但…...

线程概念与控制(中)

线程概念与控制(上)https://blog.csdn.net/Small_entreprene/article/details/146464905?sharetypeblogdetail&sharerId146464905&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们经过上一篇的学习,接…...

K8S学习之基础六十二:helm部署memcached服务

helm部署memcached服务 #安装memcached的Chart docker load -i memcache_1_4_36.tar.gz #如果k8s用的是docker做容器运行时,用docker load -i导出镜像 ctr -nk8s.io images import memcache_1_4_36.tar.gz #如果k8s用的是containerd做容器运行时,用ctr…...

CPU 超线程技术以及如何关闭CPU超线程功能

CPU超线程技术介绍 CPU 超线程技术(Hyper-Threading Technology,HT)是英特尔提出的一种同时多线程(Simultaneous Multi-Threading, SMT)​实现方式,其核心思想是通过逻辑层面的优化,让单个物理…...

Redis 源码硬核解析系列专题 - 第二篇:核心数据结构之SDS(Simple Dynamic String)

1. 引言 Redis没有直接使用C语言的标准字符串(以\0结尾的字符数组),而是自定义了SDS(Simple Dynamic String)。SDS是Redis的基础数据结构之一,广泛用于键值存储、命令参数等场景。本篇将深入剖析SDS的实现原理、优势以及源码细节。 2. 为什么不用C标准字符串? C字符串…...

1--当「穷举」成为艺术:CTF暴力破解漏洞技术从入门到入刑指南(知识点讲解版)

当「穷举」成为艺术:CTF暴力破解漏洞技术从入门到入刑指南 引言:论暴力破解的哲学意义 “世界上本没有漏洞,密码设得简单了,便成了漏洞。” —— 鲁迅(并没有说过) 想象你是个不会撬锁的小偷,面…...

DHCP报文的详细流程

在DHCP协议的工作流程中,​Discover和Request报文使用广播MAC地址,而Offer和ACK报文通常使用单播MAC地址。这种差异源于DHCP协议的设计逻辑和网络通信的实际需求,具体原因如下: ​1. DHCP报文交互流程 DHCP的完整流程分为四个阶段…...

通信协议和特征

文章目录 双工时钟电平串并行 双工 全双工:全双工通信允许同一时刻数据在两个方向上同时进行传输。一般来说,全双工的通信都有两根数据线,一根发送,一根接收,二者互不影响。半双工:允许数据在两个方向上传…...

Python 循环全解析:从语法到实战的进阶之路

一、问答题 &#xff08;1&#xff09;下面的循环体被重复了多少次?每次循环的输出结果是什么? i1 while i < 10:if i % 2 0:print(i)死循环&#xff0c;没有输出结果 i1 while i < 10:if i % 2 0:print(i)i l死循环&#xff0c;没有输出结果 i 1 while i< 10…...

The Rust Programming Language 学习 (七)

常见集合 使用 Vector 存储表 Vec<T>&#xff0c;也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值&#xff0c;它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用 新建Vector 为了创建一…...

[GXYCTF2019]禁止套娃1 [GitHack] [无参数RCE]

Git基础 Git信息泄露原理解析及利用总结 - FreeBuf网络安全行业门户 CTF中的GIT泄露_ctf git泄露-CSDN博客 Git结构 dirsearch扫出来一大堆东西&#xff08;然而这些并没有什么屁用&#xff09; 但也算起码了解了git结构了吧 /.git/HEAD&#xff1a;表示当前HEAD指针的指…...

从ChatGPT到AutoGPT——AI Agent的范式迁移

一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…...

stock-pandas,一个易用的talib的替代开源库。

原创内容第841篇&#xff0c;专注智能量化投资、个人成长与财富自由。 介绍一个ta-lib的平替——我们来实现一下&#xff0c;最高价突破布林带上轨&#xff0c;和最低价突破布林带下轨的可视化效果&#xff1a; cross_up_upper stock[high].copy()# cross_up_upper 最高价突破…...

Spring Cloud Gateway详细介绍简单案例

文章目录 1、Spring Cloud Gateway 详细介绍1.1. 统一入口&#xff08;Single Entry Point&#xff09;1.2. 请求路由&#xff08;Request Routing&#xff09;1.3. 负载均衡&#xff08;Load Balancing&#xff09;1.4. 流量控制&#xff08;Rate Limiting&#xff09;1.5. 身…...

鸿蒙原生开发之状态管理V2

一、ArkTS状态变量的定义&#xff1a; State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 在鸿蒙原生开发中&#xff0c;使用ArkTS开发UI的时候&#xff0c;我们可以…...

矩阵中对角线的遍历问题【C++】

1&#xff0c;按对角线进行矩阵排序 题目链接&#xff1a;3446. 按对角线进行矩阵排序 - 力扣&#xff08;LeetCode&#xff09; 【题目描述】 对于一个m*n的矩阵grid&#xff0c;要求对该矩阵进行 变换&#xff0c;使得变换后的矩阵满足&#xff1a; 主对角线右上的所有对角…...

Python小练习系列 Vol.4:迷宫寻路(回溯 + DFS)

&#x1f9e0; Python小练习系列 Vol.4&#xff1a;迷宫寻路&#xff08;回溯 DFS&#xff09; &#x1f6aa; 本期我们将探索一个二维世界&#xff0c;借助回溯算法帮助角色走出迷宫&#xff01;这是学习路径搜索类题目的经典案例。 &#x1f9e9; 一、题目描述 给定一个二维…...

[Lc4_dfs] 解数独 | 单词搜索

目录 1.解数独 题解 2.单词搜索 题解 1.解数独 链接&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线…...

day17 学习笔记

文章目录 前言一、数组的增删改查1.resize函数2.append函数3.insert函数4.delete函数5.argwhere函数6.unique函数 二、统计函数1.amax&#xff0c;amin函数2.ptp函数3.median函数4.mean函数5.average函数6.var&#xff0c;std函数 前言 通过今天的学习&#xff0c;我掌握了num…...

自动语音识别(ASR)技术详解

语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能和自然语言处理领域的重要技术&#xff0c;旨在将人类的语音信号转换为对应的文本。近年来&#xff0c;深度学习的突破推动语音识别系统从实验室走入日常生活&#xff0c;为智能助手、实时翻译、医…...

git | 版本切换的相关指令

常见指令 git log --oneline #查看历史提交 git tag latest-backup # 对当前的提交进行标记&#xff0c;标记名为latest-backup git checkout -b old-version 55b16aa # 切换到[55b16aa]的提交中&#xff0c;并标记为[old-version]的分支 git checkout master …...

19.OpenCV图像二值化

OpenCV图像二值化 图像二值化&#xff08;Binarization&#xff09;是图像预处理中的一种常用技术&#xff0c;其目的是将图像中的像素值分为两个类别——通常是“前景”和“背景”或者说0和255。二值化能够简化图像信息&#xff0c;为后续的形态学处理、边缘检测、目标识别等…...

通过Appium理解MCP架构

MCP即Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是由Anthropic公司于2024年11月26日推出的开放标准框架&#xff0c;旨在为大型语言模型与外部数据源、工具及系统建立标准化交互协议&#xff0c;以打破AI与数据之间的连接壁垒。 MCP架构与Appi…...

分享一个Pyside6实现web数据展示界面的效果图

今天又是有问题直接找DS的一天&#xff0c;每日一问&#xff0c;今天我的问题是“怎么将pyside6生成的界面转成web界面&#xff0c;使用python语言实现web界面”&#xff0c;等了一会&#xff0c;DS给我提供了两种方案&#xff0c;方案如下&#xff1a; 然后&#xff0c;让我们…...

FALL靶场通关攻略

1&#xff0c;下载好靶机后打开&#xff0c;通过kali扫描靶机ip和端口&#xff0c;得到靶机ip为192.168.50.144 2&#xff0c;扫描目录 3&#xff0c;访问靶机 4&#xff0c;访问扫描到的test.php,得到缺少GET请求参数的提示 5&#xff0c;使用FUZZ来扫出参数为file 6&#xff…...