4、JWT常见面试总结

JWT常见面试总结

1.JWT token 泄露了怎么办?

使用 https 加密你的应用,返回 jwt 给客户端时设置 httpOnly=true 并且使用 cookie 而不是LocalStorage 存储 jwt,这样可以防止 XSS 攻击和 CSRF 攻击。

2.Secret 如何设计?

jwt 唯一存储在服务端的只有一个 secret,个人认为这个 secret 应该设计成和用户相关的属性,而不是一个所有用户公用的统一值。这样可以有效的避免一些注销和修改密码时遇到的窘境。

3.注销和修改密码?

传统的 session+cookie 方案用户点击注销,服务端清空 session 即可,因为状态保存在服务端。但 jwt 的方案就比较难办了,因为 jwt 是无状态的,服务端通过计算来校验有效性。没有存储起来,所以即使客户端删除了 jwt,但是该 jwt 还是在有效期内,只不过处于一个游离状态。
分析下痛点:注销变得复杂的原因在于 jwt 的无状态。
提供几个方案,视具体的业务来决定能不能接受:

仅仅清空客户端的 cookie,这样用户访问时就不会携带 jwt,服务端就认为用户需要重新登录。这是一个典型的假注销,对于用户表现出退出的行为,实际上这个时候携带对应 的 jwt 依旧可以访问系统。

清空或修改服务端的用户对应的 secret,这样在用户注销后,jwt 本身不变,但是由 于 secret不存在或改变,则无法完成校验。这也是为什么将 secret 设计成和用户相关的 原因。

借助第三方存储自己管理 jwt 的状态,可以以 jwt 为 key,实现去 Redis一类的缓存中间件中去校验存在性。方案设计并不难,但是引入 Redis 之后,就把无状态的 jwt 硬生生变成了有状态了,违背了 jwt的初衷。实际上这个方案和 session 都差不多了。

修改密码则略微有些不同,假设号被到了,修改密码(是用户密码,不是 jwt 的 secret)之后,盗号者在原 jwt 有效期之内依旧可以继续访问系统,所以仅仅清空 cookie 自然是 不够的,这时,需要强制性的修改 secret。

4.如何解决续签问题

传统的 cookie 续签方案一般都是框架自带的,session 有效期 30 分钟,30 分钟内如果有访问,session 有效期被刷新至30 分钟。而 jwt 本身的 payload 之中也有一个exp 过期时间参数,来代表一个 jwt 的时效性,而 jwt 想延期这个exp 就有点身不由己了,因为 payload 是参与签名的,一旦过期时间被修改,整个 jwt 串就变了,jwt 的特 性天然不支持续签。

解决方案

1.每次请求刷新 jwt。

jwt 修改 payload 中的 exp 后整个 jwt 串就会发生改变,那就让它变好了,每次请求都返回一个新的 jwt给客户端。只是这种方案太暴力了,会带来的性能问题。

2.只要快要过期的时候刷新 jwt

此方案是基于上个方案的改造版,只在前一个 jwt 的最后几分钟返回给客户端一个新的jwt。这样做,触发刷新 jwt基本就要看运气了,如果用户恰巧在最后几分钟访问了服务器,触发了刷新,万事大吉。如果用户连续操作了 27 分钟,只有最后的 3分钟没有操作,导致未刷新 jwt,无疑会令用户抓狂。

3.完善 refreshToken

借鉴 oauth2 的设计,返回给客户端一个 refreshToken,允许客户端主动刷新 jwt。 一般而言,jwt
的过期时间可以设置为数小时,而 refreshToken 的过期时间设置为数天。

4.使用 Redis 记录独立的过期时间

在 Redis 中单独为每个 jwt 设置了过期时间,每次访问时刷新 jwt 的过期时间,若 jwt 不存在与 Redis 中则认为过期。

5.如何防止令牌被盗用?

令牌:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJObzAwMDEiLCJpYXQiOjE1NjkxNTg4MDgsInN1YiI6IuS4u-mimCIsImlzcyI6Ind3dy5pdGhlaW1hLmNvbSIsImV4cCI6MTU2OTE1ODgyMywiYWRkcmVzcyI6IuS4reWbvSIsIm1vbmV5IjoxMDAsImFnZSI6MjV9.lkaOahBKcQ-c8sBPp1Op-siL2k6RiwcEiR17JsZDw98

如果令牌被盗,只要该令牌不过期,任何服务都可以使用该令牌,有可能引起不安

全操作。我们可以在每次生成令牌的时候,将用户的客户端信息获取,同时获取用户的 IP

信息,然后将 IP 和客户端信息以 MD5 的方式进行加密,放到令牌中作为载荷的一部分,

用户每次访问微服务的时候,要先经过微服务网关,此时我们也获取用户客户端信息,同时

获取用户的 IP,然后将 IP 和客户端信息拼接到一起再进行 MD5 加密,如果 MD5 值和载

荷不一致,说明用户的 IP 发生了变化或者终端发生了变化,有被盗的嫌疑,此时不让访问

即可。这种解决方案比较有效。 当然,还有一些别的方法也能减少令牌被盗用的概率,
例如设置令牌超时时间不要太长。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白de成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值