先大致的讲讲什么是cookie,什么是session,它两存在的意义是什么?
Cookie
cookie是一种非常具体的东西,它是可以永久存在浏览器里面的,是浏览器实现数据存储的一种手段。它可以存储一串字符串,比如用户信息,sessionid,购物车的商品信息对吧。它也可以由服务端生成,然后发送给浏览器,浏览器再保存这个cookie,下一次请求同一个网站时加上这个cookie发送给服务器。由于cookie是存在于客户端上的,所以浏览器加上了一些限制确保cookie不会被恶意使用,同时又不占据太多的磁盘空间,每个域的cookie数量是有限的。
Session
Session从字面上看就是会话的意思,由于以前的web基本上只是文档的浏览而已,服务器不会记录谁浏览了文档,每一次请求都是一个新的HTTP协议,每个HTTP请求都是全新的,但是随着交互式网站的发展,服务器需要知道哪些人登陆了系统,哪些人发出了请求,哪些人往自己的购物车里堆了东西,因此服务器就要给每一个发出请求的客户端做一个身份标识,于是Session就成为了这个身份标识的数据,SessionId就是每个不同的身份标识,当你第一次去请求服务器,服务器就给你创建一个属于你的Session,保存在后台,然后返回一个SessionId给你,当你以后再去请求服务器时,只要加上这个SessionId,服务器就可以去寻找对应的Session,然后就知道你是谁了。至于在客户端怎么保存这个SessionId,可以有很多方式,一般是存在了Cookie里面
其实关于服务器存储Session的手段,会涉及到更多的知识,如token和Memcached,这里不深入解释
区别
- 存储位置:cookie放在客户端,session放在服务器
- 存储容量:cookie保存数据<=4kb,一个站点最多20个cookie;session则没有上限,但出于服务器端的性能考虑,Session不要存放过多的东西,并设有Session删除机制
- 存取方式不同:Cookie中只能保管ASCll字符串,需要通过编码的方式存取Unicode字符或者二进制数据。运用Cookie难以实现存储略微复杂的信息
- 隐私策略不同:cookie对客户端上是可见的,别有用心的人可以分析本地cookie进行cookie诈骗,所以它是不安全的
- 有效期不同:Cookie可以任意设置有效期,而SessionId依赖于Cookie,当浏览器关闭则Session就会失效,Session不能长期有效,因为假如设置为无限时长,服务器存放的Session就会越来越多,容易导致内存溢出
- 跨域支持不同:cookie其实是支持跨域访问的,只要设置其domain属性,那么一切以domain属性值为后缀的域名都能访问到这个cookie;但Session不支持跨域,仅在它所在的域名有效