之前面试Java的时候被问到cookie和session的区别,索性今日上网找点资料记录一下;
1. 定义
注:翻译自英文wikipedia
cookie:cookie是发送自用户所浏览的网站并存储在用户浏览器中的一小段数据。用户每一次浏览该网站的时候,浏览器都会把cookie发送给服务器,以通知网站该用户的之前活动。cookies被设计成一个可靠的机制,以让网站记住一些状态信息(比如购物车中的数据)或记录用户的浏览活动(包括点击特定的buttons,登陆,或者记录用户数月前或者uunmq访问过哪些网页等)
session:在计算机科学,特别是网络中,一个session是一个半永久性的交互式信息交换,也被称作多个通信设备或者计算机和用户之间的对话、会话或会议(a dialogue, a converstaion or a meeting)。一个session在特定时间建立,然后在之后的某个时间被拆除。session一般(并不总是)有状态的(stateful),也就是说至少需要有一个通信块(communicating parts)来存储session历史信息。这点与无状态的通信不同,无状态的通信由独立的requests和response组成;
2. cookie
cookie分为两种:
- 以文件方式存在硬盘空间上的长期性的cookie;
- 停留在浏览器所占内存中的临时性的cookie;
浏览网站时,在网站登陆的地方,会有提示,询问是否记住自己的登陆状态,此时,登录时填写的一些信息会被以文件的方式存储在客户端的硬盘上;
当用户登陆后,session会在cookie端产生一个session_id,这个session_id是存于浏览器所占用的内存当中,因此,当关闭浏览器后,session_id就消失了。
cookie采用的是在客户端保持状态的方案,它是客户端的会话状态的一种存储机制。它是服务器在本地机器上存储的小段文本或者内存中的一段数据,并随每一个请求发送至同一个服务器。服务器用HTTP头信息向客户端发送cookie,在客户端,浏览器解析这些cookies并将他们保存为一个本地文件,或者本地内存在数据,他们会自动将同一服务器的任何请求附上这些cookies,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制借助于cookie机制来达到保存标识的目的,这样就解决了http协议无状态的缺陷。
3. session
session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上,这种情况是默认的,也可以用memcache把这种数据放到内存里面。
当客户端向服务器发送请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没
有session_id,是否已经过期。如果有这样的session_id的话,服务器端会根据cookie里面的session_id把服务器的session检索出来。如果没有这样的session_id的话,服务器端会重新建立一个。
session产生的session_id放在cookie里面,如果用户把cookie禁止掉,session仍然可以用,不过通过其他的方式来获得这个session_id,比如可以在url后面或者以表单的形式提交到服务器端。
4. cookie和session的安全性
一般来说,cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,而session是存放在服务器端的,要想攻破session的话,首先要攻破cookie取得其中的session_id;而session_id是要有人登陆,或者启动session_start才会有,你不知道什么时候会有人登陆。其次,session_id是加密的,第二次session_start的时候,前一次的session_id就没有了,sessioin过期时session_id也会失效,想在短时间内攻破加密的session_id比较困难。
5. 其他区别
- 如果考虑安全性,应当使用session;
- session会在一段时间内保存在服务器上。当访问增多,会比较占用服务器的性能,因此如果考虑到减轻服务器性能,应该使用cookie;
- 单个cookie保存的数据不能超过4K;