有状态的:比如session,cookie,spring项目都用spring session实现redis存储session,或者用nginx + redis+tomcat实现负载均衡,使用ip_hash策略,能将来自同一IP的客户端请求派发给同一个服务实例,在分布式环境中,可以解决session不共享的问题。不要使用轮询策略。
无状态的:比如JWT(JSON Web Token),是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519),是无状态的两种鉴权方式,组合产品包含shiro jwt和jwt spring security,因为shiro好像一直对restful不友好。
JWT的缺陷
JWT使用起来虽然简单方便,但它存在一个设计缺陷,即服务端无法主动注销token,所以jwt在安全性上不及session,实际开发中应谨慎使用。
如果要让服务端能够注销token,就要在服务端维持token状态,这又回到session机制了,所以在经常需要验证的场景中,建议还是使用session。
JWT这个缺陷决定了它更适合用在一次性token验证场景中,即token只使用一次就立即废弃掉,比如第三方登录授权。