认证(Authentication)和授权(Authorization)有什么区别?
简化版
认证(Authentication) 解决「你是谁」——验证你的身份(登录,核对账号密码/token)。授权(Authorization) 解决「你能做什么」——验证你有没有权限访问某资源、执行某操作。顺序上先认证、后授权:先证明你是谁,再决定你能干啥。对应到 HTTP 状态码:401 是未认证(没登录),403 是无权限(登录了但不让)。
详细版
| 维度 | 认证 Authentication | 授权 Authorization |
|---|---|---|
| 回答 | 你是谁? | 你能做什么? |
| 目的 | 验证身份 | 验证权限 |
| 时机 | 先(登录时) | 后(访问资源时) |
| 手段 | 账号密码、验证码、token、生物识别、SSO | RBAC、ACL、权限校验 |
| 失败状态码 | 401 Unauthorized | 403 Forbidden |
- 认证:核对你提供的凭证(密码、token 等)确认「你确实是你声称的那个用户」。登录就是认证。
- 授权:在确认身份后,判断「这个用户有没有权限做这件事」——能不能看这个页面、调这个接口、改这条数据。
完整版教学
一、两个概念的顺序与依赖
认证和授权是安全体系的两个基石,有明确的先后和依赖关系:
- 先认证:系统先要搞清楚「来的人是谁」——你得先登录、证明身份;
- 后授权:知道你是谁之后,再根据你的角色/权限,决定「你能访问什么、操作什么」。
没有认证,授权无从谈起(不知道你是谁,怎么判断你的权限)。这个顺序也解释了很多安全设计:登录(认证)只是第一步,之后每次访问资源还要做授权判断——这正是越权漏洞的防线所在(详见「越权漏洞」那道题)。
二、401 vs 403:一对经典的状态码
认证和授权的区别,在 HTTP 状态码上体现得很清楚(详见「HTTP 状态码」那道题):
- 401 Unauthorized(未认证):你还没证明身份——没登录、token 无效或过期。潜台词是「你是谁?先登录」。名字里虽是 “Unauthorized”,但语义其实是「未认证」(历史命名的坑);
- 403 Forbidden(无权限):你已经认证了(知道你是谁),但你没有权限访问这个资源。潜台词是「我知道你是谁,但你不够格」。
记法:401 = 没登录(Who are you),403 = 没权限(You can’t)。 分清它们能帮你正确设计接口的返回,也是面试高频点。
三、认证的常见方式
- 账号密码:最基础,配合验证码防暴力破解;
- Session-Cookie:认证后服务端存 session、客户端存 sessionId(详见「Cookie、Session、Token」那道题);
- Token(JWT):认证后签发 token,客户端携带,服务端验签,无状态;
- OAuth 2.0 / SSO 单点登录:用第三方(微信、Google)登录,或一次登录多系统通用;
- 多因素认证(MFA/2FA):密码 + 短信/验证器,多一层保障;
- 生物识别:指纹、人脸。
四、授权的常见模型
- RBAC(基于角色的访问控制,最常用):给用户分配角色(管理员、编辑、访客),给角色分配权限,用户通过角色获得权限。易管理,是企业系统的主流;
- ACL(访问控制列表):直接规定「谁能访问哪个资源」,粒度细但管理繁琐;
- ABAC(基于属性):根据用户属性、资源属性、环境(时间、IP)动态判断,最灵活也最复杂;
- 数据权限:在 RBAC 之上,还要控制「能操作哪些数据」(如只能看自己部门的),这也是防水平越权的关键。
五、认证 ≠ 授权:混淆会出安全事故
这两个概念一旦混淆,就会出越权漏洞:
- 只做认证、不做授权:系统在登录后就「放行一切」,导致任何登录用户都能访问任何资源——水平/垂直越权的根源;
- 正确姿势:认证解决「合法用户」,授权解决「这个合法用户能不能做这件具体的事」。每一次敏感访问,都要在认证的基础上再做授权校验。
所以记住:「登录了」不等于「有权限」。 认证只是入场券,授权才决定你能进哪些房间。
六、常见误区
- ❌ 把认证和授权当一回事——认证是「你是谁」,授权是「你能做什么」,先认证后授权。
- ❌ 把 401 和 403 记反——401 未认证(没登录),403 已认证但无权限。
- ❌ 以为登录后就能访问一切——登录是认证,每次访问资源还要做授权校验(否则越权)。
- ❌ 以为 401 名字叫 Unauthorized 就是「无权限」——它语义是「未认证」,无权限是 403。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 认证 Authentication | 确认你是谁 |
| 授权 Authorization | 确认你能做什么 |
| 鉴权检查点 | 每次访问资源或操作时校验权限 |
login -> authenticate userId=42
request DELETE /orders/7
authorize(userId=42, action=delete, resource=order:7)
allow or deny
认证是进门验身份,授权是进门后看房间钥匙;登录成功不等于拥有所有权限。
- 误区:认证成功就代表授权成功。 认证只证明身份,具体资源和动作仍要做授权判断。
- 误区:权限只需要前端隐藏按钮。 前端隐藏只是体验,后端必须对每个敏感接口做权限校验。
- 误区:管理员接口只要登录就能访问。 管理员能力必须有角色、权限或策略约束,不能只看是否登录。
- 追问:RBAC 和 ABAC 区别是什么? RBAC 按角色授权,ABAC 按用户、资源、环境等属性做策略判断。
- 追问:为什么对象级授权重要? 用户有订单查看权限,不代表能查看别人的订单。
- 追问:权限缓存有什么风险? 权限变更后缓存未失效会导致旧权限继续生效,需要短 TTL 或主动失效。
七、加强记忆
认证(Authentication)= 验证「你是谁」(登录、核对凭证),授权(Authorization)= 验证「你能做什么」(权限校验)。顺序是先认证后授权,登录了不等于有权限。对应状态码:401 未认证(没登录)、403 已认证无权限。认证方式有密码/Session/Token/OAuth/MFA,授权模型有 RBAC(最常用)/ACL/ABAC + 数据权限。两者混淆(只认证不授权)就是越权漏洞的根源。