正在加载,请稍候…

401 vs 403:Unauthorized 与 Forbidden 详解

HTTP 401 Unauthorized 和 403 Forbidden 的区别——各自适用场景、WWW-Authenticate 头部,以及如何在 API

401 vs 403:Unauthorized 与 Forbidden 详解

一句话区别

401 Unauthorized 表示“我不知道你是谁——请进行身份验证。”403 Forbidden 表示“我知道你是谁,但你仍然无法访问此资源。”前者关乎身份验证(身份),后者关乎授权(权限)。

401 vs 403:Unauthorized 与 Forbidden 详解 插图

401 Unauthorized

401 表示请求缺少有效的凭据。这个名称在历史上有些用词不当——它实际上意味着未认证。正确的 401 必须包含一个 WWW-Authenticate 头部,告知客户端如何进行身份验证:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Admin Area"

客户端应携带凭据重试——例如添加 Authorization: Basic ... 头部(参见 Authorization 头部详解)。如果你发送了凭据但仍然收到 401,说明凭据被拒绝;请参考 curl、Postman、fetch 中的 Basic Auth 实用技巧 重新检查。

401 vs 403:Unauthorized 与 Forbidden 详解 插图

403 Forbidden

403 表示服务器理解了请求和客户端的身份,但拒绝授权。使用相同的凭据重试不会有帮助——账户本身缺乏权限,或者某个规则(IP 封锁、套餐限制、所有权检查)拒绝了请求。403 不使用 WWW-Authenticate,因为重新认证不会改变任何结果。

401 vs 403:Unauthorized 与 Forbidden 详解 插图

如何决定返回哪个状态码

情况 返回状态码
未发送凭据 401
凭据已发送但无效/过期 401
身份有效,但缺乏权限 403
身份有效,资源因隐私隐藏 404(有时优于 403)

一个微妙的设计选择:某些 API 对于用户不应知道存在的资源返回 404 Not Found 而非 403,以避免泄露其存在。查阅 HTTP 状态码参考 了解每个状态码的确切语义。

常见错误

  • 返回 401 时未包含 WWW-Authenticate 头部——技术上不合规,且会混淆客户端。
  • 在应返回 401(无凭据)时使用了 403——客户端将不知道需要进行身份验证。
  • 认证失败时返回 200 并在响应体中包含错误信息——破坏了依赖状态码的客户端。

常见问题

401 和 403 有什么区别? 401 表示请求未通过身份验证(无凭据或凭据无效),客户端应进行身份验证;403 表示客户端已通过身份验证但未被允许,重试无济于事。

401 是否需要 WWW-Authenticate 头部? 是的。符合规范的 401 响应应包含 WWW-Authenticate,指明客户端应使用的方案(例如 BasicBearer)。

对于禁止访问的资源,应该返回 403 还是 404? 当可以透露资源存在时使用 403。当即使承认资源存在也会泄露信息时使用 404。

使用 HTTP 状态码工具 查询任何响应码,并查看 HTTP Authorization 头部详解 了解认证头部的工作原理。