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

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

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


当前回答

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

401未授权:

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

403禁止:

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

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


其他回答

假设正在使用HTTP身份验证(WWW-Authenticate和Authorization标头),如果以其他用户身份进行身份验证将授予对所请求资源的访问权限,则应返回401 Unauthorized。

403 Forbidden用于禁止所有人访问资源或限制访问给定网络或仅允许通过SSL访问资源,只要与HTTP身份验证无关。

如果HTTP身份验证未被使用,并且服务具有基于cookie的身份验证方案,这是现在的标准,那么应该返回403或404。

关于401,这来自RFC 7235(超文本传输协议(HTTP/1.1):认证):

3.1.401未经授权401(未授权)状态代码表示请求尚未应用,因为它缺少目标资源的有效身份验证凭据。源服务器必须发送一个WWW Authenticate头字段(第4.4节),其中至少包含一个适用于目标资源的质询。如果请求包括认证证书,则401响应指示已拒绝对这些证书的授权。客户端可以使用新的或替换的授权头字段重复请求(第4.1节)。如果401响应包含与先前响应相同的挑战,并且用户代理已经至少尝试了一次身份验证,则用户代理应该向用户呈现随附的表示,因为它通常包含相关的诊断信息。

403(和404)的语义随着时间而改变。这来自1999年(RFC 2616):

10.4.4 403禁止服务器理解该请求,但拒绝履行该请求。授权没有帮助,不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开请求未完成的原因,则应在实体中描述拒绝的原因。如果服务器不希望向客户端提供该信息,则可以使用状态代码404(未找到)。

2014年,RFC 7231(超文本传输协议(HTTP/1.1):语义和内容)改变了403的含义:

6.5.3.403禁止403(禁止)状态代码表示服务器理解请求但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应有效负载(如果有的话)中描述该原因。如果请求中提供了身份验证凭据,则服务器认为这些凭据不足以授予访问权限。客户端不应使用相同的凭据自动重复请求。客户端可以使用新的或不同的凭据重复请求。但是,由于与凭据无关的原因,请求可能被禁止。希望“隐藏”当前存在的禁用目标资源的源服务器可能会以状态代码404(未找到)进行响应。

因此,403(或404)现在可能意味着任何事情。提供新凭据可能会有所帮助。。。或者可能不会。

我相信这一变化的原因是RFC 2616假设在实践中,当今天的Web应用程序使用例如表单和cookie构建自定义身份验证方案时,将使用HTTP身份验证。

考虑到最新的RFC(7231和7235),用例似乎非常清楚(添加了斜体):

401表示未经认证(“缺少有效认证”);即“我不知道你是谁,或者我不相信你是你说的那样。”

401未授权

401(未授权)状态代码表示请求没有已应用,因为它缺少有效的身份验证凭据目标资源。生成401响应的服务器必须发送WWW Authenticate头字段(第4.1节),至少包含一个适用于目标资源的挑战。

如果请求包括认证证书,则401响应表明授权已被拒绝资格证书用户代理可以使用新的或替换了Authorization头字段(第4.2节)。如果401响应包含与先前响应相同的挑战用户代理已经至少尝试了一次身份验证,然后用户代理应向因为它通常包含相关的诊断信息。

403表示未经授权(“拒绝授权”);即“我知道你是谁,但你无权访问此资源。”

403禁止

403(禁止)状态代码表示服务器已理解请求,但拒绝授权公开为什么该请求被禁止可以描述这一点响应有效载荷中的原因(如果有的话)。

如果请求中提供了身份验证凭据服务器认为它们不足以授予访问权限。客户不应自动重复相同的请求资格证书客户可以用新的或不同的重复请求资格证书然而,出于某些原因,请求可能被禁止与证书无关。

希望“隐藏”当前存在的禁用的目标资源可能会以状态代码响应404(未找到)。

!!! 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禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。

我已经为您创建了一个简单的注释,它将使您明白。