客户常问一个问题:为什么业务员用手机打开管理后台,放一会儿再点就要求重新登录?这是登录态管理没设计好。Session和JWT怎么选,是后端系统开发绕不开的一课,选错了,轻则天天掉线惹人烦,重则账号被盗踢不掉。
Session:状态握在自己手里
传统方案是Session:用户登录后,服务器存一份登录状态,浏览器拿着钥匙来对。好处很实在——想踢人就能踢,员工离职了管理员一键让他下线;改了权限,下一次请求立即生效。坏处是状态占服务器内存,多台服务器部署时还得配共享存储,多了一层运维。内部管理后台、用户量几万的系统,Session是最省心的选择,两三行配置的事。
JWT:把凭证发给用户保管
- 令牌自带用户信息,服务器不存状态,多台服务器、多个端都能认,扩展方便;
- 小程序、APP、网站共用一套接口时,JWT适配起来更顺;
- 代价是签发出去就收不回:令牌没过期之前,即使用户被禁用,他手里的令牌依然有效,这是JWT最大的软肋。
所以用JWT要配套两条规矩:有效期设短,两小时以内是常见做法;配一个刷新机制,令牌快过期时用长期凭证换新的,用户无感知,安全性却不打折。真要紧急封号,再配合一张黑名单表兜底。
两种方案没有绝对胜负,看业务形态定。单一管理后台,Session简单可靠,掉线投诉都少;多端共用接口、服务器要横向扩容的,JWT更合适。我们见过有的项目两头都用:管理后台走Session,对外API走JWT,各取所长,也不冲突。
不管选哪种都要守的底线
传输必须全程HTTPS,不然令牌在路上就是裸奔;登录接口加失败次数限制,连错五次锁定半小时,挡住撞库的脚本;记住登录的设备管理做上,让用户能看到自己在哪些设备登录过、能主动踢下线。这几条成本低,却挡掉了绝大多数账号安全问题。
掉线问题还有个常见的锅要甩:有的系统把有效期配得极短,美其名曰安全,业务员填半小时表单被踢三次,怨声载道。安全和体验不是单选题,把有效期设到合理区间,配上刷新机制,两头都能顾住,业务员的抱怨自然就停了。后端系统开发里这类参数不该拍脑袋,跟着业务的真实使用节奏定才靠谱。
两条建议:立项时把登录有效期、多端登录策略写进需求,别等上线了再吵;如果业务对账号安全敏感,验收时让开发方演示一次踢人下线和权限变更生效的过程。比格网络做系统时这两项都是标准演示项,登录态管得好不好,用户天天都能感觉到。