深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute)
深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute)
最新发现flask3.1.0 的版本引入了新的特性:对CHIPS的支持。不少同学对这个可能有点陌生,本文带大家了解一下。
为了在隐私保护和功能需求之间取得平衡,Google 推出了 CHIPS(Cookies Having Independent Partitioned State) 标准。它通过引入 Partitioned Cookie Attribute,允许跨站点环境下的独立 Cookie 存储,为特定场景提供隐私友好的解决方案。
一、CHIPS 的起源
传统的 Cookie 存储机制包括 第一方 Cookie 和 第三方 Cookie:
- 第一方 Cookie:由用户访问的站点设置,用于会话管理、用户偏好等。
- 第三方 Cookie:由嵌入到站点中的第三方资源(如广告或分析脚本)设置,用于跨站跟踪。
由于隐私问题,浏览器开始逐步限制第三方 Cookie。例如:
- Safari 的 Intelligent Tracking Prevention (ITP)。
- Firefox 的 Enhanced Tracking Protection (ETP)。
- Chrome 的计划(Privacy Sandbox)将逐步淘汰第三方 Cookie。
然而,限制第三方 Cookie 会导致某些合法的跨站点功能失效,例如嵌入式服务的会话保持。为了满足这些场景的需求,CHIPS 应运而生。
二、CHIPS 的目的
CHIPS 的主要目标是为跨站点环境下的 Cookie 存储提供一种隐私友好的解决方案:
- 隐私保护:通过分区存储,避免第三方 Cookie 被用于跨站追踪。
- 功能性支持:允许跨站点场景(如嵌入式内容)拥有独立的 Cookie 存储,不受其他站点的干扰。
- 兼容性:减少浏览器对传统跨站点功能的影响,确保用户体验。
三、CHIPS 的设计
CHIPS 的核心设计是引入了 Partitioned 属性,用于定义 Cookie 的存储隔离规则:
1. 分区机制
- 在跨站点请求中,浏览器为每个 Top-Level Origin(顶级站点) 和 Embedded Origin(嵌入站点) 创建独立的 Cookie 分区。
- 分区的关键由
(Top-Level Origin, Embedded Origin)
组成。例如:- 用户在
example.com
页面嵌入了iframe.analytics.com
。 - 分区后,
analytics.com
在example.com
中的 Cookie 不会与analytics.com
在其他站点的 Cookie 冲突。
- 用户在
2. Partitioned 属性
CHIPS 的关键属性是 Partitioned
,它必须与 SameSite=None; Secure
一起使用。示例:
Set-Cookie: user_session=abc123; Path=/; Secure; SameSite=None; Partitioned
- Secure:必须通过 HTTPS 设置。
- SameSite=None:允许跨站点访问。
- Partitioned:指定 Cookie 为分区 Cookie。
四、CHIPS 的工作原理
-
设置 Partitioned Cookie
- 在 HTTP 响应头中返回带有
Partitioned
属性的 Cookie。 - 浏览器将为特定的
(Top-Level Origin, Embedded Origin)
创建独立的 Cookie 存储。
- 在 HTTP 响应头中返回带有
-
存储和检索
- 当用户访问
example.com
页面,嵌入的iframe.analytics.com
会使用其自己的 Cookie 分区。 - 即使用户访问其他顶级站点(如
another.com
)也嵌入了iframe.analytics.com
,它的 Cookie 状态是独立的。
- 当用户访问
-
隐私保证
- Cookie 的分区存储仅限于当前顶级站点上下文,无法用于跨站追踪。
五、CHIPS 的实际应用
1. 嵌入式第三方服务
场景:嵌入到站点的第三方支付、聊天工具等需要维持用户的会话状态,但不能访问其他站点的用户信息。
2. 广告网络优化
广告平台可以为每个顶级站点独立存储用户的点击数据,避免与其他站点数据混合。
3. 分析工具
像 Google Analytics 这样的工具可以使用 Partitioned Cookie 来跟踪同一顶级站点内的用户活动,同时避免跨站点的隐私问题。
六、如何在后端使用 CHIPS
以下是使用 Python 的 Web 框架(Flask 和 Django)的示例,展示如何在后端设置 Partitioned Cookie。
1. Flask 示例
from flask import Flask, make_responseapp = Flask(__name__)@app.route('/')
def set_cookie():response = make_response("Partitioned Cookie Set!")# 设置 Partitioned Cookieresponse.set_cookie('user_session', 'abc123', path='/', secure=True, samesite='None', httponly=True)response.headers.add('Set-Cookie', 'user_session=abc123; Path=/; Secure; SameSite=None; Partitioned')return responseif __name__ == '__main__':app.run(ssl_context='adhoc')
2. Django 示例
from django.http import HttpResponsedef set_cookie(request):response = HttpResponse("Partitioned Cookie Set!")response.set_cookie('user_session','abc123',path='/',secure=True,samesite='None',httponly=True)# 手动添加 Partitioned 属性response['Set-Cookie'] = 'user_session=abc123; Path=/; Secure; SameSite=None; Partitioned'return response
七、如何在前端使用 CHIPS
前端开发者需要确保以下几点:
- 确保通过 HTTPS 加载页面和嵌入内容:
Secure
属性要求 Cookie 只能通过 HTTPS 传输。 - 正确配置 SameSite 属性:必须设置为
SameSite=None
。 - 加载 iframe 或嵌入资源时传递 Cookie:
- 使用
<iframe>
标签时,需指定allow
属性:<iframe src="https://analytics.com" allow="partitioned-cookies"></iframe>
- 或在
fetch
请求中指定credentials: 'include'
:fetch('https://analytics.com/data', {credentials: 'include' });
- 使用
八、CHIPS 的优势与局限性
优势
- 隐私友好:解决了跨站点 Cookie 滥用问题。
- 支持合法跨站场景:如嵌入式服务、支付网关等。
- 与现代隐私政策兼容:符合 GDPR 等隐私法规的要求。
局限性
- 浏览器兼容性:目前仅部分现代浏览器支持 CHIPS。
- 复杂性增加:开发者需要额外配置 Cookie 和跨站请求。
九、总结
CHIPS 提供了一种隐私友好的跨站点 Cookie 管理方式,通过分区存储解决了传统第三方 Cookie 的隐私问题。在 Web 应用中,开发者可以通过后端设置带有 Partitioned
属性的 Cookie,并在前端正确传递和管理这些 Cookie,实现安全可靠的跨站功能。
随着 Web 隐私标准的不断演进,CHIPS 将成为构建现代 Web 应用的关键工具之一。如果你的应用需要支持跨站场景,赶快尝试使用 CHIPS 优化隐私和功能吧!
相关文章:

