API 网关进阶一(API 策略)

API 具体策略配置通过流量入口进行配置,配置分为全局策略配置和具体 API 策略配置。

  • 全局策略

    全局策略会对其下所有 API 生效。

API 网关进阶一(API 策略) - 图1

  • 具体 API 策略配置

是对指定 API 进行配置策略,其影响范围只会在这个 API 内。

API 网关进阶一(API 策略) - 图2

在对 API 配置策略时,可以选择某个策略继承全局策略的配置,或者某个策略使用自己的独立配置:

API 网关进阶一(API 策略) - 图3

注意修改这个“使用全局策略”的开关后,会展现全局配置的内容,需要你确认后,提交配置才能生效

流量接收转发

API 网关进阶一(API 策略) - 图4

一、强制跳转HTTPS

这里的配置可以控制特定域名或特定 API,强制不跳转或者跳转 HTTPS。

TIP

如果在 SLB 上进行了 HTTPS 强制跳转配置,则此处配置不会起作用

二、入口域名透传

关闭策略或使用默认配置时,后端服务接收到请求中的 Host 头是创建 API 时填写的转发地址,客户端访问的入口域名可以通过 X-Forwarded-Host 这个请求头获取到;如果后端服务希望直接从 Host 头中拿到入口域名,可以开启入口域名透传这个配置

三、请求/应答缓冲区

关闭策略或使用默认配置时,网关会对客户端请求和后端应答分别设立缓冲区。

请求缓冲区的作用是接收完客户端完整的 HTTP 请求后,再转发给后端服务,这样在客户端网络上行速度慢时,可以避免跟后端服务建立长时间的连接,减少连接数带来的压力;应答缓冲区的作用是将后端返回的应答一次性接收完,在客户端网络下行速度慢时,同样避免跟后端服务建立长时间的连接。

若希望后端能立即接收到客户端的请求首字节,请关闭请求缓冲区;若希望客户端能立即接收到服务端的应答首字节 (TTFB 优化),请关闭应答缓冲区。

四、客户端请求限制

当 HTTP 请求的 Body 大小超过此限制时,会返回 HTTP 413 Request Entity Too Large 的错误

五、超时时间设置

  • 客户端请求超时:网关接收客户端请求的超时
  • 客户端应答超时:网关向客户端发送应答的超时
  • 后端建连超时:网关与后端服务建立连接的超时
  • 后端请求超时:网关向后端服务发送请求的超时
  • 后端应答超时:网关接收后端服务应答的超时

跨域访问

API 网关进阶一(API 策略) - 图5

配置项说明

配置项含义
允许的 HTTP 方法作为跨域应答头 Access-Control-Allow-Methods 的值
允许的 HTTP 请求头作为跨域应答头 Access-Control-Allow-Headers 的值,注意不能配置成通配符 ‘*’,有浏览器兼容性问题
允许的跨域地址作为跨域应答头 Access-Control-Allow-Origin 的值
允许携带 cookie是否设置跨域应答头 Access-Control-Allow-Credentials 为 true
预检请求缓存时间作为跨域应答头 Access-Control-Max-Age 的值

TIP

允许的跨域地址给出了默认值:$from_request_origin_or_referer。这个变量的含义是,优先从请求头 Origin 中获取跨域地址,如果获取不到从请求头 Referer 中获取,如果仍然获取不到,则这个值是‘*’

允许的HTTP请求头给出了默认值:$http_access_control_request_headers。这个变量的含义是,取请求头Access-Control-Request-Headers 的值作为这个应答头的值

以上给出的默认值,可以方便业务解决跨域的问题,但属于安全性比较低的配置,对于生产环境,建议对 Access-Control-Allow-Origin 配置准确的域名,以避免跨域风险

自定义 nginx 配置

API 网关进阶一(API 策略) - 图6

配置说明

允许配置 nginx 所有 location 区块下的指令,详情请参考 nginx 官方文档API 网关进阶一(API 策略) - 图7 (opens new window)

示例一: 增加客户端的 HTTP 应答头

  1. add_header hello world;

添加这个配置后,客户端收到的 HTTP 应答头中会增加一项: hello:world

