最近,Chrome更改了Cookie是否附加到跨域请求的策略。现在,除非以下条件,否则cookie不会附加到跨域请求中:
SameSite
cookie属性是Lax
或None
,并且请求是由用户操作发起的,或者SameSite
cookie属性是None
,而Secure
cookie属性是true
,这意味着跨域请求必须使用https
方案。(上面的命令是正确的,但略有简化。这里是a more thorough writeup。)
在我的开发环境中,我使用一种工具来编译我的开发语言,并将更改重新加载到浏览器选项卡中。该工具在其自己的端口上提供前端代码,而后端通过单独的进程在单独的端口上提供服务,因此我们正在处理从浏览器到后端的跨域请求。自然地,前端和后端都从localhost
使用方案http
进行服务。前端应用程序发出的许多请求不是由用户操作发起的,但出于身份验证的目的仍需要Cookie。
因此,任何需要cookie的东西都无法在我的开发环境中工作。 (是的,花了很长时间弄清楚那个……)
我的问题是:如何以一种简单的方式绕过,变通或禁用开发环境的SameSite
cookie安全限制,而这种方式不会在浏览其他网站时降低安全性? / p>
例如,如果有一种方法可以将localhost
添加到我的浏览器的白名单中,即使没有SameSite=None
属性,也允许Secure=true
cookie,这将是很好的。稍差一些但仍然可以接受的是包装或代理我的http://localhost:<port>
服务的简便方法,以便可以通过https
方案对其进行访问。也许还有另一种方法使用一些晦涩的cookie魔术。
答案 0 :(得分:2)
在撰写本文时,未指定时 Firefox 并未默认 same-site
为 lax
,但 Chrome 可以。可以在此处在 Chrome 中禁用此标志,但警告说这会禁用您访问的所有网站的标志,而不仅仅是您的开发网站。
chrome://flags/#same-site-by-default-cookies
答案 1 :(得分:1)
如果所有开发环境都托管在localhost
下,则在跨端口的不同端口之间的请求仍然算作同一站点。参见:https://web.dev/same-site-same-origin/
在开发环境中,您可以完全删除SameSite=None; Secure
或显式设置SameSite=Lax
。
或者,可以考虑为localhost
或本地vm创建自签名证书,以更好地匹配您的生产环境-尽管涉及的程度稍微多一些。