
✨ 摘要
将认证等同授权是央国企系统常见且危险的误区。本文沿用系列统一风格,把"认证-授权-审计"提升为可落地的工程体系:明确 token 选型与强化、网关与后端分工、策略引擎设计、缓存与一致性折衷、可观测与应急流程,并给出可复制的策略片段、伪代码与 30/90/180 天落地路线,确保高风险写/审批/导出操作始终由后端做资源级、上下文感知的最终裁决。
目录
- 🔎 风险速览与攻击模型
- ⚠ 关键设计抉择与代价权衡
- 🧭 授权架构与执行流(含流程图)
- 🔐 深度实现要点与代码片段
- 📊 测试、可观测与应急响应
- ✅ 路线图与行动清单(30/90/180 天)
1 🔎 风险速览与攻击模型
- 核心问题:把 token 当作"万能钥匙",只校验是否存在而不做资源级授权与上下文判断。
- 攻击能力模型:窃取 token、横向发现资源 ID、篡改请求参数、重放、利用缓存滞后。
- 高危后果:链式越权、IDOR、审批跳步、敏感数据批量导出、审计缺失导致不可取证。
- 安全目标:所有写/审批/导出操作由后端做资源级且上下文敏感的授权决策,并被结构化审计记录。
2 ⚠ 关键设计抉择与代价权衡
- Token 选型
- JWT(自包含):低延迟但难撤销,适合短期或读密集场景。
- 不透明 token + introspection:支持即时撤销与上下文校验,代价是额外延迟与可用性依赖。
- 推荐策略:高风险接口使用不透明 token 或短期 JWT + token binding / proof-of-possession。
- 撤销与一致性:短 TTL + 事件驱动失效或 selective introspection,权衡性能与安全。
- 网关 vs 后端:网关做格式/速率/签名初筛;后端策略引擎做最终裁决与审计输出。
3 🧭 授权架构与执行流(含流程图)
否 是 是 否 请求进入 网关 网关初筛: 验证
Authorization;
X-Signature;
速率 后端 auth 验证 token (JWT/introspect) 构建 context:
user, resource, action, expectedStep, txId, risk 策略引擎 evaluate(RBAC+ABAC) 允许 ? 写拒绝: 返回
401/403;
写拒绝审计 是否写操作? 资源锁 & 流程一致性校验;
写入; 写审计 响应正常返回;
写审计(只读操作可选)
- 关键约束:策略评估输出必须包含 policy_id 与拒绝原因;所有决策产出结构化审计事件。
4 🔐 深度实现要点与代码片段
策略引擎设计
- Context = { user, resource, action, expectedStep, txId, ip, ua, risk_score }。
- 支持 dry-run、版本管理、canary 发布与回退。
核心 Rego 策略示例
rego
package authz
default allow = false
allow {
valid_role
in_expected_step
risk_ok
}
valid_role {
input.user.role == "approver"
}
in_expected_step {
input.context.expected_step == input.resource.current_step
}
risk_ok {
input.context.risk_score < 70
}
后端统一裁决伪代码(含缓存与锁)
pseudo
on request(req):
user = auth.verify_token(req.token) # JWT verify or introspect
if not user: audit.write(...); reject 401
ctx = build_context(req, user) # expectedStep, txId, ip, ua, risk_score
cache_key = hash(user.id, resource.id, action, ctx.hash)
decision = cache.get(cache_key)
if decision is null:
decision = policy_engine.evaluate(user, resource, action, ctx)
cache.set(cache_key, decision, ttl=short)
if not decision.allow:
audit.write(user, req, decision); reject 403
if is_write_action:
lock(resource.id)
if not flow.verify_step(resource.id, ctx.expected_step):
audit.write(...); unlock; reject 422
perform_write()
audit.write(user, req, decision, tx_id)
unlock(resource.id)
else:
audit.write(user, req, decision)
proceed
撤销与缓存策略
- 缓存决策 TTL 短(数秒到数十秒),在角色变更或撤销事件时触发失效。
- 对关键路径支持"强一致"模式:绕开缓存执行即时 introspection。
5 📊 测试、可观测与应急响应
- 测试矩阵:策略单元测试、集成并发场景、授权灰盒测试、AI 驱动模糊测试覆盖边界案例。
- 审计事件结构:{ timestamp, tx_id, user_id, resource, action, req_hash, resp_hash, policy_id, decision, latency, cache_hit }。
- 关键指标:授权决策延迟 P50/P95、缓存命中率、撤销生效时间、策略拒绝率、审计上报率。
- 应急方案:快速 token 强制失效(version bump)、切换强一致路径、导出 tx_id 审计包进行溯源取证。
6 ✅ 路线图与行动清单(30/90/180 天)
30 天 止血
- 强制写/导出接口鉴权;启用签名与限流;关键写操作写审计。
- KPI:写接口鉴权覆盖率 100%;审计上报率 100%。
90 天 加固
- 策略引擎上线(支持 dry-run);资源级授权覆盖核心流程;幂等与时间窗校验部署。
- KPI:授权决策延迟 P95 ≤ 200ms;撤销生效 ≤ 60s。
180 天 体系化
- 审计回放、异常行为建模并联动 SOC;策略治理纳入日常 KPI。
- KPI:红蓝演练整改闭环率 100%;授权决策率 100%。

结语
把认证与授权彻底分离是消除"token 万能钥匙"风险的核心工程实践。关键落地要点:对高风险接口选择短期 JWT 或 introspection、把资源级与上下文感知的决策交给后端策略引擎、并将每次授权决策作为结构化审计事件纳入上线验收。做到可测、可撤、可追溯,才是真正的防护闭环。
下篇预告
观察篇·第5篇:浏览器调试攻防 --- 提供一张主流程图、授权测试用例库、DevTools 检查清单与 CI/DAST 集成要点,聚焦可复制的"发现---验证---取证"方法。