场景:为了响应不安全(HTTP,而不是 HTTPS)请求,Web 服务器发送域 xxx.com 的页面,其中包含一个 IFRAME,其内容是域 yyy.com 的不安全(HTTP)页面(即
<IFRAME src="http://yyy.com/blah
>) 包含一个 POST-submittable 表单 (<FORM method=post>
)。随着响应,服务器为两个页面发送一个 cookie(xxx.com 和 yyy.com 的Set-Cookie
),两个Set-Cookie
标头都包含SameSite=none
attibute.
但是,当从 IFRAME 页面中提交表单时,对服务器的 HTTP POST 请求不包含发送到 yyy.com 的 cookie(通过检查浏览器和 Web 服务器之间的流量来验证)。
此行为在 Firefox 和 Chrome 上都很明显,因此似乎是浏览器标准。
我很困惑;我认为 Web 服务器发送的
SameSite=none
属性应该向浏览器表明,每当浏览器对该源页面的 URL 发出 GET 或 POST 请求时,它必须发送属于 IFRAME 源页面的 cookie(无论该请求中的 referrer
行是否具有相同的 URL 或另一个域的 URL)。
所以我需要解释为什么这不起作用,如果有原因,如何解决问题。谢谢
预期:属于 IFRAME 的 src 页面的 cookie 与来自该页面的 POST 请求(表单提交)一起发送
您遇到的行为是预期的,是 cookie 中的 SameSite 属性和浏览器对跨站点请求的默认行为的结果。
当一个 cookie 的 SameSite 属性设置为“无”时,这意味着该 cookie 可以在跨站点请求中发送。但是,跨站点 POST 请求还有一个额外的要求。在现代浏览器中,当从 iframe 发出跨站点 POST 请求时,浏览器不会在请求中包含 cookie,除非 SameSite 属性设置为“None”并且 Secure 属性也存在。这意味着即使您设置了 SameSite=none,cookie 也不会与来自 iframe 的 POST 请求一起发送,因为它不是通过 HTTPS 提供的。
要解决此问题,您需要确保父页面 (xxx.com) 和 iframe 页面 (yyy.com) 均通过 HTTPS 提供服务。这意味着应该使用“https://”URL 而不是“http://”来访问这些页面。通过 HTTPS 同时提供父页面和 iframe 页面,浏览器将在 POST 请求中包含 cookie。
综上所述,要实现预期的行为:
按照这些步骤,浏览器应按预期在来自 iframe 页面的 POST 请求中包含 cookie。