我正在开发一个本地开发项目,其中有一个在端口 4200 上运行的 Angular 前端和在端口 3000 上运行的 Express 后端,两者都通过 HTTP 提供服务。我需要使用 SameSite=None 的 cookie 来允许浏览器接受并保存从后端发送的
cookie
以进行会话管理。但是,Microsoft Edge 强制执行以下规则:带有 SameSite=None
的 cookie 必须设置为 Secure=true
,才能接受从后端发送的 cookie。
我尝试在Edge的edge://flags设置中禁用“没有SameSite的Cookies必须是安全的”标志,但似乎这个标志在最近的版本中已被删除。我目前使用的是边缘版本
Version 131.0.2903.146 (Official build) (64-bit)
有没有办法可以绕过这个问题,以便我可以测试 cookie 的处理方式?这是我当前的“express-session”配置供参考:
app.use(session({
name: 'express-session-id',
secret: process.env.session_secret,
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
secure: false,
httpOnly: true,
maxAge: 1000 * 60 * 3,
sameSite: 'none'
}}));
问题:
1- 有没有办法在本地开发过程中在不使用 HTTPS 的情况下禁用 Microsoft Edge 中的 SameSite cookie 强制执行?
2- 如果没有,在使用 HTTP 时我必须使用 SameSite=None 来测试跨域 cookie 的替代方法是什么?
3-是否有任何开发人员工具或解决方法可以暂时绕过此限制?
我尝试过的:
1- 在我的会话 cookie 配置中设置 secure: false。
2- 在edge://flags 中搜索标志以禁用 SameSite 强制执行。
我已经检查了其他类似的问题,但是所有答案似乎都已过时,因为 Edge 已更新,是否有更新的解决方案?或者有什么更快的解决办法吗?
如果有类似的问题我错过了答案,请指出我!
提前致谢!
正如@heiko 在他的评论中指出的:
http:localhost:3000
和 http:localhost:4200
被视为同一站点且交叉来源。这意味着在设置 cookie 配置时,鉴于请求是从同一站点上的另一个端口发送的,SameSite
字段可以设置为 strict
,使其成为 SameSite
。
代码更改:
cookie: {
secure: false,
httpOnly: true,
maxAge: 1000 * 60 * 3,
sameSite: 'strict' // Right here, changed from 'none' to 'strict'
}}));
对于遇到同样问题的人来说,这是一个深入的答案:
理解术语
同一站点: “同一站点”是指在同一可注册域内发出的请求,忽略协议、端口和子域。
例如,
http://example.com
和 https://example.com
被视为“同一站点”,因为域 (example.com
) 匹配。
同样,http://localhost:3000
和http://localhost:4200
是“同一站点”,因为它们共享相同的基域:localhost
。
这个概念主要在处理 cookie 和 SameSite 属性时相关,该属性确定 cookie 是通过跨站点还是同站点请求发送。
跨源: “跨源”是一个更严格的术语。要使两个 URL 被视为同源,它们的协议、域和端口必须全部匹配。
由于
http://localhost:3000
和 http://localhost:4200
使用不同的端口,因此它们是跨域的。
这种区别对于同源策略和 CORS(跨源资源共享)等浏览器安全功能至关重要,这些功能控制资源是否可以在不同源之间共享。