对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?

401未授权?403禁止?还有别的吗?

到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?


当前回答

丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:

401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。

另一种很好的图片格式,说明如何使用http状态代码。

其他回答

编辑:RFC2616已过时,请参阅RFC9110。

401未授权:

如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。

403禁止:

服务器理解该请求,但拒绝履行该请求。

从您的用例来看,用户似乎没有经过身份验证。我会返回401。


其他答案缺少的是,必须理解RFC 2616上下文中的认证和授权仅指RFC 2617的HTTP认证协议。HTTP状态代码不支持RFC2617以外的方案进行认证,并且在决定是否使用401或403时不考虑。

Brief和Terse

未授权表示客户端未通过RFC2617认证,服务器正在启动认证过程。Forbidden表示客户端已通过RFC2617认证且没有授权,或者服务器不支持请求资源的RFC2617。

也就是说,如果您拥有自己的登录过程,并且从不使用HTTP身份验证,那么403始终是正确的响应,而401永远不应该使用。

详细和深入

来自RFC2616

10.4.2 401未授权请求需要用户身份验证。响应必须包括WWW Authenticate报头字段(第14.47节),该字段包含适用于所请求资源的质询。客户端可以使用适当的授权头字段重复请求(第14.8节)。

and

10.4.4 403禁止服务器理解该请求,但拒绝履行。授权不会有帮助,不应重复该请求。

首先要记住的是,本文档中的“身份验证”和“授权”特指RFC 2617中的HTTP身份验证协议。它们不引用您可能使用登录页面等创建的任何滚动您自己的身份验证协议。我将使用“登录”来引用除RFC2617以外的方法进行的身份验证和授权

因此,真正的区别不在于问题是什么,甚至不在于是否有解决方案。区别在于服务器希望客户端接下来做什么。

401指示无法提供资源,但服务器正在请求客户端通过HTTP身份验证登录,并已发送回复标头以启动进程。可能存在允许访问资源的授权,也可能没有,但让我们尝试一下,看看会发生什么。

403指示不能提供资源,并且对于当前用户来说,没有办法通过RFC2617来解决这一问题,也没有尝试的意义。这可能是因为已知没有足够的认证级别(例如,由于IP黑名单),但也可能是因为用户已经认证且没有权限。RFC2617模型是一个用户,一个证书,因此可以忽略用户可能具有可被授权的第二组证书的情况。它既不暗示也不暗示某种登录页面或其他非RFC2617认证协议可能有帮助,也可能没有帮助,这超出了RFC2616标准和定义。


编辑:RFC2616已过时,请参阅RFC7231和RFC7235。

我对它的看法与公认的答案略有不同。

当认证失败时返回403,当授权失败时返回401,这似乎更符合语义和逻辑。

我的理由如下:

当您请求认证时,您有权提出该请求。你需要这样做,否则一开始就没有人能够通过认证。

如果您的身份验证失败,您将被禁止,这是有意义的。

另一方面,被禁止者也可以申请授权,但假设您已通过身份验证,但无权访问特定端点。返回401 Unauthorized似乎更有意义。

对于失败的身份验证尝试,Spring Boot的安全性返回403

!!! DEPR:答案反映了直到2014年以前的普遍做法!!!

TL;博士

401:与身份验证有关的拒绝403:拒绝与身份验证无关

实际示例

如果apache需要身份验证(通过.htaccess),并且您单击“取消”,则它将响应401“所需授权”

如果nginx找到了一个文件,但没有读取/访问该文件的访问权限(用户/组),那么它将响应403 Forbidden

RFC(2616第10节)

401未授权(10.4.2)

含义1:需要认证

请求需要用户身份验证。。。

含义2:身份验证不足

…如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。。。

403禁止(10.4.4)

含义:与身份验证无关

…授权没有帮助。。。

更多详情:

服务器理解该请求,但拒绝履行该请求。

应说明实体拒绝的原因

可以改用状态代码404(未找到)

(如果服务器希望将此信息保留给客户端)

在401对403的情况下,这已经得到了多次回答。这本质上是一场“HTTP请求环境”辩论,而不是“应用程序”辩论。

您自己的登录问题(应用程序)似乎有问题。

在这种情况下,仅仅不登录不足以发送401或403,除非您使用HTTP Auth与登录页面(与设置HTTP Auth无关)。听起来您可能正在寻找一个“201已创建”,其中有一个滚动您自己的登录屏幕(而不是请求的资源),用于应用程序级访问文件。上面写着:

“我听到了,它在这里,但试试这个(不允许你看到)”