协慌网

登录 贡献 社区

403 Forbidden vs 401 Unauthorized HTTP 响应

对于存在的网页,但对于没有足够权限的用户(他们未登录或不属于正确的用户组),要提供的正确 HTTP 响应是什么? 401? 403?别的什么?到目前为止,我对每个人的看法都不太清楚。哪些用例适合每个响应?

答案

Daniel Irvine 的清晰解释:

401 Unauthorized存在问题,这是用于身份验证错误的 HTTP 状态代码。就是这样:它用于身份验证,而不是授权。收到 401 响应是服务器告诉您,“您未经过身份验证 - 要么未经过身份验证,要么未经过身份验证 - 但请重新进行身份验证并重试。” 为了帮助您,它将始终包含一个描述的WWW-Authenticate标头如何进行身份验证。

这是您的 Web 服务器通常返回的响应,而不是您的 Web 应用程序。

这也是非常暂时的; 服务器要求您再试一次。

因此,对于授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑联系在一起,而且它比 401 更具体。

收到 403 响应是服务器告诉你,“对不起。我知道你是谁 - 我相信你说的是谁 - 但你只是没有权限访问这个资源。也许如果您很好地询问系统管理员,您将获得许可。但是,在你的困境发生变化之前,请不要再打扰我了。“

总之, 401 Unauthorized响应应该用于丢失或错误的身份验证,之后,当用户通过身份验证但无权对给定资源执行请求的操作时,应使用403 Forbidden响应。

关于如何使用 http 状态代码的另一个很好的图形格式

参见RFC2616

401 未经授权:

如果请求已包含授权凭据,则 401 响应表示已拒绝这些凭据的授权。

403 禁止:

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

更新

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


编辑: RFC2616已过时,请参阅RFC7231RFC7235

缺少其他答案的一点是,必须理解 RFC 2616 上下文中的身份验证和授权仅涉及 RFC 2617 的 HTTP 身份验证协议. HTTP 状态代码不支持 RFC2617 以外的方案的身份验证,因此不予考虑在决定是否使用 401 或 403 ..

简短而简洁

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

这意味着如果您拥有自己的滚动登录过程并且从不使用 HTTP 身份验证,则 403 始终是正确的响应,并且永远不应使用 401。

详细而深入

来自 RFC2616

10.4.2 401 未经授权

该请求需要用户身份验证。响应必须包含 WWW-Authenticate 头字段(第 14.47 节),其中包含适用于所请求资源的质询。客户端可以使用合适的 Authorization 头字段重复请求(第 14.8 节)。

10.4.4 403 禁止服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。

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

所以真正的区别不在于问题是什么,甚至是否有解决方案。不同之处在于服务器期望客户端下一步做什么。

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

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


编辑: RFC2616已过时,请参阅RFC7231RFC7235