用Session解决token有效时间短,降低token被劫持风险,确保单一设备登录

为什么引入Session

如果项目中仅使用token来检验身份,想要维持用户长时间不需要登录,那么就需要提高token的有效时间。但是token会存在被劫持的风险,如果token被劫持,那么坏人就可以拿着这个token长时间为所欲为。

为了解决这个问题,我们必须要限制token的有限时间,让其较短,即使token被劫持了,坏人也无法长时间为所欲为。但是如果token的有效时间较短,那么用户就需要频繁登录,用户体验会很差。这时候就要在服务端维持用户的登录状态,也就是Session。当用户登录成功后,服务端会创建一个Session对象,并将用户的身份信息存储在Session中,然后将一个唯一的标识符(sessionId)存入token返回给客户端。当token过期后,客户端主动发起刷新token的请求,服务端通过sessionId找到对应的Session对象,验证用户身份后重新生成token返回给客户端。

当Session过期后,用户才需要重新登录。token可以设置较短的有效时间,但是Session可以设置较长的过期时间。这样就可以解决频繁登录的问题,同时又能保证安全性。

如何进一步降低token劫持后的风险

session中记录用户的设备信息,并且存储在token中,在鉴权中间件这里加一层设备校验,如果设备信息不匹配,则不允许访问。

如何确保只有一台设备能够在线,并且后来的设备登录会将之前的踢下线

想复用此方案的前提是,项目中需要前端在登录后就要于后端维持websocket连接。
场景:用户A在小米设备登录了账号x,然后在用华为设备登录了账号x。

  1. A在用华为登录时,系统将数据库中当前用户的所有有效session设置为无效。

  2. 系统通过websocket通知小米设备,让其强制下线,并断开其连接。

  3. 小米设备如果接收到强制下线消息,则退出登录。如果没有收到,因为websocket断开,会尝试重连,这时后端会判断其token对应的session是否有效,如果无效,则通知其重新登录。

  4. 系统为华为设备创建一个新的session,并将这个新创建的sessionId存入token返回给客户端。

  5. 华为设备带着token跟后端建立websocket连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值