简体中文
  • 401
  • 403
  • http 状态码
  • 授权
  • 认证

HTTP 状态码 401 或 403?认证和授权错误有何不同

401 未授权 表示客户端未经过认证,需要有效凭证。403 禁止 说明客户端已认证但缺乏访问资源所需的权限。

Guamian
Guamian
Product & Design

每当你加载网页、进行支付或登录应用时,你的设备与服务器之间都会进行一场看不见的对话。这有点像发送消息并等待回复——有时是点赞,有时是礼貌地“再试一次”,偶尔也会是明确的“拒绝”。这些响应,被称为 HTTP 状态码,是互联网的无名英雄,静静地指导着通信的流动,确保一切顺利运转——或者至少让你知道何时不顺利。

什么是 HTTP 状态码

HTTP 状态码就像客户端(如你的浏览器或应用程序)和服务器之间的一种对话信号。它们提供关于请求发生了什么的快速和清晰的更新——无论是一切顺利、出了点问题,还是需要采取额外操作。让我们把它想象成访问一家运作良好的面包店:

200:一切完美

你要一个可颂,面包师微笑着递给你说:“给你!”这就是 HTTP 200 OK—请求成功,一切按预期工作。

200 OK HTTP 状态码是最常用的代码之一,表示服务器成功接收、理解并处理了客户端的请求。

301:我们搬家了

你到达你喜欢的面包店,但有个标牌写着:“我们搬到了 123 新街。”这就是 301 永久移动。服务器告诉你的浏览器自动转到新地址。

301 永久移动 HTTP 状态码表示请求的资源已永久移动到新的 URL。此状态码通知客户端(如浏览器或 API 客户端)更新其记录,并在将来的请求中使用新的 URL。

404:抱歉,不在这里

你要一个巧克力司康,面包师说:“我们这里不做这个。”这就是 404 未找到—你要找的资源在服务器上不存在。

404 未找到 HTTP 状态码表示服务器无法找到请求的资源。这种响应意味着客户端的请求有效,但服务器找不到请求的资源。

401:你是谁?

你试图进入 VIP 休息室,但保安拦住你说:“你需要出示会员卡。”这就是 401 未授权—需要认证后才能访问资源。

401 未授权 HTTP 状态码表明由于缺少有效的身份验证凭证,客户端的请求尚未被应用。服务器要求客户端进行身份验证以访问请求的资源。

403:不适合你

你出示了会员卡,但保安说:“只有白金会员可以进入。”这就是 403 禁止—你已认证但没有访问资源所需的权限。

403 禁止 HTTP 状态码表明服务器理解客户端的请求但拒绝执行,因为客户端没有必要的权限。这与 401 未授权 状态不同,因为客户端已认证(或请求不需要认证),但访问资源被明确拒绝。

500:烤炉着火了

你下了订单,但突然厨房冒出烟来。面包师说:“我们无法完成你的订单,内部出了些问题。”这就是 500 内部服务器错误—服务器遇到意外问题。

500 内部服务器错误 HTTP 状态码表明服务器遇到阻止其完成请求的意外情况。这是一个通用错误响应,不提供关于具体错误的详细信息。

503:暂时不可用

你访问面包店,但看到“维护关闭”标志。面包店会在稍后重新开业。这就是 503 服务不可用—服务器暂时无法处理你的请求,通常是由于超载或维护。

503 服务不可用 HTTP 状态码表示服务器暂时无法处理请求。这可能是由于服务器超载、维护或其他临时情况。与 500 内部服务器错误 不同,503 表示问题预计很快会解决。

HTTP 状态码对于维持客户端和服务器之间的高效通信至关重要。它们快速通知客户端其请求是成功的、失败的还是需要进一步操作的。对开发者和 IT 专业人员来说,理解这些状态码有助于调试问题、设计更好的错误处理机制并改善整体用户体验。

把它们想象成互联网持续对话中的专业、标准化信号。

在本文中,我想重点讨论 401 和 403 错误,因为它们与身份验证(AuthN)和授权(AuthZ)密切相关。

什么时候使用 401 未授权?

401.png

401 未授权 HTTP 状态码用于客户端请求需要身份验证,但身份验证失败或未提供时。它告诉客户端需要认证以访问请求的资源。认证401 未授权 状态码之间的关系在于认证决定请求是否可以继续的角色。

401 未授权 必须包含一个 WWW-Authenticate 头,提供关于如何认证的详细信息。

那么,使用 401 未授权 的常见场景是什么呢?

  1. 缺少认证

    请求未包含必要的身份验证凭证。例如:对受保护的 API 端点的请求不带授权头。

  2. 无效的认证凭证

    客户端提供凭证,但它们不正确或不符合服务器的期望。例如,用户发送无效的 API 密钥或格式错误的令牌。

  3. 认证令牌已过期

    认证令牌有效但已过期,要求客户端重新认证。例如,过期日期(exp 声明)过去的 JWT 令牌。

  4. 缺失或格式错误的授权头

    授权头是必需的,但要么未提供,要么格式不正确。

  5. 不支持的认证方案

    服务器不支持客户端提供的认证方法。例如:客户端发送一个 Basic 认证头,但服务器只支持 Bearer 令牌。

  6. 无效的会话或令牌撤销

    用户的会话被注销或其令牌被撤销。例如:用户注销,但同一令牌被用来访问受保护的资源。

响应示例

什么时候使用 403 禁止?

403.png

