为什么引入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。
-
A在用华为登录时,系统将数据库中当前用户的所有有效session设置为无效。
-
系统通过websocket通知小米设备,让其强制下线,并断开其连接。
-
小米设备如果接收到强制下线消息,则退出登录。如果没有收到,因为websocket断开,会尝试重连,这时后端会判断其token对应的session是否有效,如果无效,则通知其重新登录。
-
系统为华为设备创建一个新的session,并将这个新创建的sessionId存入token返回给客户端。
-
华为设备带着token跟后端建立websocket连接
1753

被折叠的 条评论
为什么被折叠?



