对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
考虑到最新的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禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。
丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:
401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。
另一种很好的图片格式,说明如何使用http状态代码。
编辑:RFC2616已过时,请参阅RFC9110。
401未授权:
如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。
403禁止:
服务器理解该请求,但拒绝履行该请求。
从您的用例来看,用户似乎没有经过身份验证。我会返回401。
你又是谁??(程序员走进一个没有ID或ID无效的酒吧)
403:太好了,又是你。我盯着你了。走吧,离开这里。(程序员走进一家86岁的酒吧)