我所遇见的JWT

105 阅读3分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

JWT无状态之说?

  • 无状态即客户端不依赖服务端的信息,每次的请求都不需要落到同一台服务器上
  • 服务端如果保存了用户状态,无法进行水平扩展
  • 客户端每次请求都必须带着token,通过token识别用户身份
  • 减少了服务端存储压力

如何实现踢人下线

JWT本身无状态的设定导致其不适合做服务端操作用户的行为,比如黑名单等操作,还是需要在redis存储token来达到控制用户的目的。

黑名单的实现:Redis维护无效token,在验证token前查询黑名单种是否有该token,为了防止黑名单不断变大,需要加上过期时间

踢人下线可以在服务器端设置Token的过期时间,并在客户端进行定时刷新,如果用户在另一个浏览器登录,则新的Token会覆盖旧的 Token,从而使旧的Token失效。

或者维护黑名单,当客户端请求服务器时,服务器可以检查Token是否在黑名单中,如果在黑名单中,则返回一个特定的状态码,客户端可以根据这个状态码来判断Token是否需要重新获取。

JWT+RSA无状态鉴权

JWT+RSA无状态鉴权+加密

浏览器关闭后清除token

浏览器关闭后token没过期的话,用户不需要登录就可以直接进入页面,存在安全隐患

token存储在sessionStorage(会话级别的存储,页面会话结束后就会被删除,localStorage时本地存储,除非手动触发删除,不然不会删除)中,

无感清除token

token过期时需要刷新token,刷新时需要做到无感知,避免用户频繁地登录

可以使用拦截器进行拦截,判断token过期后,调用刷新token的接口

同时使用变量isRefreshing判断是否处于刷新状态,避免多次刷新

单点登出清除所有token

A,B,C三个系统分别获取Atoken,Btoken,Ctoken

其中某一个系统主动登出后,其他两个系统也一起登出,所有token失效

username做为key,每个系统的token做value,用redis的list作为存储结构

登出的时候对应的token列表随之删除

JWT可以设置有效期,如果过期了怎么办,如何续期?

JWT过期后,需要客户端重新获取新的Token,可以在服务端设置Token过期时间,客户端请求服务器时,服务器检查Token是否过期,如果过期返回特定状态码,客户端根据这个状态码判断Token是否需要续期,并重新请求服务器获取新的Token

JWT账号退出和修改密码如何解决

当用户退出或者修改密码后,需要让之前的Token失效,避免被未经授权的用户使用。一种解决方法是在服务器端维护一个黑名单,将所有已经失效的Token添加到黑名单中,当客户端请求服务器时,服务器可以检查Token是否在黑名单中,如果在黑名单中,则返回一个特定的状态码,客户端可以根据这个状态码来判断Token是否需要重新获取。

或者将每次生成JWT令牌时的密钥粒度缩小到用户级别(一个用户一个密钥),用户修改密码也就是修改密钥,也可以把用户密码作为JWT的密钥。

PS:

小傅哥