HTTP规范中403错误的“authorization will not help”是什么意思?

5

HTTP 1.1规范 中提到:

10.4.4 403 Forbidden

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

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

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

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

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

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

1个回答

3

我认为你是正确的,无论授权如何,都应该在请求被拒绝时使用403。

一个例子是防止目录浏览,如此描述:

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

当然也有可能人们在错误地使用403而应该使用401。

401和403之间的区别也在这个其他SO问题中讨论, 那里的共识是:401用于身份验证错误,403用于授权错误

身份验证与授权的问题可能会稍微令人困惑,特别是在规范中说:

10.4.2 401 Unauthorized

请求需要用户身份验证。

我认为关键的区别是:

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

2
据我理解,如果您的IP地址、用户代理或其他一些您无法合理改变的东西被拒绝访问,403也是适当的。401意味着“请使用正确的凭据重试”; 403意味着“走开,我不喜欢你”。 - hobbs
关于 WWW-Authenticate 的要求不应该被过于字面理解,这是规范作者的良好意图,但世界上已经发明了许多不属于 HTTP 认证的身份验证方式。 - hobbs
@hobbs - 你提到的其他情况下403是适当的观点很好。我已经从我的回答中删除了“对于任何用户”的条款,以便集中讨论身份验证与授权的关键区别,并添加了更多关于401与403的解释。 - Ergwun
@hobbs 嗯,这是一个上个千年的规范,但我仍然不确定缺少 WWW-Authenticate 是否会触发任何浏览器的 HTTP 登录对话框... 这个问题 让我想到 Firefox 会呈现这样的登录对话框,但我没有得到任何东西。此外,您的 IP 地址和用户代理难道不是一种松散的“凭据”形式吗? - Camilo Martin
我同意你关于这两者之间区别的最后一点,但是由于规范说“授权不会有帮助”,一个“已授权”的用户代理(不同的IP等)不应该有任何区别。尽管如此,这使得403的潜在用途受到了很大限制。 - Camilo Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接