错误 403 的 HTTP 规范中的“授权无济于事”是啥意思?

Posted

技术标签:

【中文标题】错误 403 的 HTTP 规范中的“授权无济于事”是啥意思?【英文标题】:What does mean "authorization will not help" in the HTTP spec for error 403?错误 403 的 HTTP 规范中的“授权无济于事”是什么意思? 【发布时间】:2014-01-08 18:02:19 【问题描述】:

HTTP 1.1 spec 说:

10.4.4 403 禁止

服务器理解请求,但拒绝执行它。授权无济于事,并且不应重复请求。 [...]

这是否仅表示“基本授权”,如WWW-Authenticate: Basic?如果其他用户可能通过基本 HTTP 身份验证以外的方式(例如通过他的会话 cookie、OpenID 等)访问被拒绝资源的资源,是否应该发出 403?

我问这个是因为 HTTP 401 说...

响应必须包含 WWW-Authenticate header 字段

...我不确定我是否应该添加像 WWW-Authenticate: Custom 这样的标题。

许多人似乎都使用 403,即使在一个简单的 cookie 可以使资源可用的情况下也是如此。他们都错了吗?

【问题讨论】:

【参考方案1】:

我相信你是对的,无论授权如何,当请求被拒绝时都应该使用 403。 一个示例用法是防止目录浏览,如下所述:

http://www.checkupdown.com/status/E403.html

当然有可能人们在应该使用 401 的地方错误地使用它。

401和403的区别也在this other SO question讨论, 其中的共识是 401 用于身份验证 错误,403 用于授权错误

身份验证与授权的问题可能有点令人困惑,尤其是当the spec 说:

10.4.2 401 未经授权

请求需要用户身份验证。

我认为关键的区别是:

401 表示您未获得授权因为您没有正确的身份验证 403 表示您未获得授权无论身份验证如何

【讨论】:

据我了解,如果拒绝访问您的 IP 地址、您的用户代理或您不合理期望更改的其他内容,则 403 也是合适的。 401 表示“使用正确的凭据重试”; 403的意思是“走开,我不喜欢你。” 关于WWW-Authenticate 的要求不应该过于字面意思,这是规范作者的良好意图,但是世界已经发明了很多通过 HTTP 进行身份验证的方法,但这些方法并不是实际上是 HTTP 身份验证。 @hobbs - 关于其他适合 403 的场景,这是一个很好的观点。我从答案中删除了“针对任何用户”的条款,以关注身份验证与授权的关键区别,并添加了更多关于 401 与 403 的解释。 @hobbs 好吧,这是上个千年的规范,但我仍然不确定缺少 WWW-Authenticate 是否会触发来自任何浏览器的 HTTP 登录对话框...This question 让我认为 Firefox 会显示这样一个登录对话框,但我没有得到任何。另外,您的 IP 地址和用户代理不会是一种松散的“凭据”吗? 我同意你关于两者之间区别的最后一点,但由于规范说“授权无济于事”,“授权”用户代理(不同的 IP 等)不应该使一个区别。尽管如此,这还是让 403 的潜在用途非常有限。

以上是关于错误 403 的 HTTP 规范中的“授权无济于事”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 Web 中的问题 HTTP 错误 403 抓取出版物

403 错误怎么解决?

Python 3,urlopen - HTTP 错误 403:禁止

获取 Http 403.14 错误

缺少目录索引时的 404 与 403

网络抓取 ESPN 的 NBA 数据时,有没有办法修复 HTTP 错误 403?