JWT Access Token 被窃取的风险与解决方案

JWT Access Token 被窃取的风险与解决方案

上周在面试的时候被问到了这个问题,我只回答上来了 JWT Access Token 进行无状态认真的原理,但是针对具体的问题完全没有思路,因此通过这篇文章进行整理。
在这里插入图片描述

JWT Access Token 被窃取后会产生的问题

  1. 身份冒充:盗窃者可以通过 JWT 冒充被盗取的用户;
  2. 数据泄露:攻击者可以访问用户的敏感数据,如果 JWT 的 PayLoad 中直接包含用户的敏感数据,那么攻击者可以直接对 PayLoad 进行解码来获取敏感数据,否则攻击者可以通过 JWT 登录以访问用户的隐私数据;
  3. 权限提升:如果 token 包含高权限,攻击者可执行危险的操作;
  4. 会话劫持:JWT 被窃取后,攻击者可以完全控制用户的会话;
  5. API 滥用:利用合法 Token 进行 API 滥用。

解决方案

1. HTTPS(TLS 加密)

HTTPS 协议可以在数据传输过程中对数据进行端到端的加密

基于 HTTPS 协议进行通信可以防止中间人攻击,避免 token 在传输过程中被明文截获

现代浏览器已经对非 HTTPS 网站标记为“不安全”,强制加密成为标配。

基于 HTTPS 加密,即使攻击者窃取到饿了数据包,也无法解密 TLS 加密的内容。

2. HTTP Only + Secure Cookie

HTTP Only
HTTP Only 是一种 Cookie 属性,设置后表示该 Cookie 只能通过 HTTP 协议传输,无法通过客户端脚本(比如 JavaScript)访问。

设置 Cookie 属性的 HTTP Only 可以防御 XSS 攻击。

Secure Cookie
Cookie 的 Secure 属性表示 Cookie 只能通过 HTTPS 加密连接传输,防止在明文 HTTP 中泄漏。

3. 短期有效期(Short Expiry)

为 JWT Access Token 设置较短的有效期。

  • 缩小攻击的窗口期,即使 Token 被窃取,攻击者的使用时间也有限;
  • 需要配合 Refresh Token 使用,不影响用户体验
  • 统计显示 90% 的 Token 滥用发生在窃取后的几分钟内。

4. 声明验证(Claims Validation)

指的是服务端严格验证 Token 中的声明。

5. 客户端指纹绑定

将 Token 与客户端特征绑定。

  • 当 token 在不同设备/浏览器使用时会被拒绝;
  • 即使 token 泄漏,攻击者也难以复制被窃取方完整的客户端环境;
  • 可检测 99% 的异地登录行为。

6. Token 撤销列表(JWT Blacklist)

Token Blacklist 属于 JWT Access Token 的主动防御机制,其工作流如下:

客户端 -> [Access Token] -> 网关
                          ↓
                   [检查Redis黑名单]
                          ↓
                   [有效:放行 | 无效:401]

它具有以下特点:

  • 即时响应:Redis 查询;
  • 可拓展:TTL 自动清理过期条目;
  • 微服务友好:集中式管理;

7. 使用次数限制

如果携带某个 JWT 的 HTTP 请求次数超过阈值,对其进行限流。

8. 动态 Token(Rotating Token)

每次请求后返回新的 token,旧的 token 立即失效,客户端必须持有持续更新的 token 才能过访问。

优势:

  • 单个 token 有效期只有单次请求;
  • 即使 token 被截获,攻击方也无法正常使用,因为被窃取者单次请求之后上一次的 token 就过期了;

动态 Token 适合金融级的安全要求。

9. Proof Key for Code Exchange(PKCE)

OAuth 2.0 增强流程:

  1. 客户端生成 code_verifiercode_challenge
  2. 授权请求携带 code_challenge
  3. Token 交换时验证 code_verifier

10. JWT Refresh Token

Refresh Token 是现代认证系统中关键的组件,它通常与 Access Token 配合使用,在安全性与用户体验之间取得平衡。

双 Token 的设计如下:

Token 类型用途生命周期存储位置
Access Token访问资源生命周期短(分钟级)
Refresh Token获取新的 Access Token长(天/月级)安全存储

双 Token 的典型工作流:

Client Auth Server Resource Server 用户名/密码 Access Token(1h) + Refresh Token(7d) API请求(带Access Token) 返回数据 Access Token过期 用Refresh Token获取新Access Token 返回新Access Token Client Auth Server Resource Server

双 Token 的安全设计原理

  • Access Token 短期有效:即使泄漏,攻击者只能在有限时间窗口内发起攻击;
  • Refresh Token 长期有效:只能用于获取新的 Access Token,不能直接访问资源。

实际开发当中的部署建议

基础防护(所有项目必备)

  1. 强制 HTTPS;
  2. HTTP Only + Secure Cookie;
  3. 设置 token 有效期为 15 ~ 30 分钟;
  4. 基本 claims 验证。

中级防护(敏感业务)

  1. 客户端指纹绑定;
  2. 异常使用监控;
  3. 关键操作二次验证。

高级防护

  1. 动态 Token 轮换;
  2. PCKE 流程;
  3. 硬件绑定;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值