请说明在设计一个对外提供的 API 时,访问控制与限流的具体实现方式和技术要点。
考察说明
考查对 API 安全防护核心机制的理解,包括身份认证、授权、限流算法及工程落地。
回答思路
- 【回答框架 1】访问控制首先基于身份认证,常用方案包括 API Key、OAuth2 或 JWT。JWT 是无状态令牌,服务端通过签名校验与过期时间控制访问,适合分布式场景,但需考虑密钥管理和吊销机制。
- 【回答框架 2】授权层面建议采用 RBAC 或 ACL。RBAC 将权限绑定到角色,再赋予用户角色,便于管理;ACL 直接按资源指定用户权限,粒度更细但维护成本高。实际项目常结合两者。
- 【回答框架 3】限流常用固定窗口、滑动窗口、漏桶和令牌桶算法。固定窗口简单但存在临界问题;滑动窗口更平滑;令牌桶允许一定突发流量,适合处理波动;漏桶则强制恒定速率,适合下游保护。
- 【回答框架 4】实现上可使用 Redis 的 INCR 和 EXPIRE 实现固定窗口,或用 Lua 脚本实现滑动窗口与令牌桶,保证原子性。网关层如 Kong、Nginx 或 Spring Cloud Gateway 常内置限流模块,配置阈值即可。
- 【回答框架 5】限流触发后需返回 429 状态码,并在响应头携带 Retry-After,同时做好降级与告警。可对用户、IP、接口等不同维度分别限流,并设置优先级规则。
- 【关键点 1】访问控制基于认证 + 授权,JWT 与 RBAC 是常见组合。
- 【关键点 2】限流算法根据业务选型,令牌桶适合允许突发,漏桶适合稳定输出。
- 【关键点 3】Redis 的原子操作和网关内建插件能简化分布式限流实现。
- 【关键点 4】限流响应应明确的状态码和重试提示,避免客户端误判。
- 【易错点 1】限流不能直接作为业务幂等的保证,仍需要业务层去重或状态校验。
- 【易错点 2】固定窗口在窗口边界可能产生两倍流量,需评估是否为隐患。
- 【易错点 3】认证令牌的过期与吊销机制不完善会留下越权漏洞。