目前大多数web应用的用户认证机制都是基于session的。用户认证成功后,在服务端生成用户相关的数据保存在session中(当前会话),而发给客户端的sesssion_id 存放到 cookie 中,这样用客户端请求时带上 session_id 就可以验证服务器端是否存在 session 数据,以此完成用户的合法校验。当用户登出或过期时把服务端session销毁,客户端的session_id也就无效了。
而在分布式的环境下,基于session的认证会出现一个问题。当我们第一次访问网站的时候,负载均衡将本地的请求分配到Web服务器A,那么session创建在Web服务器A,第二次访问的时候如果我们不做处理就不能保证还是会落到Web服务器A了。
这个时候,通常的做法有下面几种:
Session复制:多台应用服务器之间同步session,使session保持一致,对外透明。
Session粘滞:当用户访问集群中某台服务器后,强制指定后续所有请求均落到此机器上。
Session数据集中存储:将Session存入分布式缓存集群中,所有服务器应用实例统一从分布式缓存集群中存取Session。
总体来讲,基于session认证的认证方式,可以更好的在服务端对会话进行控制,且安全性较高。但是,session机制方式基于cookie,在移动应用上无法有效使用,并且无法跨域,保持住会话的做法非常麻烦。