403 禁止 HTTP 状态码表示服务器理解请求和客户端的身份(如果已认证),但由于权限不足而拒绝访问。它清楚地表明,“你不允许这样做”,以确保明确的访问边界并加强安全策略。

401 未授权 和 403 禁止 的区别在于它们在认证和授权上下文中的角色。

授权是与 认证 分开的机制。认证识别你是谁,而授权决定你是否可以访问特定资源以及可以对其执行哪些操作。

要查看有关 AuthN 和 AuthZ 的详细区别,请查看以下文章。

什么是 AuthZ

什么是 AuthN

使用 403 禁止 的常见场景是什么呢?

  1. 已认证但缺乏权限

    客户端已登录或认证,但没有所需的权限或角色。例如,拥有“查看者”角色的用户尝试删除需要“编辑者”权限的文件。

  2. 资源访问受限

    资源的访问被有意限制在特定用户或组中。例如:一份私人文件与特定用户共享,但被不在访问列表上的人访问。

  3. IP 或地理位置阻止

    客户端的 IP 地址或地理位置被服务器阻止。例如:来自受限区域的用户试图访问仅在特定国家运营的服务。

  4. 由策略阻止的操作

    客户端正尝试一个被服务器端策略或规则禁止的操作。例如:用户尝试修改标记为“只读”的资源。

  5. 静态资源阻止

    出于安全原因,服务器拒绝访问特定的静态文件或目录。

    示例:用户试图访问 .htaccess 文件或服务器的配置文件。

  6. 帐户被暂停或禁用

    客户端的帐户因违规或不活跃而被禁用或阻止。例如:一位拥有被暂停帐户的用户试图登录或访问资源。

  7. 操作需要提升的权限

    请求的操作需要特权(例如,管理员或超级用户)。示例:一个普通用户试图访问仅限管理员的端点。

响应示例:

我该如何排查 401 未授权 错误

401 错误通常表示需要身份验证并且已失败。

检查凭证

确保授权头存在且格式正确,并验证凭证(API 密钥、令牌或密码)正确且未过期。输入错误的用户名或密码是造成 401 错误的最常见原因之一。

确认认证方法

服务器可能期望不同于所提供的身份验证方法。如果客户端和服务器在身份验证协议上不同步,就会发生这种情况。使用由服务器指定的正确方法(例如,Basic、Bearer、API Key),并检查头中的语法是否正确。

检查服务器响应

查看响应主体以获取错误详细信息,并查看 WWW-Authenticate 头以获取身份验证说明。

验证请求

确认端点、查询参数和主机正确,并确保你访问的资源需要认证。

检查令牌问题

解码并检查令牌(例如,使用 https://logto.io/jwt-decoder)以验证其有效性、有无过期和声明,并将令牌的受众(aud)与 API 的要求匹配。

我该如何排查 403 禁止 错误

403 禁止错误 通常意味着授权过程已完成,但访问被拒绝。要解决此错误,请考虑以下条件:

验证权限

确认你的帐户、API 密钥或令牌对资源拥有必要的权限。检查资源是否被限制为特定角色或组。

确保认证正确

确保你已正确认证(例如,具有有效的令牌或凭证)。

仔细检查服务器要求的认证方法。

验证资源

确认请求的资源存在并且你有权访问它。如果使用 APIs,请查看文档中的端点要求。

查看 IP 或位置阻止

检查你的 IP 地址或地理位置是否被服务器限制。

审查服务器策略

确保请求的操作不违反服务器端规则或策略(例如,访问一个只读资源)。

检查服务器响应

检查响应正文以获取解释 403 错误原因的详细信息。

单个请求是否可以返回 401 和 403 状态码

不,一个 HTTP 请求不能同时返回 401 未授权403 禁止 状态码,因为 HTTP 响应只能包含一个状态码。

401 和 403 错误码在认证和授权中的实际应用

在现代应用开发中,401 未授权403 禁止 是开发者经常遇到的两个 HTTP 状态码。虽然它们看似相似,但其意义和用例却截然不同。为澄清其区别,本文探讨了这些状态码在诸如认证、授权、多租户和多因素认证(MFA)等场景中的实际例子。

  1. 登录场景:用户尝试访问受保护页面而未登录或提供有效凭证。服务器响应并抛出 401 未授权错误:“你需要登录或提供有效凭证以访问此页面。”
  2. 访问控制场景:同一用户成功登录但尝试访问没有所需管理员角色的管理员页面。服务器响应并抛出 403 禁止:“你已登录,但你没有权限访问此页面。”
  3. 多租户场景:同一用户已登录但属于 租户 A 并尝试访问 租户 B 的资源,该资源不属于其访问范围。服务器响应并抛出 403 禁止:“你已认证,但你没有权限访问租户 B 的资源。”
  4. 多因素认证(MFA)场景:用户尝试登录但尚未完成所需的多因素认证(MFA)。服务器响应并抛出 401 未授权错误:“认证不完整。请完成 MFA 以继续。”

使用 Logto 作为认证和授权提供者

Logto 主要是一个认证提供者,提供了不通过密码的登录、电子邮件和密码、多因素认证(MFA)、企业级单点登录(SSO)和社交登录等关键方法,全部基于开放标准协议,如 OIDCOAuth 2.0SAML

Logto 云还提供了基本的授权功能,包括 基于角色的访问控制(RBAC)组织(多租户)自定义令牌声明 以满足各种授权需求。