什么是Cookie and Session
简单来说Cookie就是在客户端记录信息确定用户身份,而Session是在服务器端记录信息确定用户身份。
Cookie
Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。具体来说就是当用户使用浏览器访问一个支持Cookie的网站的时候,用户将个人信息提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header),当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。当客户端再向服务器发送请求的时候,Cookie信息则存放在HTTP请求头(Request Header)再次发回至服务器。有了Cookie机制,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。通常,我们可以从很多网站的登录界面中看到“请记住我”这样的选项,如果你勾选了它之后再登录,那么在下一次访问该网站的时候就不需要进行重复而繁琐的登录动作了,而这个功能就是通过Cookie实现的。
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
HTTP协议是无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了,而Cookie就使这样的问题得到解决,它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
在http头部有两个是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中如果包含Set-Cookie这个头部时,意思就是指示客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期。如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另外一种情况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。一般cookie的设置以及发送过程分为以下四步:
1、客户端发送一个http请求到服务器端
2、服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
3、客户端发送一个http请求到服务器端,其中包含Cookie头部
4、服务器端发送一个http响应到客户端
Session
Session是另一种记录用户状态的方法,不同的是Cookie保存在端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。端浏览器再次访问时只需要从该Session中查找该用户的状态就可以了。
如果说Cookie是通过检查用户身上的“通行证”来确定用户身份的话,那么Session机制就是通过检查服务器上的“用户明细表”来确认用户身份。Session相当于程序在服务器上建立的一份用户档案,用户来访的时候只需要查询用户档案表就可以了。
Cookie and Session区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上;
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session;
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用cookie;
4、单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的cookie不能超过4K
Cookie与Session问答
Cookie运行在客户端,Session运行在服务端,对吗?A:不完全正确。Cookie是运行在客户端,有客户端进行管理;Session虽然是运行在服务器端,但是sessionID作为一个Cookie是存储在客户端的。
浏览器关闭后,Cookie和Session都消失了,对吗?A:错。存储在内存中额Cookie确实会随着浏览器的关闭而消失,但存储在硬盘上的不会。Session在浏览器关闭后也不会消失,除非正常退出,代码中使用了显示的unset删除Session,否则Session可能被回收,也有可能永远残留在系统中。
Session 比 Cookie 更安全吗? 不应该大量使用Cookie吗?A:错误。Cookie确实可能存在一些不安全因素,但和JavaScript一样,即使突破前端验证,还有后端保障安全。一切都还要看设计,尤其是涉及提权的时候,特别需要注意。通常情况下,Cookie和Session是绑定的,获得Cookie就相当于获得了Session,客户端把劫持的Cookie原封不动地传给服务器,服务器收到后,原封不动地验证Session,若Session存在,就实现了Cookie和Session的绑定过程。因此,不存在Session比Cookie更安全这种说法。如果说不安全,也是由于代码不安全,错误地把用作身份验证的Cookie作为权限验证来使用。
Session是创建在服务器上的,应该少用Session而多用Cookie,对吗?A:错。Cookie可以提高用户体验,但会加大网络之间的数据传输量。
如果把别人机器上的Cookie文件复制到我的电脑上(假设使用相同的浏览器),是不是能够登录别人的帐号呢?如何防范?A:是的。这属于Cookie劫持的一种做法。要避免这种情况,需要在Cookie中针对IP等加上特殊的校验信息,然后和服务器端进行比对。
在IE浏览器下登录某网站,换成Firefox浏览器是否仍然是未登录状态?A:不同浏览器使用不同的Cookie管理机制,无法实现公用Cookie。