深入解析 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_response
app = Flask(__name__)
@app.route('/')
def set_cookie():
response = make_response("Partitioned Cookie Set!")
# 设置 Partitioned Cookie
response.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 response
if __name__ == '__main__':
app.run(ssl_context='adhoc')
2. Django 示例
from django.http import HttpResponse
def 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 优化隐私和功能吧!