示例二:增加给后端服务的 HTTP 请求头

  1. proxy_set_header hello world;

添加这个配置后,后端服务收到的 HTTP 请求头中会增加一项: hello:world

TIP

对于自定义设置应答头,建议使用 more_set_headers 指令来代替 add_header,这个指令可以实现应答头的覆盖,而非追加。

配置方式: more_set_headers "hello: world";

具体可以参考 more_set_headersAPI 网关进阶一(API 策略) - 图8 (opens new window)

IP 拦截

API 网关进阶一(API 策略) - 图9

用户 IP 来源

如果是客户端直连网关,或者 SLB 配置了 TCP 协议转发,使用对端 IP 地址即可识别用户 IP;如果 SLB 配置了 HTTP/HTTPS 协议转发,请选择从请求头 x-forwarded-for 中获取用户 IP。

IP 黑白名单

  • 黑名单模式:对配置在 IP 列表框中的 IP,在访问时返回 403 状态码
  • 白名单模式:对配置在 IP 列表框中的IP除外的所有 IP,在访问时返回 403 状态码

CC防护

针对用户 IP,计算每个 IP 的并发连接数和请求速率,当超过的时候返回 503 状态码;注意这里的请求速率是针对两个连续请求的间隔进行计算的,例如配置了10 请求/分钟,则如果两个请求间隔小于 6 秒,就会返回 503

服务负载保护

API 网关进阶一(API 策略) - 图10

吞吐和转发延时

网关会按照配置的服务最大吞吐,对请求服务的流量去峰填谷,确保到达后端服务的请求速率在限定的吞吐内。

当网关接收到的请求超过吞吐速率时,网关会根据超过的程度计算惩罚延时,若惩罚延时小于最大额外延时,则增加惩罚延时后再将请求发送给服务;若惩罚延时超过最大额外延时,则立即拒绝请求。

自定义状态码和应答

当超过服务吞吐,网关会根据配置返回给客户端拒绝状态码拒绝应答

拒绝状态码非 3xx 时,拒绝应答会作为 http body 返回;拒绝状态码为 3xx 时,拒绝应答需要配置一个 http 地址,用于重定向被拒绝的请求。

一种较常用的方式是,设计一个对用户友好的”稍后重试”静态页面,放到 CDN 上,同时在这里配置拒绝状态码为 302,拒绝应答为该静态页面的 CDN 链接。

跨站防护 (csrf 校验)

API 网关进阶一(API 策略) - 图11

防护机制

跨站攻击示意图:

csrf1csrf1

用户在访问恶意站点时通过触发恶意脚本,可以在用户无感知的情况下,发起修改用户信息的请求,因为浏览器记录了用户 cookie,能顺利通过认证,实现恶意篡改

跨站防护示意图:

csrf2csrf2

在开启 API 网关的跨站防护功能后,会在用户登录成功后种下 csrf token,配合前端改造,对所有请求带上 csrf token;

网关在收到请求后,会对 csrf token 进行校验,确认是属于当前用户的 token,才会将请求正常转发给后端。

配置说明

配置项含义
鉴别用户的 cookie 名称用于生成 csrf-token,不带该 cookie 时不会进行 csrf 校验,后端识别该 cookie 过期时需要配合前端进行清除,避免缺失 csrf token 导致登录报错
关闭校验的 http 方法对这些请求方法,将跳过 csrf 校验,但仍然会种下 csrf-token的cookie
token 的名称网关将生成的 csrf token 设置到这个名称的 cookie 里,前端需要从 cookie 中获取 csrf token,带在同名请求头里发起请求
token cookie 的生效域名不填写时,只会针对发起请求的域名种下 csrf token 的 cookie
cookie 开启 secure 属性开启 secure 时,所有 http 请求都将无法通过 csrf 校验
token 过期时间过期的 token 将无法通过校验
token 更新周期请求携带 token 距离签发超过更新周期时,会进行重签
校验失败的状态码csrf 校验失败时返回的 HTTP 状态码
校验失败的应答csrf 校验失败时返回的 HTTP 应答