2. 风控网关基础:网关在风控体系中的位置、请求拦截与转发机制、常见风控场景

2.1 网关在风控体系中的位置

风控网关是业务流量进入风控系统的第一道关卡,部署在客户端与后端业务服务之间。它承担着流量入口、协议转换、请求拦截与分发等核心职责,是实时风控体系中的“前哨站”。

在典型的风控架构中,网关位于以下位置:

架构定位: 客户端 → 风控网关 → 业务服务 → 风控引擎(规则/模型) → 决策输出

网关与风控引擎的分工对比:

维度 风控网关 风控引擎
核心职责 请求拦截、协议解析、流量控制 规则计算、模型推理、决策打分
处理延迟 微秒级(< 1ms) 毫秒级(1~100ms)
数据量级 全量请求 经过网关过滤后的待决策请求
状态维护 无状态或轻量会话 有状态(特征缓存、计数器)
典型技术栈 Nginx / OpenResty / Kong / Spring Cloud Gateway Spark Streaming / Flink / Drools
实践要点: 网关层应保持轻量,只做必要的请求预处理和黑白名单拦截,复杂的特征计算和模型推理应下沉到风控引擎层,避免网关成为性能瓶颈。
风控网关在整体架构中的位置 风控网关在整体架构中的位置 客户端 风控网关 请求拦截 / 转发 业务服务 风控引擎 规则 / 模型 / 决策 旁路异步日志 说明:网关拦截请求后,正常请求转发至业务服务,同时将请求日志异步发送至风控引擎进行深度分析。 网关层仅做快速过滤,复杂计算下沉至引擎层。

2.2 请求拦截与转发机制

风控网关的核心工作流程分为三个阶段:请求解析 → 拦截判断 → 转发/拒绝。每个阶段都有明确的处理逻辑和性能要求。

2.2.1 请求解析阶段

网关从原始HTTP请求中提取风控所需的上下文信息:

  • 基础信息: 请求URL、HTTP方法、请求头(User-Agent、Referer、Cookie)、请求体(JSON/Form)
  • 网络信息: 客户端IP、X-Forwarded-For、请求协议、端口
  • 设备指纹: 设备ID、浏览器指纹、操作系统版本(通常由前端SDK采集后放入Header)
  • 会话信息: 用户Token、SessionID、登录态标识

2.2.2 拦截判断阶段

网关根据预定义的规则对请求进行快速过滤,常见的拦截策略包括:

拦截策略 判断依据 典型阈值 处理动作
IP黑名单 请求来源IP是否在预置黑名单中 命中即拦截 返回403
IP频率限制 单位时间内同一IP的请求次数 100次/分钟 返回429 + 限流
设备黑名单 设备指纹是否在黑名单中 命中即拦截 返回403
Token有效性 Token是否过期、签名是否合法 过期/非法即拦截 返回401
请求参数校验 必填字段是否缺失、格式是否合法 缺失/非法即拦截 返回400
UA/设备指纹校验 User-Agent是否为空或异常 空或异常即拦截 返回403

2.2.3 转发/拒绝阶段

经过拦截判断后,网关执行最终动作:

  • 放行转发: 将请求转发至后端业务服务,同时将请求日志异步发送至消息队列(Kafka/RocketMQ),供风控引擎消费。
  • 拒绝拦截: 直接返回错误响应,不转发至业务服务,减少后端无效负载。
  • 降级处理: 在网关负载过高时,可对非核心请求进行降级(如跳过设备指纹校验),优先保障核心交易链路。
注意: 网关拦截应避免“一刀切”。对于疑似风险但无法确定的请求,建议放行并标记风险等级,由风控引擎做二次判断,防止误杀正常用户。
请求拦截与转发流程 请求拦截与转发流程 客户端请求 请求解析 拦截判断 通过/拒绝 拒绝拦截 返回 403/429 放行转发 转发至业务服务 异步日志 → Kafka / RocketMQ 拒绝:直接返回错误,不转发业务。 放行:转发业务 + 异步发送日志。

2.3 常见风控场景

风控网关需要针对不同业务场景定制拦截策略。以下是三个核心场景的网关处理要点:

2.3.1 登录场景

登录是风控网关拦截的第一道防线,主要防范:

  • 暴力破解: 同一IP或账号在短时间内大量尝试登录
  • 撞库攻击: 使用已泄露的账号密码批量尝试登录
  • 异常设备登录: 从未见过的设备指纹或地理位置发起登录

网关层处理策略:

风险类型 网关拦截策略 阈值示例
暴力破解 IP级 + 账号级频率限制 同一IP 10次/分钟;同一账号 5次/分钟
撞库攻击 设备指纹 + IP组合限流 同一设备 20次/小时
异常登录 地理位置白名单 + 设备指纹校验 非常用地区登录需二次验证

2.3.2 交易场景

交易场景对实时性和准确性要求最高,网关需要快速识别异常交易行为:

  • 高频交易: 同一用户在短时间内发起多笔交易
  • 大额异常交易: 交易金额远超用户历史均值
  • 批量刷单: 同一设备/IP操作多个账号进行交易

网关层处理策略:

风险类型 网关拦截策略 阈值示例
高频交易 用户级交易频率限制 同一用户 3笔/分钟
大额异常 金额阈值 + 历史均值对比 单笔 > 5000元 或 > 历史均值3倍
批量刷单 设备/IP关联账号数限制 同一设备关联 > 5个账号

2.3.3 支付场景

支付场景涉及资金安全,网关需要更严格的校验:

  • 支付重放攻击: 同一支付请求被重复提交
  • 支付篡改: 请求中的金额、收款方等参数被篡改
  • 盗卡支付: 使用他人支付信息进行支付

网关层处理策略:

风险类型 网关拦截策略 阈值示例
支付重放 请求唯一ID(幂等键)校验 同一ID仅允许一次成功支付
支付篡改 请求签名校验 + 参数完整性校验 签名不匹配直接拒绝
盗卡支付 设备指纹 + 支付信息绑定关系校验 新设备绑定新卡需二次验证
场景化配置建议: 不同场景的拦截阈值应动态调整。例如,大促期间交易频率阈值可适当放宽,而登录场景的阈值应保持严格。建议将阈值配置外置化(如配置中心),支持热更新,避免重启网关。

2.4 网关与Spark实时风控的衔接

在《Spark实时风控网关回放对比学习》课程中,网关层产生的请求日志将通过消息队列进入Spark Streaming作业。网关层需要确保:

  • 日志完整性: 每条请求都包含完整的上下文信息(IP、设备、用户、时间戳、请求参数)
  • 日志时效性: 日志从网关产生到进入Spark的延迟应控制在秒级
  • 日志格式统一: 采用JSON或Avro等结构化格式,便于Spark解析

一个典型的网关日志格式示例:

{
  "eventId": "req_20250321103045001",
  "timestamp": 1742531445000,
  "scene": "login",
  "userId": "u_10086",
  "deviceId": "d_abc123",
  "clientIp": "192.168.1.100",
  "action": "login_submit",
  "params": {
    "username": "user@example.com",
    "loginType": "password"
  },
  "riskTags": ["ip_high_freq", "new_device"]
}