2026-04-13 · architecture
【系统架构设计】API 网关设计:入口层的职责边界
从路由转发、限流熔断到认证鉴权与协议转换,系统讲解 API 网关在微服务架构中的职责边界,对比 Kong、Envoy、APISIX 三大方案,并给出 BFF 模式与高可用设计的工程实践。
























前面 14 篇文章讨论了 IAM 体系的各个组件——OIDC、OAuth 2.1、JWT、MFA、权限模型、策略引擎。但所有这些组件最后的落地都会碰到一个问题:它们在哪里执行?
对于面向用户的 API,答案通常是 API Gateway——认证、授权、限流的第一道防线。但网关应该承担多重的责任?把授权逻辑塞进网关在架构上是否正确?BFF(Backend for Frontend)模式如何改变了网关的职责?
网关层是请求进入系统前的最后一道防线。它在 IAM 中扮演的角色:
| 能做 | 不应该做 |
|---|---|
| 验证 JWT 签名和有效期 | 解析业务相关的 claims 做复杂授权(如”用户只能看自己部门的订单”) |
| 验证 OAuth Token(通过 Introspection 或本地 JWT 验证) | 维护用户-资源的关系数据(那是策略引擎或服务的事) |
| 基于 IP / User / API Key 的 Rate Limiting | 实现审批流、权限申请等长流程业务逻辑 |
| 粗粒度的授权(API 级别的 RBAC——“谁可以调用这个路由”) | 细粒度的数据权限(“可以看哪些行”) |
| 提取 token 中的 Principal 信息注入 Header,转发给后端服务 | 在网关层查询数据库做复杂授权决策 |
核心原则:网关做”请求是否有权进入系统”的判断,业务服务做”请求能否对特定资源执行特定操作”的判断。
最常见也最实用的模式——网关验证所有进入请求的 JWT,然后把已验证的用户信息以 HTTP Header 的形式转发给后端:
客户端 → API Gateway (验证 JWT, 提取 sub/scope) → 后端服务
Authorization: Bearer eyJhbG...
↓ (网关处理)
X-Auth-User-ID: user-12345
X-Auth-Scopes: read write
→ 后端服务信任这些 Header
约束:后端服务必须信任网关的转发——不能从公网直接访问后端服务,否则攻击者可以伪造
X-Auth-User-ID Header。在 K8s 中通过
NetworkPolicy 限制后端服务只接受来自网关 Pod 的流量。
网关可以做 API 级别的权限控制——“这个路由只允许 scope 为
admin 的 token 访问”:
# Kong / Envoy 配置示例
routes:
- path: /api/admin/*
methods: [GET, POST, PUT, DELETE]
auth:
jwt:
required_scope: ["admin"]
- path: /api/users/*
methods: [GET]
auth:
jwt:
required_scope: ["read", "admin"]在 OAuth
2.1 篇 中提到了 SPA 不应该直接持有
client_secret 和
refresh_token。BFF
模式把这个原则落实为架构:
flowchart LR
Browser["浏览器 (SPA)"] -->|"Session Cookie"| BFF["BFF<br/>(后端服务)"]
BFF -->|"OAuth 2.1<br/>(机密客户端)"| OP["IdP / OP"]
BFF -->|"Bearer Token"| API["后端 API"]
Gateway["API Gateway"] --> BFF
Gateway --> API
BFF 在 IAM 中的核心价值:
client_secret(存在
Vault/K8s Secret 中),可以使用 private_key_jwt
认证,可以使用 Refresh Token Rotation。BFF 维护的是服务端 Session(Redis 或加密的 Session Cookie),Session 中存储的 OAuth Token 信息:
{
"user_id": "user-12345",
"access_token": "eyJhbG...",
"refresh_token": "rt-abc-123",
"access_token_expires_at": 1718400000,
"id_token_claims": {
"sub": "user-12345",
"email": "zhangsan@company.com",
"name": "San Zhang"
}
}BFF 在每次代理 API 请求时,检查 Access Token 是否即将过期(如距离过期还有 < 1 分钟),如果是,用 Refresh Token 换新的 Access Token,更新 Session。
当网关的粗粒度 RBAC 不够用(需要检查”用户是不是这个资源的 owner”或者其他属性条件),可以把授权决策外部化给 OPA(参见 第 13 篇)。
Envoy 的外部授权过滤器(External Authorization Filter, ext_authz):
# Envoy 配置
http_filters:
- name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
grpc_service:
envoy_grpc:
cluster_name: opa-service
with_request_body:
max_request_bytes: 8192 # 只发送前 8KB bodyOPA 收到 Envoy 传来的完整 HTTP 请求上下文(method、path、headers、部分 body),评估策略后返回”允许”或”拒绝”。
性能注意:每个 HTTP 请求都要等待 OPA 的 gRPC 响应。OPA 的策略求值应在 1ms 以内完成——这意味着 OPA 不能做数据库查询、不能做外部 API 调用。如果需要复杂的、依赖数据库的授权决策,应放在业务服务层,不在网关层。
Rate Limiting 是 IAM 在网关层的另一个重要功能——防止单一用户或客户端滥用 API。
限流粒度的阶梯:
| 粒度 | Key | 典型值 |
|---|---|---|
| 全局 | 固定 key global |
10000 req/s |
| 每 IP | client_ip |
100 req/s |
| 每用户 | user_id (从 JWT 的 sub
提取) |
1000 req/s |
| 每用户+每 API | user_id + api_path |
100 req/s |
| 每 OAuth Client | client_id (从 JWT 的
azp/aud 提取) |
5000 req/s |
限流状态通常存储在 Redis 中(Sliding Window 或 Token Bucket 算法),需要在网关层维护 Redis 的高可用连接。
API Gateway 在 IAM 中的正确角色:
.admin.* 路由需要 admin scope)。BFF 模式对 SPA 和移动 App 是 OAuth 安全的必要条件——令牌不离开后端,Session Cookie 是浏览器和后端之间唯一的信任锚。
上一篇:B2B SaaS 多租户权限设计 下一篇:Keycloak 工程拆解:Realm、Client、Flow 与扩展机制
把当前热点继续串成多页阅读,而不是停在单篇消费。
2026-04-13 · architecture
从路由转发、限流熔断到认证鉴权与协议转换,系统讲解 API 网关在微服务架构中的职责边界,对比 Kong、Envoy、APISIX 三大方案,并给出 BFF 模式与高可用设计的工程实践。
2026-06-13 · architecture / security
从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。
2026-06-13 · architecture / security
OAuth 2.1 不是新协议,而是对 OAuth 2.0 的安全加固:废除 Implicit Grant 和 Resource Owner Password Grant,强制 PKCE 用于所有使用授权码模式的客户端,要求精确 redirect_uri 比对。本文从 PKCE 的密码学动机出发,拆解 OAuth 2.1 的授权码流程完整交互、Refresh Token 轮换与发送者约束、DPoP 令牌绑定,以及 DCR (Dynamic Client Registration) 和 RAR (Rich Authorization Requests) 的实际应用。
2026-06-17 · architecture / security
前 9 篇讨论的都是'人'的身份——用户怎么登录、怎么验证。但微服务世界中,80% 的 API 调用是服务之间的。服务身份(Workload Identity)是整个 IAM 体系的另一半:mTLS 解决'传输层你是谁',SPIFFE/SPIRE 解决'在平台层你是谁且怎么证明',JWT Profile for OAuth 解决'我怎么拿到一个服务身份的 Token'。本文从这三条线拆解服务身份的工程实现。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。