首页 文章

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

提问于
浏览
7

经过大量的谷歌搜索和Stackoverflowing,我仍然不清楚,因为许多文章和问题/答案太笼统(包括403 Forbidden vs 401 Unauthorized HTTP responses,这不是我的用例) .

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

3 回答

  • 2

    我找到的确切令人满意的一次性答案是:

    简短回答:

    401未经授权


    描述:

    虽然我们首先知道的是 authentication (有没有用户 logged-in ?)然后我们将进入 authorization (他有没有所需的 privilege ?),但这里的关键是让我们弄错了:

    但是不是“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
    
  • 11

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

    403 Forbidden的规格说:

    403(禁止)状态代码表示服务器理解请求但拒绝授权 . 希望公开请求被禁止的服务器可以在响应有效负载中描述该原因(如果有的话) . 如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限 . 客户端不应该使用相同的凭据自动重复请求 . 客户端可以使用新的或不同的凭据重复请求 . 但是,出于与凭证无关的原因,可能会禁止请求 .

    虽然401 Unauthorized未在主HTTP状态代码规范中定义,但在the HTTP Authentication spec中并且说:

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


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

  • 0

    IMO它将取决于您尝试查询的资源类型 . 听起来更合乎逻辑 . Forbidden更多地指网站的文件或文件夹,或一般资源,而如果需要某种类型的执行,页面脚本等,Unauthorized更合乎逻辑 .

相关问题