下图显示了提高 API 性能的 5 种常见技巧。
分页
这是在结果集较大时常用的优化方法。结果会以流式方式传回客户端,以提高服务响应速度。
异步日志
同步日志每次调用都要处理磁盘,会降低系统速度。异步日志会先将日志发送到无锁缓冲区,然后立即返回。日志会定期刷新到磁盘,这大大减少了 I/O 开销。
缓存
我们可以将经常访问的数据缓存到缓存中。客户端先查询缓存,而不是直接访问数据库。如果出现缓存缺失,客户端可以从数据库中查询。Redis 等缓存将数据存储在内存中,因此数据访问速度比数据库快得多。
Payload 压缩
可以使用 gzip 等对请求和响应进行压缩,从而大大缩小传输数据的大小。这可以加快上传和下载速度。
连接池
访问资源时,我们经常需要从数据库加载数据。打开和关闭数据库连接会增加大量开销。因此,我们应该通过一个开放连接池来连接数据库。连接池负责管理连接的生命周期。
① 使用 HTTPS
数据加密:HTTPS 对客户端和服务器之间传输的数据进行加密。它使用 TLS 或其前身 SSL 对通信进行加密。这种加密可确保用户数据、身份验证等敏感信息在传输过程中保持安全。如果没有 HTTPS,这些信息可能会被数据包嗅探等技术截获。
合规要求:许多监管标准,如 GDPR 和 PCI DSS,都要求使用 HTTPS 来保护用户的敏感信息。
SEO 要求:谷歌等搜索引擎会优先考虑支持 HTTPS 的网站和应用程序接口,认为它们更安全。
② 使用 OAuth 2.0
OAuth 2.0 对设计安全可靠的 API 至关重要,因为它能够在不共享用户凭证的情况下使用代理来访问资源。它还支持跨多个应用程序和服务的集成,促进了单点登录(SSO),允许用户进行一次身份验证来无缝访问多个服务或应用程序。
③ 使用 WebAuthn
WebAuthn 不依赖于集中式服务器或密码数据库。它允许用户注册和使用自己的设备(如安全密钥或生物特征识别设备)进行身份验证,消除仅依赖密码的弱点。通过实现 WebAuthn,API 可以符合 FIDO 等安全标准,满足合规要求。
④ 使用分级 API Key
我们通常要针对系统开放的服务接口设计不同的访问权限。分级的 API Key 可以提供细粒度的访问控制。比如,在使用 Stripe 时,我们可以给“访问账户”指定一个只读 API Key,给“操作账户”指定另一个 API Key。
⑤ 授权
这一条和上一条相关。我们需要给系统内部的各种 API 接口设计访问授权,遵循“最小权限”原则。
⑥ 限流
在设计 API 时,需要估计大致容量,并针对容量来限流,从而保护系统。限流的好处有很多,比如防止 DDos 攻击,防止系统过载,合理分配系统资源等。
⑦ 版本控制
API 版本控制提供了一种结构化的 API 生命周期管理方法,将 API 的管理提升到代码一个级别,同时确保向后兼容性。它使开发人员能够引入新功能而不会破坏用户对于旧版本的依赖。
⑧ 白名单
白名单指定并仅允许预先批准的 IP 地址或用户访问 API。这有助于防止常见的安全威胁,如未经授权的访问、数据泄露、注入攻击等。它提高了潜在攻击者的门槛。
⑨ 定期检查 OWASP API 安全风险清单
The OWASP API Security Top 10 是由 OWASP(Open Web Application Security Project)编制的清单,该组织致力于提高软件安全性。该清单特别突出了与 API 相关的最关键安全风险,旨在提高开发人员、安全专业人员和组织对 API 相关漏洞和威胁的意识,并提供指导,以有效解决这些问题。
⑩ 使用 API 网关
API 网关作为入站 API 请求的集中入口点。它们能够实施诸如身份验证、授权、加密和威胁防护等安全措施。这种集中化能够在所有 API 中应用一致的安全策略。
11 错误处理
有效的错误处理机制使 API 能够优雅地处理意外情况或故障,确保错误得到适当地传达给客户端,提供更好的用户体验。确保返回给客户端的错误消息不会暴露 API 内部运作或基础架构的敏感信息。
12 输入验证
无效或格式不正确的输入数据可能导致数据丢失、损坏或系统崩溃。输入验证在设计安全可靠的 API 中至关重要,有助于防止常见的攻击,如 SQL 注入、NoSQL 注入和其他基于注入的漏洞。