302和307重定向的区别是什么?

302 FOUND307 TEMPORARY REDIRECT HTTP响应之间的区别是什么?

W3规范似乎表明它们都用于临时重定向,并且都不能被缓存,除非响应特别允许。

176860 次浏览

区别在于重定向POSTPUTDELETE请求,以及服务器对用户代理行为(RFC 2616)的期望:

注:RFC 1945和RFC 2068指定不允许客户端发送 更改重定向上的方法 请求。然而,大多数现有用户 代理实现将302视为 这是303响应,执行一个 GET Location字段值 不管最初的请求是什么 方法。状态代码是303和307 已添加的服务器,希望 明确地说明是哪一种 的反应是预期的 端。< / em > < / p >

另外,阅读维基百科关于30x重定向代码的文章。

307的出现是因为用户代理采用了事实上的行为来接收收到302响应的POST请求,并向Location响应头发送GET请求。

这是不正确的行为—只有 a303应该导致POST转换为GET。如果最初的POST请求返回302,用户代理在请求新URL时应该(但不)坚持使用POST方法。

引入307是为了允许服务器向用户代理清楚地表明,当客户端遵循Location响应标头时,应该进行方法更改。

307 Internal Redirect在起作用的一个很好的例子是当谷歌Chrome遇到一个对域的HTTP调用,它知道需要严格的传输安全。

浏览器使用与原始调用相同的方法无缝重定向。

HTST 307内部重定向

另外,对于服务器管理员,重要的是要注意,如果使用307重定向,浏览器可能会向用户显示提示。

例如,Firefox和Opera会要求用户允许重定向,而Chrome、IE和Safari会透明地进行重定向。

*per 防弹SSL和TLS(第192页)。

302的预期:重定向使用相同的请求方法POST在NEW_URL

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL

实际302,303:重定向改变请求方法从POST到GET的NEW_URL

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)

307的ACTUAL:重定向在NEW_URL上使用相同的请求方法POST

CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL

在某些用例中,攻击者可能会滥用307重定向来了解受害者的凭据。

更多信息可以在OAuth 2.0的全面形式化安全分析3.1节中找到。

上述论文的作者建议如下:

与OAuth标准中当前的措辞相反,重定向的确切方法不是实现细节,而是对OAuth的安全性至关重要。在HTTP标准(RFC 7231)中,只有303重定向被明确定义为删除HTTP POST请求体。所有其他HTTP重定向状态代码,包括最常用的302,都将保留POST请求和表单数据的选项留给浏览器。在实践中,浏览器通常重写为GET请求,从而丢弃表单数据(307重定向除外)。因此,OAuth标准对于上面提到的步骤应该要求303重定向,以解决这个问题。

流程图

    浏览器将缓存此文件。
    使用示例: URL从/register-form.html移动到signup-form.html
    根据RFC 7231,该方法将更改为GET:“由于历史原因,用户代理可以将后续请求的请求方法从POST更改为GET。”
  • 302:临时重定向。仅用于HTTP/1.0客户端。这个状态代码不应该改变方法,但是浏览器还是做了。 RFC说:“许多http /1.1之前的用户代理不理解[303]。当需要考虑与此类客户机的互操作性时,可以改用302状态码,因为大多数用户代理都像这里描述的303那样对302响应作出反应。当然,一些客户端可能会根据规范实现它,所以如果与这些古老的客户端互操作性不是一个真正的问题,303对于一致的结果更好 <李> 303:临时重定向,将方法更改为GET。
    示例用法:如果浏览器发送POST到/register.php,那么现在加载(GET) /success.html
  • <李> 307:临时重定向,重复相同的请求。
    示例用法:如果浏览器发送了一个POST到/register.php,那么这告诉它在/signup.php重做POST。
  • 308:永久重定向,重复相同的请求。其中307是“无方法更改”;与303对应,此308状态为“无方法更改”。301的对应物。

RFC 7231(2014年起)是非常可读的,不会过于冗长。如果你想知道确切的答案,这本书是推荐阅读的。其他一些答案使用了1999年的RFC 2616,但没有任何变化。

