401 Unauthorized vs 403 Forbidden:当用户没有登录时,哪个是正确的状态码? [复制]

Posted

技术标签:

【中文标题】401 Unauthorized vs 403 Forbidden:当用户没有登录时,哪个是正确的状态码? [复制]【英文标题】:401 Unauthorized vs 403 Forbidden: Which is the right status code for when the user has not logged in? [duplicate] 【发布时间】:2018-10-13 02:05:50 【问题描述】:

经过大量谷歌搜索和 ***ing 之后,我仍然不清楚,因为许多文章和问题/答案过于笼统(包括 403 Forbidden vs 401 Unauthorized HTTP responses,这不是专门针对我的用例)。

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

【问题讨论】:

相关帖子 - 403 Forbidden vs 401 Unauthorized HTTP responses 【参考方案1】:

我找到的完全令人满意的一次性答案是:

简答:

401 未经授权


说明:

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

但是“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

【讨论】:

这仅在您使用 HTTP 身份验证(而不是,例如,基于 cookie 的东西……如 OAuth)时才适用,因为您必须在做出 401 响应时发送 WWW-Authenticate 标头。 就我而言,我在 API 上使用它。如果用户没有提供 API 密钥,我将返回 401,如果他提供了 API 密钥但没有足够的权限,我将返回 403?我说的对吗? 我不认为这是正确的。查看下面@Quentin 答案中的 RFC 引用:***.com/a/50143750/333331 我不想玩文字游戏,但也许 401 应该被标记为“未经身份验证”?对我来说,Forbidden 和 Unauthorized 是 IRL 的同义词。 Authenticated 的意思是:“我们知道你就是你所说的那个人”。【参考方案2】:

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

403 Forbidden 的规范说:

403(Forbidden)状态码表示服务器 理解请求,但拒绝授权。一台服务器 希望公开请求被禁止的原因可以 在响应负载(如果有)中描述该原因。

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

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

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


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

【讨论】:

我认为这应该是公认的答案。那些 RFC 引用是关键。【参考方案3】:

IMO 这将取决于您尝试查询的资源类型。这样听起来更合乎逻辑。 Forbidden 更多地是指网站的文件或文件夹,或一般的资源,而 Unauthorized 在需要某种类型的执行、页面脚本等时使用起来更合乎逻辑。

【讨论】:

有趣的是,对我的答案投反对票的用户已被删除...;)

以上是关于401 Unauthorized vs 403 Forbidden:当用户没有登录时,哪个是正确的状态码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

HTTP响应码403 Forbidden和401 Unauthorized对比

Spring MVC(或 Spring Boot)。针对安全相关异常(例如 401 Unauthorized 或 403 Forbidden)的自定义 JSON 响应)

401的自定义响应Lambda Authorizer

不使用 HTTP 基本身份验证时 HTTP 401 未经授权?

401 Unauthorized:由于凭据无效,访问被拒绝

远程服务器返回错误:(401) Unauthorized