深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute)
深入解析 Web 应用中的 CHIPS(Partitioned Cookie Attribute) 最新发现flask3.1.0 的版本引入了新的特性:对CHIPS的支持。不少同学对这个可能有点陌生,本文带大家了解一下。 为了在隐私保护和功能需求之间取得平衡,Goo…...

从搭建uni-app+vue3工程开始
技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader,注意需要版本10,…...

归并排序与逆序对问题(C语言版)
一、引言 归并排序是一种高效且稳定的排序方法,而逆序对问题是算法领域的一个经典问题,本文教大家如何实现归并排序,以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解:将待排序的数组分成两半,…...

网络爬虫总结与未来方向
通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 1. 网络爬虫技术发展趋势 1.1 趋势一:高性能分布式爬虫 随…...

C++ 核心数据结构:Stack 与 Queue 类深度解析
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 目录 💯前言 💯Stack 类 (一)Stack 类的概念与特点 (二&#x…...

Python枚举类详解:用enum模块高效管理常量数据
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 在编程中,常量的管理是一个关键环节,合理的管理常量可以提高代码的可读性和可维护性。Python的enum模块提供了一种有效的方式来组织常量数据,通过枚举类(Enum)将相关的常量值集合在一起,使代码更具结…...

企业OA管理系统:Spring Boot技术深度探索
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力
故障现象 一辆2012款路虎揽胜运动版车,搭载3.0T柴油发动机(型号为306DT),累计行驶里程约为10.2万km。车主进厂反映,车辆行驶中加速无力,且发动机故障灯异常点亮。 故障诊断 接车后试车,发动…...

uniapp接入高德地图
下面代码兼容安卓APP和H5 高德地图官网:我的应用 | 高德控制台 ,绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…...

(UI自动化测试)web自动化测试
web自动化测试 UI自动化测试介绍 自动化测试理论: 图片上的文字等等不能做测试,只能发现固定的bug 工具选择及介绍 浏览器驱动:找元素--核心:驱动(操作元素)--通过代码...

【es6进阶】如何使用Proxy实现自己的观察者模式
观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。这里,我们是使用es6的proxy及reflect来实现这个效果。 实现效果 业务分析 源数据 const object2 {name: "张三"…...

住宅IP怎么在指纹浏览器设置运营矩阵账号
矩阵账号的运营已经成为了许多企业和个人推广策略中的重要一环。通过构建和管理多个社交媒体或电商平台的账号,可以有效地扩大品牌影响力,提高市场覆盖率。然而,随着平台对账号关联的限制越来越严格,如何安全、有效地运营这些矩阵…...

表格数据处理中大语言模型的微调优化策略研究
论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型(LLMs)在处理表格数据时的微调优化策略。具体来说,论文探讨了以下…...

CentOS7 如何查看kafka topic中的数据
1. 确保 Kafka 服务运行 先检查 Kafka 和 Zookeeper 是否正在运行: systemctl status kafka systemctl status zookeeper 如果没有启动,先启动服务: systemctl start zookeeper systemctl start kafka 2. 进入 Kafka 安装目录 通常 …...

VRRP实现出口网关设备冗余备份
VRRP虚拟路由冗余 vrrp实现设备主备备份 Tips: VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份。协议版本: VRRPV2 (常用)和VRRPV3:VRRPV2仅适用于IPv4…...

超详细:Redis分布式锁
如何基于 Redis 实现一个最简易的分布式锁? 不论是本地锁还是分布式锁,核心都在于“互斥”。 在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中的 setIfAbsent 方法),如果 key 不存在…...

Vue与React的Suspense组件对比
在Vue和React中都内置了Suspense组件,该组件用于处理异步组件加载。当Suspense包裹的实际组件内容尚未加载完成时会先展示后备内容,等待组件内容加载完成后再切换成实际组件内容。这可以显著提升用户体验,适用于大数据加载、组件懒加载等场景…...

Spring框架深度剖析:特性、安全与优化
文章目录 Spring框架简介主要特性1. 依赖注入(Dependency Injection, DI)2. 面向切面编程(Aspect-Oriented Programming, AOP)3. 声明式事务管理4. 强大的MVC框架5. 集成测试支持6. 多种数据访问技术的支持 安全性1. 认证…...

硬盘文件误删:全面解析、恢复方案与预防策略
一、硬盘文件误删现象概述 在日常使用电脑的过程中,硬盘文件误删是许多用户都曾遇到过的问题。这种意外的数据丢失,不仅可能让我们辛苦编辑的文档、珍贵的照片和视频等瞬间消失,还可能对工作和生活造成重大影响。硬盘文件误删,如…...

tcpdump抓包 wireShark
TCPdump抓包工具介绍 TCPdump,全称dump the traffic on anetwork,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 2、支持网络层…...

Android system_server进程
目录 一、system_server进程介绍 二、system_server进程启动流程 2.1 startBootstrapServices 2.2 startCoreServices 2.3 startOtherServices 2.4 startApexServices 三、如何使用系统服务 3.1 app进程调用系统服务 3.2 native进程调用系统服务 3.3 system_server进…...

Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
1、前言 在 Vue 3 项目中结合 vue-i18n 和 Element Plus 实现中英文切换是一个常见的需求。下面是一个详细的步骤指南,帮助你完成这个任务。 安装引入 1. 安装依赖 首先,你需要安装 vue-i18n 和 Element Plus。 npm install vue-i18nnext element-p…...

python实现猜数字游戏( 可视化easygui窗口版本 )
1.先上源代码 import random import easygui as egdef guess_ordinary():answer random.randint(0, 11)user_answer int(eg.enterbox(msg "请在0-10中选择一个整数: ", title "猜数字"))if user_answer answer:eg.msgbox(msg "恭喜你ÿ…...

自由学习记录(23)
Lua的学习 table.concat(tb,";") 如果表里带表,则不能拼接,表里带nil也不能,都会报错 true和false也不可以,数字和字符串可以 if要和一个end配对,所以 if a>b then return true end end 两个end …...

Java语言程序设计 选填题知识点总结
第一章 javac.exe是JDK提供的编译器public static void main (String args[])是Java应用程序主类中正确的main方法Java源文件是由若干个书写形式互相独立的类组成的Java语言的名字是印度尼西亚一个盛产咖啡的岛名Java源文件中可以有一个或多个类Java源文件的扩展名是.java如果…...

鸿蒙生态:开发者的新蓝海与挑战
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

4.3 MySQL 存储函数
存储函数是一种数据库对象,允许用户将常用的 SQL 逻辑封装为可复用的函数,通过调用函数完成特定的计算或业务逻辑。 1. 简介 1.1 什么是存储函数 存储函数(Stored Function)是用户定义的一段 SQL 逻辑,返回一个值&am…...

【Python刷题】动态规划相关问题
动态规划(Dynamic Programming,简称 DP)是一种用于解决多阶段决策最优化问题的算法策略。它通过把原问题分解为相对简单的子问题,记录子问题的解(通常使用表格等数据结构存储),避免重复计算&…...

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析
一、单选题 1、下面代码运行后出现的图像是?( ) import matplotlib.pyplot as plt import numpy as np x np.array([A, B, C, D]) y np.array([30, 25, 15, 35]) plt.bar(x, y) plt.show() A. B. C. D. 正确答案:A 答案…...

论文阅读:SIMBA: single-cell embedding along with features
Chen, H., Ryu, J., Vinyard, M.E. et al. SIMBA: single-cell embedding along with features. Nat Methods 21, 1003–1013 (2024). 论文地址:https://doi.org/10.1038/s41592-023-01899-8 代码地址:https://github.com/pinellolab/simba. 摘要 大多…...