HTTP状态码401和403深度解析

19,102 阅读2分钟

一直只是知道401和403都是拒绝访问的意思, 但没有仔细研究它们之间准确的区别, 现在详细记录一下.

表面上是这样

401 Unauthorized
403 Forbidden

从w3.org的解释来看:

imagepng

imagepng

作为非英语国家的我们而言, 可能不太能发觉这两个描述中的问题, 只是能看明白401是没有带认证信息或者带了错误的认证信息, 这时客户端可以修改认证信息进行重试; 而403是客户端带了正确的认证信息, 但服务器认为这个认证信息对应的用户是没有对应资源的访问权限的, 因此, 在向管理员获取相关权限之前, 是没有重试的必要的.

但实际上这个描述中忽视了两个单词: Authorized和Authenticated.

imagepng

imagepng

这样看就很明显了, 前者指的是"用户被允许/授权做某事", 而后者只是表示"用户是认证用户".

举个简单的例子, 在一般的后台系统中, 用户一般是通过LDAP或类似系统导入的, 也即是所有可以登录后台系统的用户都是"Authenticated"的, 他们有自己的Credentials. 但后台系统也都会有很详细的权限管理机制, 你虽然是认证用户, 但恐怕大多数资源你还是无法访问, 这时你就是"Unauthorized"的了.

所以这样看, 401的正确解释应该是"Unauthenticated", 而且在HTTP Authentication: Basic and Digest Access Authentication中需要带的请求头也应该是Authentication而不是Authorization.

这个是历史遗留问题了, 估计以后也不会有什么改变, 但我们还是需要知道这个问题, 免得在使用时混淆了401和403.

参考: 403 Forbidden vs 401 Unauthorized HTTP responses