跳到主要内容

认证与授权

认证(Authentication):你是谁?授权(Authorization):你能干什么?二者常一起考,但要分清。API 错误码见 API 设计与 HTTP 实践。

概念对照​

术语英文例子
认证Authentication登录校验身份
授权Authorization能否删这条订单
鉴权常混用口语里常指「认证+授权」
请求 → 认证(解析 Token/Session)→ 授权(查角色/权限)→ 业务逻辑

Session vs JWT​

Session(服务端会话)JWT(自包含 Token)
状态服务端存 session服务端可无状态(仅验签)
存储Redis / DB客户端存(Header/Cookie)
注销删 session 即失效需黑名单或短 TTL + refresh
扩展易集中踢人分布式友好
体积Cookie 里只有 session idPayload 别塞太大

JWT 结构:Header.Payload.Signature(Base64 + HMAC/RSA 签名)。

字段说明
sub用户 id
exp / iat过期 / 签发时间
scope / roles权限范围(看团队约定)

Refresh Token:Access 短 TTL + Refresh 长 TTL 换票,减 stolen access 窗口。

OAuth 2.0(直觉)​

用于 第三方授权,不是替代密码登录的全部。

角色谁
Resource Owner用户
Client你的应用
Authorization Server发 token(IdP)
Resource ServerAPI
模式场景
授权码(Authorization Code)Web / 移动端主流;带 PKCE
Client Credentials服务间 M2M
隐式 / 密码模式不推荐新项目

「用 GitHub / 微信登录」= OAuth 授权码 + OpenID Connect(OIDC)拿 id_token 标识用户。

RBAC / ABAC​

模型说明
RBAC用户 → 角色 → 权限(admin/editor)
ABAC按属性(部门、资源 owner)动态判
ACL资源级访问列表

大多数业务 RBAC + 资源归属校验(只能改自己的订单)就够。

常见 Header​

Authorization: Bearer <access_token>

Cookie + Session:Set-Cookie: sid=...; HttpOnly; Secure; SameSite=Lax

安全点说明
HTTPS必须
HttpOnly Cookie防 XSS 偷 session
CSRFCookie 会话要 CSRF token 或 SameSite
密码bcrypt/argon2,禁明文

401 vs 403​

码含义
401未提供或无效凭证
403已认证但无权访问该资源

微服务里的身份​

做法说明
网关验签内网传 X-User-Id + mTLS
Token 透传下游再验 JWT 或 introspection
服务账号Client Credentials 调内部 API

常见误解​

  1. 「JWT 比 Session 更安全」——看密钥管理、TTL、注销策略
  2. 「OAuth = 登录协议」——它是授权框架;登录常用 OIDC
  3. 「鉴权放前端就行」——服务端必须再校验

面试速记​

  1. 认证和授权区别? 身份 vs 权限。
  2. Session 和 JWT 怎么选? 集中会话 vs 无状态;注销与扩缩。
  3. OAuth 授权码流程? 重定向拿 code → 后端换 token。
  4. 401 和 403? 未登录 vs 无权限。
  5. JWT 注销怎么做? 黑名单、短 TTL + refresh、版本号。