RFC 7238指定308状态。它被认为是实验性的,但它在2016年已经所有主流浏览器均支持了。

最初只有302

响应 浏览器应该做什么
302 Found 用新的url重做请求

这个想法是:

  • 如果你在某个位置执行GET,你会重做你的GET到新的URL
  • 如果你在某个位置执行POST,你会重做你的POST到新的URL
  • 如果你在某个位置执行PUT,你会重做你的PUT到新的URL
  • 如果你在某个位置执行DELETE,你会重做你的DELETE到新的URL

不幸的是,每个浏览器都做错了。当得到302时,它们总是会在新URL处切换到GET,而不是使用相同动词(如。POST)重新尝试请求:

  • Mosaic做错了
  • Netscape复制了Mosaic中的漏洞;所以他们错了
  • ie浏览器复制了Netscape的漏洞;所以他们错了

它变成了实际错误。

所有浏览器302都错了。因此,303307被创建。

响应 浏览器应该做什么 浏览器的功能是什么
302 Found 用新的url重做请求 GET与新url
303 See Other GET与新url GET与新url
307 Temporary Redirect 用新的url重做请求 用新的url重做请求
< / div >

图表形式

5种不同的重定向:

╔═══════════╦════════════════════════════════════════════════╗
║           ║                Switch to GET?                  ║
║           ╟────────────────────────┬───────────────────────╢
║ Temporary ║          No            │         Yes           ║
╠═══════════╬════════════════════════╪═══════════════════════╣
║ No        ║ 308 Permanent Redirect │ 301 Moved Permanently ║
╟───────────╟────────────────────────┼───────────────────────╢
║ Yes       ║ 307 Temporary Redirect │ 303 See Other         ║
║           ║ 302 Found (intended)   │ 302 Found (actual)    ║
╚═══════════╩════════════════════════╧═══════════════════════╝

另外:

响应 切换到get? 暂时的?
301 Moved Permanently 没有 没有
302 Found (目的) 没有 是的
302 Found (实际) 是的 是的
303 See Other 是的 是的
307 Temporary Redirect 没有 是的
308 Permanent Redirect 没有 没有

302是临时重定向,由服务器生成,而307是浏览器生成的内部重定向响应。内部重定向意味着重定向是由浏览器内部自动完成的,基本上在get请求之前,浏览器会自己将输入的url从http更改为https,这样就不会向互联网发出不安全连接的请求。浏览器是否将url更改为https取决于浏览器预安装的hsts预加载列表。你也可以将任何支持https的站点添加到列表中,通过在你自己的浏览器的hsts预加载列表中输入域://net-internals/#hsts。还有一件事,网站域名可以由他们的所有者通过填写https://hstspreload.org/的表格添加到预加载列表中,这样每个用户都可以在浏览器中预装它,尽管我提到过你也可以特别为自己做。

< p > < br > 让我用一个例子来解释:
我向http://www.pentesteracademy.com提出了一个get请求,它只支持https,我在我的浏览器上的hsts预加载列表中没有这个域,因为网站所有者还没有注册它来预装hsts预加载列表。 请求和响应头
GET请求站点的不安全版本被重定向到安全版本(见http头命名的位置在上面的图像中的响应)。
现在我添加网站到我自己的浏览器预加载列表添加它的域在添加hsts域形式在chrome://net-internals/#hsts,这修改了我的个人预加载列表在我的chrome浏览器。请确保为STS选项选择包含子域 现在,在将同一个网站添加到hsts预加载列表后,让我们看看它的请求和响应 请求和响应头 你可以在响应头中看到内部重定向307,实际上这个响应是由你的浏览器而不是服务器生成的。 此外,HSTS预加载列表可以帮助防止用户到达不安全版本的网站,因为302重定向容易受到mitm攻击。
希望我能帮助你更多地了解重定向。

307和302之间的唯一区别是307保证在重定向请求发出时方法和主体不会被更改。对于302,一些旧客户端错误地将方法更改为GET:使用非GET方法和302的行为在Web上是不可预测的,而使用307的行为是可预测的。对于GET请求,它们的行为是相同的。

Reference: 307临时重定向