认证、授权与鉴权:架构演进中的边界划分艺术

0 阅读11分钟

认证、授权与鉴权:架构演进中的边界划分艺术

核心观点:这三个概念并非安全领域的机械拆分,而是软件架构从"单体防御"到"零信任网格"演进过程中,关注点分离(Separation of Concerns) 原则的历史必然。理解它们的边界,是设计现代分布式系统的关键元认知。


一、史前混沌:当操作系统包揽一切(1960-1990)

在 Multics/UNIX 时代,计算机系统只有两个动作:登录访问文件。内核在系统调用层直接检查 uid/gid,不存在独立的"鉴权"概念——安全与业务逻辑在操作系统层面混沌一体。

关键转折:1980年代 Client/Server 架构兴起,数据库(Oracle、Sybase)首次在网络边界暴露出独立的权限校验层。这时, "在业务逻辑执行前拦截非法请求" 的需求催生了现代鉴权概念的萌芽。

架构师视角:这一时期的"分层"是物理的——从单机内核到网络中间件,安全边界首次从硬件边界迁移到了软件边界。


二、分层固化:Java EE 时代的概念定型(2000s)

随着企业级框架成熟,三层概念正式定型,但此时它们仍紧密耦合在应用服务器内部:

概念技术实现历史定位
认证JAAS、Servlet Session解决 HTTP 无状态下的身份识别
授权RBAC96 模型(Sandhu, 1996)应对企业级角色爆炸(>1000用户)
鉴权Servlet Filter、InterceptorAOP 思想在安全领域的首次实践

历史动因:2002年萨班斯法案(SOX)强制要求企业系统记录"谁在何时做了什么",这迫使审计(Auditing) 从鉴权中分离,成为第四维度。安全体系从"是否允许"扩展到了"如何追溯"。


三、现代裂变:微服务与零信任重新定义边界(2010-至今)

3.1 鉴权的前移:从"代码层"到"基础设施层"

2014年 Netflix 微服务栈开源,证明了"每个服务自建鉴权"会导致逻辑瘟疫。现代架构中,鉴权位置发生革命性下沉

注释: "下沉" (Sink/Offloading)是分布式架构中的核心术语,指将横切关注点(Cross-cutting Concerns)业务代码层转移到基础设施层的过程。

客户端 
  ↓
[CDN/Edge] - 防刷/SSL
  ↓
API Gateway - 统一鉴权(JWT验签、Rate Limit)
  ↓
Service Mesh (Sidecar) - mTLS/细粒度ACL
  ↓
业务容器 - 纯业务逻辑,零安全代码

深度思考:鉴权的前移不仅是技术优化,更是安全责任从开发者向基础设施转移的组织变革。当鉴权下沉到 Envoy Sidecar,业务开发者被"强制安全"——这解决了安全能力参差不齐的工程难题。

3.2 授权的膨胀:从 ACL到 PBAC

随着 SaaS 与多租户架构兴起,授权模型经历了三次认知跃迁:

  1. ACL (Access Control List) - 访问控制列表(1970s):每个服务都得单独写个允许控制表:直接绑定用户与资源,适合 <100 用户的单机系统
  2. RBAC (Role-Based Access Control) - 基于角色的访问控制(1996):引入角色中间层,解决企业组织树映射
  3. ABAC (Attribute-Based Access Control) - 基于属性的访问控制C(2010):动态属性判断(部门+职级+时间+地理位置)
  4. PBAC\OPA (Policy-Based Access Control) - 基于策略的访问控制(2020):策略即代码(Policy as Code),Git 版本化管理授权规则

详见 授权的膨胀从ACL到 PBAC 的认知跃迁juejin.cn/post/761542…

架构师洞察:授权模型的复杂度精确映射了企业组织的复杂度。当你的系统需要 ABAC 时,本质是业务已发展到需要"矩阵式管理"的组织阶段;当你需要 OPA(Open Policy Agent)时,说明你的架构已进化为策略与实现解耦的成熟生态。

3.3 认证的解构:从"会话保持"到"持续验证"

传统认证是"一锤子买卖"——登录后颁发长期凭证。零信任架构(Zero Trust)将其重构为持续风险评估

  • 自适应认证(Adaptive Auth) :根据设备指纹、地理位置、行为模式动态调整信任等级
  • Passkey/WebAuthn:2020s 用非对称加密和生物识别,彻底终结密码泄露风险
  • SPIFFE/SPIRE:云原生环境下的工作负载身份(Workload ID),服务间认证替代人工凭证

四、深度思考:三个元问题

