错误 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 抓取出版物