找回密码
 立即注册
首页 业界区 业界 微服务Token鉴权的7种方案

微服务Token鉴权的7种方案

驼娑 2025-8-1 14:59:07
前言

最近有球友问我:微服务中Token鉴权除了使用JWT之外,还有什么其他的方案?
今天这篇文章跟大家一起聊聊微服务Token鉴权的7种方案,希望对会有所帮助。
1. 为什么必须做Token鉴权?

传统Session的致命缺陷
1.png

多个服务无法共享Session。
重复认证,导致系统性能严重下降。
2023年某电商平台发送安全事故
  1. GET /api/users/balance HTTP/1.1
  2. Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Gfx6VO9tcxwk6xqx9yYzSfebbeKDTHkQKh0xhu4nJE0
复制代码
黑客通过XSS攻击窃取此Token后,在2小时内盗取5万用户余额,暴露三大漏洞:

  • Token未绑定IP/设备指纹
  • 敏感操作未二次认证
  • 无异常行为检测机制
2.常见的Token鉴权方案

方案1:基础JWT+Redis方案

该方案适合初创系统。
核心架构
2.png

致命陷阱
  1. // 错误示例:未校验Token有效性
  2. public Claims parseJwt(String token) {
  3.     return Jwts.parser()
  4.         .setSigningKey(SECRET_KEY)
  5.         .parseClaimsJws(token)
  6.         .getBody(); // 若Token被注销仍能解析通过!
  7. }
复制代码
正确实现
  1. // 结合Redis校验Token状态
  2. public boolean validateToken(String token, UserDetails details) {
  3.     String username = extractUsername(token);
  4.     String redisToken = redisTemplate.opsForValue().get("token:"+username);
  5.    
  6.     // 双重验证:签名有效且未注销
  7.     return (username.equals(details.getUsername())
  8.         && !isTokenExpired(token)
  9.         && token.equals(redisToken);
  10. }
复制代码
适用场景:用户量 {            SaRouter.match("/user/**").check(r -> StpUtil.checkPermission("USER"));            SaRouter.match("/admin/**").check(r -> StpUtil.checkPermission("ADMIN"));        });}[/code]
性能实测:QPS 12,000(Redis集群模式)
方案4:API网关统一鉴权

该方案是微服务的标配。
架构设计
3.png

响应式鉴权过滤器
  1. spring:
  2.   security:
  3.     oauth2:
  4.       client:
  5.         registration:
  6.           github:
  7.             client-id: ${GITHUB_CLIENT_ID}
  8.             client-secret: ${GITHUB_SECRET}
  9.             scope: user:email,read:user
  10.         provider:
  11.           github:
  12.             token-uri: https://github.com/login/oauth/access_token
  13.             user-info-uri: https://api.github.com/user
复制代码
性能优化技巧

  • 本地缓存:使用Caffeine缓存验证结果
  • 批量验证:聚合10ms内请求统一鉴权
  • 热点Token特殊处理
方案5:Token中继模式

该方案适合服务链调用。
核心问题:服务A调用服务B时Token如何传递
解决方案
4.png

Feign中继实现
  1. // 登录
  2. StpUtil.login(10001);
  3. // 鉴权
  4. @SaCheckPermission("user:delete")
  5. public void deleteUser(Long id) {
  6.   // 业务代码
  7. }
复制代码
安全加固:使用JWT嵌套加密防止内部Token泄露
方案6:JWE加密令牌

该方案能保证金融级安全。
与JWT的核心区别
5.png

Java生成示例
  1. // 查询所有会话
  2. List<String> sessionList = StpUtil.searchSessionId("user:*", 0, 10);
复制代码
适用场景

  • 支付凭证
  • 身份证号传输
  • 医疗健康数据
方案7:双向TLS认证

该方案是零信任架构。
工作流程
6.png

Spring Boot配置
  1. // 根据账号ID踢人
  2. StpUtil.kickout(10001);
  3. // 根据Token值踢人
  4. StpUtil.kickoutByTokenValue("xxxx");
复制代码
适用场景

  • 服务网格内部通信
  • 银行核心系统
  • 政府机密数据交换
3.性能压测对比

方案平均延时CPU消耗安全等级适用场景基础JWT3ms15%★★☆内部微服务OAuth2.035ms40%★★★☆第三方开放平台Sa-Token5ms18%★★★快速开发项目网关统一鉴权8ms25%★★★☆多语言混合架构Token中继12ms30%★★★服务链调用JWE加密45ms60%★★★★☆金融敏感数据mTLS20ms50%★★★★★零信任网络
测试环境:AWS c5.4xlarge 16核32GB × 3节点
4.安全攻防

4.1 四大攻击手段及防御

攻击类型防御方案代码实现Token窃取绑定设备指纹StpUtil.getToken().setExtra("deviceId", fingerprint)重放攻击Nonce校验+时间戳redis.opsForValue().setIfAbsent(nonce, "used", 5, TimeUnit.SECONDS)越权访问动态权限校验@SaCheckPermission("#user.id")Token破解定期轮换签名密钥Jwts.parserBuilder().setSigningKeyResolver(new KeyRotationResolver())4.2 审计日志必备字段

为了保证系统的操作安全,我们需要增加审计日志表。
审计日志必备字段如下:
  1. @Bean
  2. public SaReactorFilter saReactorFilter() {
  3.     return new SaReactorFilter()
  4.         .addInclude("/**")
  5.         .setAuth(obj -> {
  6.             SaRouter.match("/user/**").check(r -> StpUtil.checkPermission("USER"));
  7.             SaRouter.match("/admin/**").check(r -> StpUtil.checkPermission("ADMIN"));
  8.         });
  9. }
复制代码
5.方案如何选型?

7.png

总结


  • 初创期:基础JWT+Redis方案
  • 发展期:OAuth2.0+网关鉴权
  • 成熟期:JWE加密+双向TLS
  • 高级期:零信任架构+AI风控
微服务安全如同城堡防御——
单一的护城河无法阻挡所有入侵,
需要城墙、箭塔、卫兵的多层防护。
没有绝对安全的系统,只有不断提高的攻击成本。
最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册