Skip to content

API网关设计

非原创

API所需安全功能

身份和访问控制

  • 认证
HTTP Basic:
API Key:客户端传递(参数+Key+Sign)到服务端(使用参数计算Sign,比较两个Sign)
OAuth:最受欢迎的网关验证协议
JWT:
  • 授权
RBAC:基于角色的访问控制
ABAC:基于属性的访问控制

通信安全

威胁防护

  • 输入控制

  • 消息限制

  • SQL注入

  • JSON防护

  • XML防护

  • 输出控制

输出编码

日志记录

认证日志:
操作日志:

黑白名单

API监控

API限速

API接口调用方式

HTTP+请求签名机制

  • 特点

所有携带接口信息的HTTP头内容都必须参与签名计算

不同HTTP头内容也需要按照一定规则排序

  • 优点

  • 缺点

签名算法太复杂,易用性贼差

响应包可被窃听、伪造、需要防范Replay(重放)攻击

HTTP+参数签名机制

  • 特点

只有GET和POST参数的内容需要参与签名计算

  • 优点

签名算法想对简单,易用性有较大提升

  • 缺点

响应包可被窃听、伪造、需要防范Replay(重放)攻击

HTTPS+访问令牌机制

  • 特点

无需签名计算

依靠传输层加密和访问令牌的不可伪造性保证安全

  • 优点

相对安全,无法通过网络抓包方式窃听或伪造数据

易用性高,无需再为签名头疼,无需考虑Replay攻击

  • 缺点

安全性建立在用户不被中间人攻击和令牌不被泄漏的情况下

更好的方案

  • 牺牲易用性换取安全性

HTTPS+内容签名机制

HTTPS+内容加密机制

  • 降低令牌泄漏带来的风险

为开发者提供绑定服务器IP列表、限制refer等支持

针对不同应用场景颁发不同有效期等访问令牌

针对不同安全级别的数据授权颁发不同有效期的访问令牌

为开发者和用户提供令牌作废支持

关于认证

JWT

JWT:Json Web Token 跨域认证解决方案

  • JWT数据格式

以一个很长的字符串代表,中间用.分割成三个部分

Header.Payload.Signature
Header:头部
    alg:签名算法(algorithm),默认是HMAC SHA256;
    typ:表示令牌(token)的类型,JWT令牌统一为JWT;

Payload:负载(默认字段有以下7个,还可以自定义字段)
    iss(issuer):签发人
    exp(expiration):过期时间
    sub(subject):主题
    aud(audience):受众
    nbf(Not Before):生效时间
    iat(Issued At):签发时间
    jti(JWT ID):编号

Signature:签名(指定一个密钥)
    sign=HMACSHA256(base64UrlEncode(header)+"."+baseUrlEncode(payload),secret)

关于Base64URL

=:被省略
+:替换为-
/:替换为_
  • JWT特点
默认不加密,但是也可以加密;

JWT不加密的情况下,不能将敏感数据写入JWT;

JWT不仅可以用于认证,还可以用于交换信息;

JWT的缺点:由于服务器不保存session状态,因此无法在使用过程中废止某个token,或者更改token的权限。也就是说JWT一旦签发,到过期之前都有效;

JWT本身包含了认证信息,一旦泄漏,任何人都可以获得该令牌的所有权限。应该将有效期设置的短一些;

为了减少盗用JWT,应该尽可能使用HTTPS协议传输;

OAuth

参考资料

网关在API安全中的作用

REST API 安全设计指南

HTTP API接口安全设计

开发安全的 API 所需要核对的清单

移动APP网关安全设计

JSON Web Token 入门教程

理解OAuth2.0