UPTools UPTools
开发 主笔:工具匠

HTTP 401 和 403 到底差在哪?一图分清「没登录」和「没权限」

上周帮人联调,前端同事跑过来抱怨后端权限没配好:「我登录都成功了,调那个接口怎么还是 403?」我看了一眼他的请求头,token 压根没带上。他愣了三秒,才发现 axios 拦截器里取 token 的 key 写错了。

这是个非常典型的误区。很多人看到 403 第一反应是「权限配置问题」,看到 401 又觉得「是不是没登录」。实际上 401 和 403 的排查方向完全不同,弄反了能让你 debug 一整个下午。

401 和 403 的核心区别

一句话先放这:

  • 401 Unauthorized:服务器不知道你是谁。你没带凭证,或者带了但服务器不认。
  • 403 Forbidden:服务器知道你是谁,但你没权限做这件事。

英文原名有点误导。401 叫 Unauthorized,但真正的语义是 Unauthenticated(未认证)。RFC 9110 里特意点了一句,401 表示缺少或无效的认证凭证。所以看到 401,第一反应应该是「我凭证带了吗,带对了吗」,不是「我有权限吗」。

403 才是真正的「没权限」。这时候服务器已经认出你了,但你的角色不允许访问这个资源。比如普通用户调管理员接口、免费账号调付费 API、读权限去写。

状态码英文真实含义第一反应
401Unauthorized没带或带错凭证(token、cookie、Authorization 头)检查请求头里有没有凭证,凭证有没有过期
403Forbidden已认证,但角色/权限不够检查账号角色、权限策略、IP 白名单

排查 401 的常见动作:打开 Network 面板看请求头,确认 Authorization: Bearer xxx 有没有带上,token 是不是过期了,是不是忘了在 axios 拦截器里挂上。

排查 403 的常见动作:看后端权限表、看账号角色、看是不是触发了风控。凭证是对的,问题在另一层。

顺带说一句 404。404 是「服务器找不到这个资源」,跟鉴权无关。有时候后端会把权限问题伪装成 404,目的是不暴露资源是否存在,这是设计选择,不是 bug。

顺带分清重定向那一家:301 / 302 / 307 / 308

这四个也是高频踩坑点。核心区分两个维度:永久 vs 临时,是否保留请求方法。

  • 301 Moved Permanently:永久重定向。浏览器和搜索引擎会缓存这个跳转。下次请求原 URL,浏览器直接跳到新地址,连服务器都不问。方法可能从 POST 变成 GET(历史上很多客户端这么干)。
  • 302 Found:临时重定向。不缓存。方法历史上也可能从 POST 变 GET。
  • 307 Temporary Redirect:临时重定向,但严格保留原请求方法。POST 还是 POST,body 不丢。
  • 308 Permanent Redirect:永久重定向,同样严格保留方法。

实际项目里最容易踩的坑:以为 302 会被浏览器永久缓存,结果换了 URL 用户还是跳到老地方。不会。只有 301 和 308 这种「永久」才会被缓存,302 和 307 是临时的。所以做域名迁移、URL 改版这种长期动作,用 301;做临时维护页、A/B 跳转,用 302 或 307。

还有一个坑:老的 302 在很多实现里会把 POST 改成 GET,导致 body 丢失。如果你的业务对方法敏感(比如支付回调),用 307 或 308 更安全。

5xx 家族:500 / 502 / 504

5xx 都是服务端的锅。客户端请求是对的,服务器自己出了问题。这三个里 502 和 504 最容易混。

  • 500 Internal Server Error:服务器自己崩了。代码抛了未捕获异常、数据库连接断了、配置错了。日志里一定有 stack trace,去服务器查。
  • 502 Bad Gateway:网关收到了上游的无效响应。典型场景是 Nginx 反向代理后面挂的 Node/PHP 进程挂了,或者返回了无法解析的内容。网关能联系上上游,但上游给的东西不对。
  • 504 Gateway Timeout:网关等上游超时了。上游进程可能在跑,但太慢,网关等不及就断了。典型场景是某个 SQL 慢查询卡住了,或者下游接口响应超过 Nginx 的 proxy_read_timeout

区分 502 和 504 的一句话:502 是上游给了但给的东西不能用,504 是上游压根没在规定时间内给。

口诀

4xx 是客户端的锅,请求本身有问题,要么改请求头、要么改 URL、要么改账号。5xx 是服务端的锅,客户端基本无能为力,只能等修或者找运维。

实操:状态码含义查一下

联调时看到不熟的状态码,与其翻文档翻 RFC,不如直接丢进 UPTools HTTP 状态码查询 里。输个数字就能看到中文含义、分类和排查建议,支持按 1xx 到 5xx 筛选。数据全内置在前端,离线也能用。

三句话总结

401 是没带凭证或带错了,查请求头;403 是带对了凭证但角色不够,查权限策略。重定向记住 301/308 永久会被缓存、302/307 临时不会,307/308 严格保留原请求方法。5xx 全是服务端问题,500 自己崩、502 网关收到无效响应、504 网关等上游超时。

相关文章