
一句话区别
401 Unauthorized 表示“我不知道你是谁——请进行身份验证。”403 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 实用技巧 重新检查。

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

如何决定返回哪个状态码
| 情况 | 返回状态码 |
|---|---|
| 未发送凭据 | 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,指明客户端应使用的方案(例如 Basic、Bearer)。
对于禁止访问的资源,应该返回 403 还是 404? 当可以透露资源存在时使用 403。当即使承认资源存在也会泄露信息时使用 404。
使用 HTTP 状态码工具 查询任何响应码,并查看 HTTP Authorization 头部详解 了解认证头部的工作原理。