思考一:鉴权的位置决定了架构的"安全内聚度"

在单体架构中,鉴权散落在 Controller 注解中(@PreAuthorize),这是防御式编程——每个开发者都是安全工程师,必然出现漏洞。

在云原生架构中,鉴权被横切(Cross-cutting) 到 Gateway 和 Sidecar,这是声明式安全——安全策略通过 YAML 配置,与业务代码生命周期解耦。

判断标准:如果你的业务开发者需要写 if (!isAdmin) throw 这类代码,你的架构仍停留在 2005 年。

思考二:授权是"业务逻辑"还是"安全逻辑"?

这是架构设计中最易混淆的决策。

  • 接口层(安全逻辑)粗粒度授权(能否访问 /admin):属于鉴权层,应在 Gateway 拦截
  • 数据层(业务逻辑)细粒度授权(能否查看"部门A的工资数据"):属于业务规则,应在 Domain Service 内执行

反模式警示:将数据权限(放到相应的微服务当中才对)(如 WHERE dept_id IN (?))上浮到 Gateway,会导致业务逻辑泄露到基础设施层,形成分布式单体

思考三:认证与授权的"时序耦合"陷阱

传统认知:认证 → 授权 → 鉴权(线性顺序)

现代架构揭示:认证与授权可以是异步的

  • JWT 预取:Gateway 验签(认证)后,将用户ID透传,下游服务异步从缓存获取权限(授权)
  • 边缘鉴权:CDN 层基于 Token 进行第一层鉴权,无需回源到认证中心
  • 延迟授权:GraphQL 场景下,字段级授权在解析时动态查询,而非请求开始时全量加载
1. JWT 预取(异步授权):从"集中查询"到"按需加载"
传统线性模式(耦合)
Gateway 收到请求
    ↓
验签 JWT(认证)──→ 查询 Redis 获取用户所有权限(授权)
    ↓                    ↓
  耗时 2ms           耗时 5-10ms(网络+反序列化)
    ↓                    ↓
    └──────┬─────────────┘
           ↓
      鉴权检查
           ↓
    转发给 Service A
           ↓
    Service A 实际只需要其中 20% 的权限
    (其余 80% 权限查询是浪费的)
现代异步模式(解耦)
Gateway 收到 POST /api/orders/123/refund
    ↓
验签 JWT(认证)
    ↓
检查 JWT 中的 permissions 是否包含 "ORDER_REFUND"(功能权限)
    ↓
没有?→ 直接 403(你根本没资格退款,按钮就不该让你看见)
有?→ 透传 UserID 给 Service
           ↓
    Service 检查:订单#123 是否属于该用户的部门?(数据权限)
           ↓
    是 → 执行退款
    否 → 403(你能退款,但不能退**别人的**订单)

生活比喻: 传统模式像进商场前必须填一张全身财产申报表(一次性授权),保安检查完才能进。 JWT预取像凭身份证进门(只认证),买东西结账时才掏钱包证明你有钱(按需授权)。

架构价值

  • 减少延迟:Gateway 不阻塞在权限查询(尤其是权限存储在慢速数据库时)
  • 按需加载:Service A 需要 3 个权限,Service B 需要另外 5 个,不需要在 Gateway 层一次性查全量权限

2. 边缘鉴权(CDN 层鉴权):从"回源验证"到"就地拦截"
传统模式(中心化)
用户(北京)
    ↓
请求带 Token
    ↓
CDN 节点(北京)──→ 不认识 Token,只能透传
    ↓
回源到源站(上海)
    ↓
源站 Gateway 验签(认证)
    ↓
业务逻辑...
边缘鉴权模式(分布式)
用户(北京)
    ↓
请求带 Token
    ↓
CDN 节点(北京)──→ 本地缓存了公钥/验证规则
    ↓               就地验签(认证)
    如果是非法 Token,直接拒绝(403)
    如果是合法 Token,添加标记后转发
    ↓
源站(上海)──→ 信任 CDN 的标记(或二次验签)
    ↓
业务逻辑...

生活比喻: 传统模式像每个小区访客都必须去市政府登记(回源到中心认证)。 边缘鉴权像小区门卫直接识别身份证真伪(CDN 节点有验证能力),假证直接挡在门外,不需要麻烦市政府。

技术实现

  • CDN(如 CloudFlare、阿里云 CDN)配置 Edge Computing(边缘计算)
  • 在边缘节点运行 JavaScript/WASM 验证 JWT 签名(用缓存的公钥)
  • 只验证 Token 格式和签名有效性(认证),不查询业务权限(授权)

