API 接口安全设计
在讨论了加密、签名和幂等性之后,API 接口安全还需要考虑业务层面的防护。除了基础的身份验证,我们还可以通过限制调用频率、管控访问来源以及严格的数据校验,来防止异常流量和非法请求。
AppID + AppSecret 机制
AppID 本质上是接口提供方给调用方颁发的身份标识,类似于一个授权 ID。通常它需要配合 AccessToken 使用:先通过 AppID 和 AppSecret 换取 AccessToken,后续调用则直接传递这个令牌。AccessToken 一般设有有效期,过期后需重新获取,微信开放平台就是典型的这种机制。
这就好比大部分网站都需要用户名和密码登录,并不是谁都能随意访问。对外提供的接口同样如此,需要在后台开通 AppID 并提供密钥,服务器端会进行严格的验证。
黑白名单策略
黑名单
如果某个 AppID 存在大量非法操作,或者被风控系统判定为恶意来源,可以直接将其列入黑名单,所有请求直接返回错误码。黑名单既可以是 AppID 级别,也可以是 IP 级别。针对特定 IP 的非法攻击行为,加入 IP 黑名单能直接阻断调用。
白名单
白名单通常指 IP 白名单。由于 AppID 本身已具备唯一性,相当于一种应用级白名单。IP 白名单更适用于服务端对服务端的调用场景(如第三方服务调用我方接口)。此时调用方的 IP 相对固定,上线前配置好白名单,非白名单内的 IP 将被拒绝。对于客户端直连服务端的场景,由于客户端 IP 多变,通常采用黑名单机制控制即可。
接口限流
权限控制之外,并发数限制也是关键。即使是合法用户,若出现高频调用,也需要对 AppID 进行限流处理。常见的算法包括令牌桶、漏桶和计数器。
- 令牌桶限流:系统按固定速率向桶中放入令牌,满额丢弃。请求到来时先取令牌,有则放行,无则等待或拒绝。它允许一定程度的突发流量,支持一次拿多个令牌。
- 漏桶限流:请求以固定速率流出,流入速率任意。当请求超过桶容量时,新请求等待或拒绝。该算法能强制限制数据传输速度。
- 计数器限流:较简单粗暴,限制总并发数或单位时间请求数。例如数据库连接池或秒杀场景,超过阈值即限流。
实际开发中,可以使用 Guava 的 RateLimiter 工具类基于令牌桶算法实现单机限流:
RateLimiter rateLimiter = RateLimiter.create(5);
以上代码表示一秒钟只允许处理五个并发请求。这种方式仅适用于单应用内部,若要实现全局限流,通常需要结合 Redis 和 Lua 脚本来完成。
数据合法性校验
校验分为常规性校验和业务校验两部分。
- 常规性校验:包括签名校验、必填项检查、长度限制、类型匹配及格式验证等。
- 业务校验:根据具体业务逻辑决定,例如订单金额不能小于零、库存数量必须大于零等。
通过以上几个维度的设计,基本可以覆盖大多数 API 接口的安全场景。

