Python 为什么chrome在错误的子域上设置cookie?
我有以下子域:Python 为什么chrome在错误的子域上设置cookie?,python,google-chrome,nginx,cookies,flask,Python,Google Chrome,Nginx,Cookies,Flask,我有以下子域: 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 'A
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;
}
在位置
块上着陆,该块将控制权传递给uwsgi套接字。为api1
和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)
路径
默认设置为“/”
,域
属性在响应中不存在,
samesite
属性也不存在,以上都是根据 如果我错了,请纠正我,但根据我的理解,当
app1
请求api
资源(设置cookie)时,此cookie绑定到app1.example.com
,并且不应出现在app2.example.com
上(反之亦然)
我在铬上观察到的行为是不同的
在app1
request上设置cookie,然后在app2
request上设置cookie(同名),将覆盖app1
上的cookieapp2
子域没有cookie(使用chrome开发者工具检查)
现在,当我更改第二个子域(app2
)的cookie名称时,app2
上仍然不会出现cookie,但是,具有不同名称的第二个cookie现在在app1
子域上可见
看起来无论我做什么,所有cookie都设置在app1
子域上。检查example.com
时也会出现这些cookie
此外,当app2.example.com
向api
发出请求时,它会发回app1
上可见的所有cookie
这种行为正确吗?这是因为服务器端启用了CORS吗?如何区分app1
和app2
之间的cookie
编辑:添加了cors配置代码设置cookie头中的cookie域需要与请求它的主机匹配。CORS和cookie头都是必需的。如果未在设置的Cookie上设置域,浏览器将采用请求主机的FQDN。如果确实设置了域,则可以使用domain=example.com或类似工具在同一域上的站点之间共享cookie 在FQDN主机和主机所在的域上设置相同的cookie名称是可能的,尽管这会让人感到困惑。一个将被发送到该域中的其他主机,两个都将被发送到对同一FQDN的后续调用
我希望您希望cookie位于域上,而不是FQDN上。您应该能够重写apt、app1和app2返回的Set Cookie头,以便它们位于域上。如果可能的话,最好在应用程序本身上修复cookies。你能给我看看你的CORS实现吗?在我看来,您已经遇到了CORS问题。我已经在问题中添加了nginx CORS配置。您可以向我展示以下响应标题:
curl-X OPTIONS'api.example.com'-H“Origin:app1.example.com”-H“访问控制请求方法:GET”-Iv-o/dev/null
,看起来您的CORS实现很好。下面是一个输出。Ofc我已请求适当的资源作为适当的来源,在发布时将其更改为app1
:在中,我的建议您的应用程序中有一些错误,因为您的CORS实现是正确的(但不安全)。您收到了上述请求的有效标题。唉,如果我可以发表评论而不是回答,我会的。但一个人在获得评论权之前有权回答。