在微服务架构中,将身份认证与安全校验收敛到网关层是行业通用做法,适合大多数需要统一入口管理的业务场景。
核心结论:网关层统一鉴权能避免重复建设,但必须配合网络隔离与 HTTPS 传输,严禁使用全局 bypass 开关。
- 实施前提:确认所有外部流量强制经过网关,后端服务关闭公网访问。
- 关键配置:网关集成 JWT 或 OAuth2 校验插件,后端信任网关透传的特定 Header。
- 验证标准:无 Token 请求返回 401,后端日志无敏感 Token 泄露,内部接口无法绕过网关访问。
Spring Cloud Gateway 全局过滤器实现
基于 Spring Cloud Gateway 实现 JWT 校验,需编写 GlobalFilter 拦截请求。以下代码示例展示了如何从 Header 提取 Token 并验证:
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
String token = authHeader.substring(7);
// 此处调用 JwtUtils 验证签名与过期时间,伪代码略
if (!JwtUtils.validate(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 验证通过后,透传用户信息到下游
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-User-Id", JwtUtils.getUserId(token))
.build();
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public int getOrder() {
return -100;
}
}Kong 网关 JWT 插件配置
若使用 Kong 网关,可通过 Admin API 启用 JWT 插件,无需编写代码。配置示例如下:
curl -X POST http://kong-admin:8001/services/{service}/plugins \
`--data` "name=jwt" \
`--data` "config.key_claim=iss" \
`--data` "config.secret_is_base64=false" \
`--data` "config.run_on_preflight=false"启用后,Kong 会自动拦截未携带有效 JWT 的请求。
验证认证是否生效
1. 无 Token 访问测试
使用 curl 请求受保护接口,不带 Authorization 头,预期返回 401 状态码。
curl -v -X GET http://api.example.com/user/profile \
-H 'Content-Type: application/json'2. 错误 Token 测试
携带伪造或过期的 Token,预期网关直接拦截,后端服务日志中不应出现该请求。
curl -v -X GET http://api.example.com/user/profile \
-H 'Authorization: Bearer invalid_token_here'3. 后端日志检查
查看后端服务日志,确认收到的请求头中包含网关注入的用户信息(如 X-User-Id),且没有原始的 Token 泄露风险。
安全加固与网络隔离
1. 强制 HTTPS 传输
Token 在传输层可能泄露,网关层必须配置 SSL 证书,强制启用 HTTPS,避免中间人攻击窃取凭证。
2. 后端网络隔离(ACL)
内部服务 bypass 是常见风险。务必在云安全组或防火墙配置 ACL,限制后端服务仅接受来自网关网段的流量,拒绝所有公网直接访问。
3. 头信息伪造防护
后端服务必须配置为只信任网关传来的用户信息头。建议在网关层移除客户端传入的敏感 Header(如 X-User-Id),防止客户端伪造。
4. 应急方案替代 bypass
严禁开放全局 bypass 开关。一旦认证服务故障,建议配置内部 IP 白名单或签名机制,仅允许特定监控 IP 跳过认证,避免全链路不可用。
常见故障排查
1. 时钟 skew 问题
JWT 校验依赖时间,网关与认证服务器时间不同步会导致合法 token 被误判过期。建议所有节点统一使用 NTP 时间同步。
2. 性能瓶颈
网关校验逻辑过重(如每次请求都查库)会拖慢整体响应。建议采用非对称加密签名校验,避免网关直连数据库,必要时引入本地缓存。