在302重定向期间发送浏览器cookie

Abd*_*aly 72 cookies http http-status-code-302

在302重定向期间发回cookie是否有任何问题?例如,如果我创建一个return-to-url cookie并在同一个响应中重定向用户,那么任何(现代)浏览器都会忽略cookie吗?

gav*_*koa 45

根据这篇博文:http://blog.dubbelboer.com/2012/11/25/302-cookie.html所有主流浏览器,IE(6,7,8,9,10),FF(17),Safari (6.0.2),Opera(12.11)在Windows和Mac上,在重定向上设置cookie.301和302重定向都是如此.

  • 这取决于同一个站点的策略:严格的情况下它仍然不起作用。 (3认同)
  • 不幸的是,这个列表不包括 Chrome,所以我们不能准确地说_所有_主要浏览器...... (2认同)
  • @MestreLion:在我的Chrome浏览器上可以正常工作。所以..我想我们可以说它终于在2019年生效了。 (2认同)

reg*_*ero 34

大多数浏览器都接受302重定向的cookie.我很确定,但我做了一点搜索.并非所有现代浏览器. Internet存档从Silverlight客户端HTTP堆栈上的已删除/死/ 微软连接 Q/A 链接忽略302重定向响应上的Set-Cookie(2010)

我想我们现在可以替代IE6和它的Windows Mobile浏览器......


Mic*_*čík 31

一个通知(为了节省开发人员的生命):

当cookie的域是localhost时,IE和Edge忽略重定向响应中的Set-Cookie .

解:

使用127.0.0.1而不是localhost.

  • IE和Edge可能已经"修复"了这个问题,因此他们也不会为127.0.0.1设置cookie.卫生署!他们想知道为什么开发人员并不都喜欢IE ...你的答案仍然结束了大约4个小时让我头疼.谢谢! (9认同)

Voj*_*tek 25

我们最近(2022 年 3 月)遇到了这个问题 - Firefox 和 Chrome 都没有立即在 HTTP 302 重定向上设置 cookie。

细节:

  • 我们发送了带有 Set-Cookie 标头的 HTTP 302 重定向,其中包含“SameSite=Strict ”策略和指向同一域的不同路径的位置。
  • 然而,浏览器没有在后续的 GET 请求(重定向的位置)中发送 Cookie,即使它确实位于同一域(第一方请求)。
  • 我们可以从浏览器存储检查选项卡中看到 Cookie,但在 302 响应之后的请求中看不到 Cookie。
  • 当我们刷新页面(或在地址栏中按回车键)时,一切又恢复正常,因为 Cookie 在所有后续请求中都已正确发送。
  • 我们认为这可能是一个错误/未记录的行为。就好像浏览器存储 cookie“有点太晚了”。

我们必须通过客户端重定向来提供 HTTP 200 来解决这个问题:

<!DOCTYPE html>
<html>
<head><meta http-equiv="refresh" content="0; url='REDIRECT_URL'"></head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • @UladzimirShchur 删除 SameSite=strict 不是解决办法。我将其称为解决方法,因为它完全改变了 Cookie 的安全上下文。 (4认同)

lla*_*bda 16

以下是此问题的Chromium错误(对于状态为302的HTTP响应,将忽略Set-cookie).

  • @Michael 注意到 Chromium 不是 Chrome:https://www.lifewire.com/chromium-and-chrome-differences-4172101 - 这意味着虽然它可能在 Chrome 中工作,但对于 Chromium 不一定如此 (2认同)

Mes*_*ion 6

这是一种非常令人讨厌的方法,但如果您真的不想依赖 30x set-cookie 浏览器行为,您可以meta http-equiv="refresh"在设置 cookie 时使用 HTML “重定向”。例如,在 PHP 中:

<?php
    ...
    setcookie("cookie", "value", ...);
    url="page.php";
?>
<html>
<head><meta http-equiv="refresh" content=1;url="<?=$url?>"></head>
<body><a href="<?=$url?>">Continue...</a></body>
</html>
Run Code Online (Sandbox Code Playgroud)

服务器将发送带有 200 的 Set-Cookie 而不是正确的 300x 重定向,因此浏览器将存储 cookie,然后执行“重定向”。<a>如果浏览器不执行元刷新,该链接是后备。


Kir*_*dda 6

我刚刚在 Firefox 和 Safari 上都遇到了这个问题,但在 Chrome 上没有。根据我的测试,这仅在重定向期间域发生更改时发生。这在 OAuth2 流程中很典型:

  1. OAuth2 id 提供程序(GitHub、Twitter、Google)将浏览器重定向回您的应用
  2. 您应用的回调 URL 验证授权并设置登录 cookie,然后再次重定向到目标 URL
  3. 您的目标网址加载时未设置任何 cookie。

由于我还没有弄清楚的原因,请求 2 中的一些 cookie 被忽略,而另一些则没有。但是,如果请求 2 返回带有Refresh标头的 HTTP 200 (“元刷新”重定向),则请求 3 会正确设置 cookie。

  • 我怀疑这个 wrt oauth 回调问题的原因是“samesite=strict”。对于回调请求,浏览器仍然认为发起者是 google (或您使用的任何 oauth 提供商)。因此,如果您在 302 响应中设置了 Samesite=strict Cookie,那么浏览器可能会认为“啊哈!这是从 Google 到您网站的跨站点请求”,因此在请求重定向 URL 时不会发送 Cookie。解决方法是像您所做的那样使用元刷新,以便您的请求来自您自己的站点。我可能会说废话,但这就是我目前的想法。 (5认同)