架构价值

  • 防御 DDoS:恶意流量在边缘就被拦截,不会打到源站
  • 降低延迟:省去"北京→上海"的网络往返(RTT)

3. 延迟授权(GraphQL 字段级授权):从"全盘否定"到"精确打击"
REST API 传统模式(粗粒度)
请求 GET /user/10086
    ↓
Gateway 检查:是否有"查看用户"权限?
    ↓
有权限 ──→ 返回用户全部字段(name, salary, idCard, email)
    ↓
没有权限 ──→ 整体拒绝(403

问题:要么全给看,要么全不给看。无法做到"普通同事看 name,HR 看 salary,上级看全部"。

GraphQL 延迟授权模式(细粒度)
请求 query {
    user(id: 10086) {
        name        ← 公开字段
        salary      ← 敏感字段(需要动态鉴权)
        idCard      ← 机密字段(需要更严格鉴权)
    }
}

执行时序

解析 name 字段 ──→ 无权限检查(默认公开)
    ↓
解析 salary 字段 ──→ 触发授权查询:"当前用户是 HR 吗?"
    ↓                    ↓
    等待授权结果 ←──── 异步查询
    ↓
解析 idCard 字段 ──→ 再次触发授权查询:"当前用户是直属上级吗?"
    ↓
合并结果返回(部分字段可能因无权限返回 null

生活比喻: 传统 REST 像进门时发一张全通证,进去后所有房间都能进。 GraphQL 延迟授权像每开一扇门单独刷卡,客厅随便进(name),卧室要主人同意(salary),保险箱要指纹(idCard)。

架构价值

  • 最小权限:不会一次性加载用户所有权限到内存,而是解析到哪个字段,才检查哪个权限
  • 性能优化:如果用户只查询了 name(公开字段),完全不触发权限查询(salary 的权限检查被短路了)

总结:时序解耦的本质
模式打破的假设核心思想
JWT 预取"必须在 Gateway 完成所有授权"认证集中,授权分散,按需异步
边缘鉴权"必须回到中心才能验证身份"认证下沉到边缘,减少回源
延迟授权"必须在请求开始时决定全部权限"权限检查延迟到数据访问时刻

终极洞察: 传统线性模式是 "悲观锁" ——假设用户可能做坏事,进门时全副武装检查所有。 现代异步模式是 "乐观锁" ——先确认身份(认证),具体能做什么(授权)随用随查,甚至缓存权限结果供后续复用。

这种解耦让系统获得了弹性:下游服务可以独立演进自己的授权策略,而不需要上游 Gateway 同步修改。


五、未来演进:从"三元组"到"身份网格"

2020s 的安全架构正在发生范式转移

1. 身份即基础设施(Identity as Infrastructure)

如同 Kubernetes 抽象了计算资源,身份平面(Identity Plane) 正在从应用中剥离。SPIFFE、Cert-manager 等工具使服务身份成为集群的一等公民。

2. 授权的工程化成熟

  • OPA(Open Policy Agent) :将授权逻辑从业务代码完全剥离到 Sidecar
  • ** Cedar(AWS 开源)**:支持形式化验证的策略语言,确保授权规则无逻辑冲突

3. 密码学的民主化

  • mTLS 默认化:服务间通信不再依赖网络边界,而依赖证书双向认证
  • ZK-Proof(零知识证明) :未来可能实现"证明你有权限而不暴露身份细节"

具体查看:未来演进:从"三元组"到"身份网格"juejin.cn/post/761544…


结语:回归第一性原理

认证、授权、鉴权的分离,本质上是信任边界的重新定义

  • 认证:解决"你是谁"的身份学问题
  • 授权:解决"你能做什么"的组织学问题
  • 鉴权:解决"是否允许"的工程学问题

顶级架构师的设计,不在于选用 OAuth 2.0 还是 JWT,而在于将这三层边界映射到团队的组织边界——让安全团队管理鉴权基础设施,让业务团队专注授权规则,让基础设施团队保障认证可信。

正如康威定律所言:"系统的架构,是组织沟通结构的映射。" 认证、授权、鉴权的清晰分层,不仅是技术分层,更是现代工程团队安全权责的清晰分层


参考时间线

  • 1994: Cookie 发明(状态保持)
  • 1996: RBAC 学术模型发布
  • 2005: SASL/OAuth 1.0(委托授权)
  • 2012: OAuth 2.0(RFC 6749)
  • 2014: OpenID Connect(认证标准化)
  • 2014: Netflix OSS(微服务安全)
  • 2018: OPA 1.0(策略即代码)
  • 2023: Passkey 普及(无密码认证)