python - 为什么 chrome 在错误的子域上设置 cookie?
问题描述
我有以下子域:
api.example.com
app1.example.com
app2.example.com
我使用 nginx 作为 Web 服务器来服务所有这些。api.example.com
是我正在开发的 python-flask 应用程序。app1.example.com
并且app2.example.com
是静态的js内容,不是我开发的。
Nginx 配置为允许跨域资源共享:
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Max-Age' 1728000 always;
add_header 'Content-Type' 'text/plain; charset=utf-8' always;
add_header 'Content-Length' 0 always;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
上方的土地location
块,将控制权传递给 uwsgi 套接字。同样是为api1
and复制粘贴api2
。
app1
并且app2
正在向 , 发出请求api
,并api
在响应其中一些请求时设置 cookie。
Cookie 设置如下:
response.set_cookie(
key='some_cookie_name',
value=some_token,
max_age=current_app.config["JWT_EXP"],
secure=True,
httponly=True)
path
默认情况下设置为'/'
,
domain
属性在响应中不存在,
samesite
属性也不存在,
以上所有根据本文档。
如果我错了,请纠正我,但根据我的理解,当app1
请求一个api
资源(正在设置 cookie)时,这个 cookie 是有界的app1.example.com
并且不应该存在app2.example.com
(反之亦然)。
我在 chrome 上观察到的行为是不同的。
根据请求设置 cookie app1
,然后根据请求设置 cookie(具有相同名称)app2
,会覆盖 cookie 上的app1
. app2
子域不存在 cookie(使用 chrome 开发人员工具检查)。
现在,当我更改第二个子域 ( app2
) 的 cookie 名称时,cookie 仍然不会出现在 上app2
,但是,现在可以在app1
子域上看到具有不同名称的第二个 cookie。
看起来无论我做什么,所有 cookie 都设置在app1
子域上。检查时也会出现这些 cookie example.com
。
此外,当app2.example.com
向它发出请求时,api
它会发回所有可见的 cookie app1
。
这种行为正确吗?是因为在服务器端启用了 CORS 吗?如何在app1
和之间分隔 cookie app2
?
编辑:添加 cors 配置代码
解决方案
set-cookie 标头中的 cookie 域需要与请求它的主机匹配。需要 CORS 和 cookie 标头。如果您没有在 Set-Cookie 上设置域,浏览器将假定所请求主机的 FQDN。如果您确实设置了域,则可以使用 domain=example.com 或类似名称在同一域上的站点之间共享 cookie。
虽然令人困惑,但在 FQDN 主机和主机所在的域上设置相同的 cookie 名称是可能的。一个将被发送到该域中的其他主机,并且两者都将被发送到对同一 FQDN 的后续调用.
我希望您希望 cookie 在您的域上,而不是在 FQDN 上。您应该能够重写 apt、app1 和 app2 返回的 Set-Cookie 标头,以便它们位于域上。如果可能的话,最好在应用程序本身上修复 cookie。
推荐阅读
- java - 上下文初始化失败:创建 bean 时出错
- r - 使用 ggplot 在 R 中创建刺激
- linq - ef core 5.0 如何过滤包含
- ios - 条形按钮项目自定义视图未检测到 UITapGesture
- nginx - prometheus:获取特定端点的延迟
- batch-file - 如何重命名具有特定名称的文件夹并保持大小写
- docker - Dockerfile 服务构建失败:复制失败:构建上下文之外的禁止路径:../../../../*
- excel - VBA - 运行时错误'-2147024894(80070002)'
- javascript - highstock - 点与 Y 轴比例不匹配
- c# - 如何创建在数据库中添加键值的 web 服务的单元测试