401 Unauthorized vs 403 Forbidden:当用户尚未登录时,哪个是正确的状态代码?

时间:2018-05-02 21:03:08

标签: http-status-code-403 http-status-codes http-status-code-401

经过大量的Google搜索和Stackoverflowing后,我仍然不清楚,因为很多文章和问题/答案都过于笼统(包括403 Forbidden vs 401 Unauthorized HTTP responses并非专门针对我的用例)。

问题:当用户未登录并要求查看仅应向登录用户显示的某些页面时,正确的HTTP状态代码是什么?

3 个答案:

答案 0 :(得分:13)

我发现的完全令人满意的一次性答案是:

简短回答:

401 Unauthorized

说明

虽然我们首先知道的是身份验证(用户 已登录 吗?)然后我们将进入授权(他是否拥有所需的 特权 ?),但这是导致我们失误的关键:

  

但是不是“401 Unauthorized”关于授权,而不是认证?

     

当写入HTTP规范(RFC 2616)时,这两个字可能不会   人们普遍认为它是截然不同的。从中可以清楚地看出来   401的描述和其他支持文本   认证

来自HTTP Status Codes 401 Unauthorized and 403 Forbidden for Authentication and Authorization (and OAuth)

所以,也许,如果我们想重写标准!关注每个单词,我们可以参考下表:

Status Code | Old foggy naming | New clear naming | Use case
+++++++++++ | ++++++++++++++++ | ++++++++++++++++ | ++++++++++++++++++++++++++++++++++
401         | Unauthorized     | Unauthenticated  | User has not logged-in
403         | Forbidden        | Unauthorized     | User doesn't have enough privilege

答案 1 :(得分:3)

这取决于您用于执行登录的机制。

403 Forbidden的规范说:

  

403(Forbidden)状态代码表示服务器   了解该请求但拒绝授权。一个服务器   希望公开为什么禁止请求可以   在响应有效载荷中描述该原因(如果有的话)。

     

如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。客户端   不应该自动重复请求   证书。 客户端可以使用新的或不同的方式重复请求   凭证。但是,出于原因可能会禁止请求   与证书无关。

虽然主要的HTTP状态代码规范中未定义401 Unauthorized,但the HTTP Authentication spec位于{{3}}并说:

  

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

因此,如果您使用WWW-AuthenticateAuthorization标头作为身份验证机制,请使用401.如果您使用任何其他方法,请使用403。

答案 2 :(得分:0)

IMO这取决于您要查询的资源类型。这样听起来更合乎逻辑。 “禁止”是指网站的文件或文件夹或一般资源,而如果需要某种类型的执行,页面脚本等,则“未经授权”更合逻辑。