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),供风控引擎消费。
- 拒绝拦截: 直接返回错误响应,不转发至业务服务,减少后端无效负载。
- 降级处理: 在网关负载过高时,可对非核心请求进行降级(如跳过设备指纹校验),优先保障核心交易链路。
注意: 网关拦截应避免“一刀切”。对于疑似风险但无法确定的请求,建议放行并标记风险等级,由风控引擎做二次判断,防止误杀正常用户。
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"]
}