Cookie 未存储在 Safari 中的本地主机子域中

问题描述 投票:0回答:2

我的 SvelteKit Web 应用程序运行在 http://www.projectname.localhost:3000/ 上,Django 后端运行在 http://api.projectname.localhost:8000/ 上。我已经这样配置了 Django:

SESSION_COOKIE_SECURE = False
SESSION_COOKIE_DOMAIN = ".projectname.localhost"

当我从前端向后端发出登录请求时,响应中有一个

set-cookie
标头,其中包含正确的会话 cookie:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://www.projectname.localhost:3000
Set-Cookie: session_id=some_value_here; Domain=.projectname.localhost; expires=Fri, 10 Mar 2023 13:43:56 GMT; HttpOnly; Max-Age=2592000; Path=/; SameSite=Lax

据我所知,一切都很好,这应该工作,但cookie实际上并没有存储在Safari中,我也没有登录。但是,它在Chrome中运行良好。

知道什么可能导致 cookie 未存储在 Safari 中吗?我做错了什么?

cookies safari sveltekit
2个回答
0
投票

我在使用 Firefox 时遇到了同样的问题。最后我不得不使用

SameSite: 'none'
Secure: true
让它工作。

我还没有检查这有多安全,但是对于本地主机,我认为这没什么大不了的。


0
投票

这是一个互联网域名后缀问题。您正在使用

localhost
的后缀(或顶级域),Safari 不会为这个无法识别的值保存 cookie。

前一段时间,对于具有

.local
顶级域的代码示例,我遇到了类似的问题。它涉及将域添加到本地计算机的主机文件。

解决方法

通过更新为

.com
后缀,Safari 问题解决了,我的例子成功了。

127.0.0.1  www.example.com api.example.com

总结

此行为特定于 Safari 实现,但似乎未被 Apple 记录。这个词你google一下会发现类似的问题,其他主流浏览器都没有这个问题:

safari tld cookies

更一般

关于 cookie 的规则在最近对 RFC6265 的更新中得到了非常优雅的解释。它描述了一个公共后缀列表,用户代理拒绝 cookie 的原因有多种,尤其是当同站点规则将它们归类为第三方时。

在某些地方,最近的浏览器限制超出了规范。 Apple 的 TLD 行为就是一个例子。除非使用真实世界的 TLD,否则拒绝 cookie 感觉是合理的。我想这只是开发人员在设计开发设置时需要注意的事情。

© www.soinside.com 2019 - 2024. All rights reserved.