Session与Cookie可以说是面试中被问频率最高的两兄弟了,我是谁?我在哪?我在干什么?让我们带着这三个疑问去学习一下这两兄弟。
Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。使用Cookie传递信息,随着Cookie数的增加占用的网络带宽增大;所以大访问量时需要使用Session,但是Session存在本地,又不容易在多个服务器共享。哎~该怎么权衡呢,接着往下看。
理解Cookie
用户通过HTTP访问服务器时,服务器将一些Key/Value对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整的带给服务器。
Cookie的版本
当前有两个版本:Version 0和Version 1;
Cookie如何工作
我们请求某个URL路径时,浏览器会根据这个URL将符合条件的Cookie放入Request请求头中传回给服务端,服务端通过request.getCookie()来取得所有Cookie。
使用Cookie的限制
理解Session
每次客户端的访问都会传回Cookie,如果Cookie很多会增加数据传输量。Session的出现解决了这个问题,不需要传输Cookie值,只需要传输Cookie的值ID,ID就是NANE为JSESIONID的一个Cookie。
Session的工作
第一次触发通过request.getSession()方法,当前Session ID没有对应的HTTPSession对象,创建一个新的,并加入到org.apache.catlina.Manager的session容器中保存。Manager类管理所有Session的生命周期,Session过期将被回收,服务器关闭,Session被序列化到磁盘。只要HTTPSession对象存在,用户可根据Session ID获取对象。
安全性
Cookie通过把所有要保存的数据通过HTTP的头部从客户端传递给服务端,又从服务端再传回给客户端,所有数据存在客户端的浏览器里,这些Cookie可以被查看和修改,所以安全性是很大的隐患;
Session是将数据保存在服务端,只通过Cookie传递一个SessionID,所以Session更是存储用户隐私和重要的数据。
分布式Session框架
Cookie存在的问题
- 客户端Cookie存储限制;Cookie增加超过浏览器存储的限制会丢弃Cookie
- Cookie的管理混乱。
- Cookie的安全性问题令人担忧
分布式Session框架的出现
Cookie和Session都有各自的优点,结合提出分布式Session框架的概念。分布式框架有哪些优点:
- Session配置的统一管理
- Cookie使用的监控和统一规范管理
- Session存储的多元化
- Session配置的动态修改
- Session加密Key的定期修改
- 充分的容灾机制,保持框架的使用稳定性
- Session各种存储的监控和报警支持
- Session框架的可扩展性,兼容更多的Session机制
实现的思路
统一通过订阅服务器推送配置可以有效地集中管理资源,所以可以省去每个应用都来配置Cookie,简化Cookie的管理。订阅服务器现在有很多开源的配置服务器,如Zookeeper集群管理服务器,可以统一管理所有服务器的配置文件。
将Session都保存在服务器内存中会造成内存压力过大,以及Session无法同步到应用所有服务器。解决方法是存储在一个分布式缓存中,可以随时的写入和读取,而且性能要很好才能满足,目前有MemCache或者淘宝的开源式分布式缓存系统Tair。
如何跨域名跳转
Cookie有域名限制,在一个域名下不能被另一域名访问,如何解决?
Cookie的压缩
压缩方式是将Cookie的多个k/v对看成普通文本,做文本压缩。将压缩后的结果再进行转码,可以进行Base32和Base64编码。2KB大小的Cookie压缩前与压缩后的字节数相差20%左右。
多终端登录
手机扫码前必须是已经登录的状态,同时扫码的二维码带有一个特定的标识,标识客户端通过手机端登录了。