gpt4 book ai didi

python - 为什么 chrome 在错误的子域上设置 cookie?

转载 作者:行者123 更新时间:2023-12-03 16:56:10 24 4
gpt4 key购买 nike

我有以下子域:

api.example.com
app1.example.com
app2.example.com

我使用 nginx 作为 Web 服务器来服务所有这些。 api.example.com是我正在开发的 python-flask 应用程序。 app1.example.comapp2.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 上方的土地 block ,它将控制权传递给 uwsgi 套接字。 api1 的复制粘贴相同和 api2 .
app1app2正在向 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属性也不存在,
以上均根据 this documentation .

如果我错了,请纠正我,但根据我的理解,当 app1请求 api资源(正在设置 cookie),此 cookie 绑定(bind)到 app1.example.com并且不应出现在 app2.example.com 上(反之亦然)。

我在 chrome 上观察到的行为是不同的。

app1 上设置 cookie请求,然后在 app2 上设置 cookie(同名)请求,覆盖 app1 上的 cookie . app2子域不存在 cookie(使用 chrome 开发人员工具检查)。

现在,当我更改第二个子域 ( app2) 的 cookie 名称时, app2 上仍然不会出现 cookie。 ,但是,现在可以在 app1 上看到具有不同名称的第二个 cookie。子域。

看起来无论我做什么,所有 cookie 都设置在 app1子域。检查 example.com 时也会出现这些 cookie。 .

此外,当 app2.example.comapi 提出请求它发回在 app1 上可见的所有 cookie .

这种行为正确吗?是因为在服务器端启用了 CORS 吗?如何分隔 app1 之间的 cookie和 app2 ?

编辑:添加 cors 配置代码

最佳答案

set-cookie header 中的 cookie 域需要与请求它的主机匹配。需要 CORS 和 cookie header 。如果您没有在 Set-Cookie 上设置域,浏览器将假定所请求主机的 FQDN。如果您确实设置了域,则可以使用 domain=example.com 或类似名称在同一域上的站点之间共享 cookie。

尽管令人困惑,但在 FQDN 主机和主机所在的域上设置相同的 cookie 名称是可能的。一个将被发送到该域中的其他主机,并且两者都将被发送到对同一 FQDN 的后续调用.

我希望您希望 cookie 在您的域上,而不是在 FQDN 上。您应该能够重写 apt、app1 和 app2 返回的 Set-Cookie header ,以便它们位于域上。如果可能的话,最好在应用程序本身上修复 cookie。

关于python - 为什么 chrome 在错误的子域上设置 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54983817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com