惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【身份与访问控制工程】API Gateway、BFF 与边界认证授权
Liao Tonglang · 2026-04-21 · via 土法炼钢兴趣小组的算法知识备份

前面 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,转发给后端服务 在网关层查询数据库做复杂授权决策

核心原则:网关做”请求是否有权进入系统”的判断,业务服务做”请求能否对特定资源执行特定操作”的判断。

1.1 JWT 验证在网关

最常见也最实用的模式——网关验证所有进入请求的 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 的流量。

1.2 粗粒度 RBAC 在网关

网关可以做 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"]

二、BFF(Backend for Frontend)模式

OAuth 2.1 篇 中提到了 SPA 不应该直接持有 client_secretrefresh_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 中的核心价值:

  1. 令牌不离开后端:Access Token、Refresh Token 存在 BFF 的 Session 中,浏览器只持有 Session Cookie(httpOnly, Secure, SameSite=Strict)。
  2. 机密客户端:BFF 是 OAuth 的机密客户端——它可以使用 client_secret(存在 Vault/K8s Secret 中),可以使用 private_key_jwt 认证,可以使用 Refresh Token Rotation。
  3. Token Exchange:BFF 可以在用户的 Access Token 过期后,用 Refresh Token 透明换新的,前端不需要感知这个过程。

2.1 BFF 的 Session 管理

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。

三、网关授权的外部化:与 OPA 集成

当网关的粗粒度 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 body

OPA 收到 Envoy 传来的完整 HTTP 请求上下文(method、path、headers、部分 body),评估策略后返回”允许”或”拒绝”。

性能注意:每个 HTTP 请求都要等待 OPA 的 gRPC 响应。OPA 的策略求值应在 1ms 以内完成——这意味着 OPA 不能做数据库查询、不能做外部 API 调用。如果需要复杂的、依赖数据库的授权决策,应放在业务服务层,不在网关层。

四、限流(Rate Limiting)与身份绑定

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 中的正确角色:

  1. 验证——JWT 签名、有效期、scope。
  2. 转发身份——把验证后的 Principal 注入 Header 传递给后端。
  3. 粗粒度授权——API 级别的 RBAC(.admin.* 路由需要 admin scope)。
  4. 限流——按用户/客户端/API 限流,防止滥用。
  5. 不做什么——不在网关层做细粒度数据授权,不做业务规则判断。

BFF 模式对 SPA 和移动 App 是 OAuth 安全的必要条件——令牌不离开后端,Session Cookie 是浏览器和后端之间唯一的信任锚。


上一篇B2B SaaS 多租户权限设计 下一篇Keycloak 工程拆解:Realm、Client、Flow 与扩展机制

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-13 · architecture / security

【身份与访问控制工程】IAM 全景:为什么这是高价值赛道

从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。

2026-06-13 · architecture / security

【身份与访问控制工程】OAuth 2.1 与 PKCE:现代授权主路径

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

【身份与访问控制工程】服务身份:mTLS、SPIFFE/SPIRE 与 Workload Identity

前 9 篇讨论的都是'人'的身份——用户怎么登录、怎么验证。但微服务世界中,80% 的 API 调用是服务之间的。服务身份(Workload Identity)是整个 IAM 体系的另一半:mTLS 解决'传输层你是谁',SPIFFE/SPIRE 解决'在平台层你是谁且怎么证明',JWT Profile for OAuth 解决'我怎么拿到一个服务身份的 Token'。本文从这三条线拆解服务身份的工程实现。