cookie和session
之前面试的时候被问过许多次cookie和session的区别?那个时候我只知道一个存储在客户端,一个存储在服务器端,一个比较不安全,一个比较安全,其它的就都不知道/(ㄒoㄒ)/~~
今天总结了一下cookie和session的一些区别,才知道原来是这么回事呀O(∩_∩)O
(1)cookie的由来?
a、HTTP是一个无状态的协议,而现在绝大部分web应用需要有一个记录状态的机制。试想,当我们登录一个购物网站的时候,如果没有这样一个记录状态的机制的话,当我们在进行一些购物等操作时,服务器那边根本不知道还是不是同一个用户在访问,因此需要一种可以记录状态的机制,所以,今天的主角cookie和session应运而生啦~
b、cookie机制的seesion机制可以解决HTTP无状态的缺点,但是两者采用的机制是不同滴~
c、cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案,但是,两者又是有关联的哟~
d、由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的
(2)cookie的工作机制:
a、服务器向客户端响应请求的时候,会在响应头中设置set-cookie的值,其值的格式通常是name = value的格式
b、浏览器将 cookie 保存下来
c、每次请求浏览器都会自动将 cookie 发向服务器
a、cookie最初是在客户端用于存储会话信息的。该标准要求服务器堆任意HTTP请求发送Set-Cookie HTTP头作为相应的一部分,其中包含会话信息(名称和值在传送时都必须是URL编码的)
如:服务器响应的头可能如下:
b、浏览器会存储这样的会话信息,即浏览器会将cookie保存下来
c、每次请求浏览器都会为每个请求添加cookie http头将信息发送回服务器
如:客户端的请求头可能如下:
(3)cookie的限制:
a、cookie在性质上是绑定在特定的域名下的。当设定了一个cookie后,再给创建它的域名发送请求时,都会包含这个cookie,这个限制确保了储存在cookie中的信息只能让批准的接受者访问,而无法被其他域访问
b、每个域的cookie总数是有限的,不过浏览器之间各有不同
(4)cookie的生成:
a、正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie
b、纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie
(5)cookie的构成:
a、名称:一个唯一确定cookie的名称,cookie的名称是不区分大小写的(需经过URL编码的)
b、值:储存在cookie中的字符串值(需经过URL编码)
c、域:cookie对哪个域是有效的,所有向该域发送的请求中都会包含这个cookie信息
d、路径:对于指定域中的那个路径,匹配该路径才会向服务器发送cookie
如:可以指定http://www.wrox.com/books/中才能访问,那么http://www.wrox.com的页面就不会发送cookie信息,即使请求都是来自同一个域的
e、失效时间:表示cookie何时应该被删除的时间戳。如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
f、安全标志:指定后,cookie只有在使用SSL链接的时间才发送到服务器,即当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
g、其它:如HttpOnly表示不允许脚本操作 document.cookie 去更改 cookie
例子:
注:域、路径、失效时间和secure标志都是服务器给浏览器的指示,一指定合适应该发送cookie。这些参数并不会作为发送到服务器的cookie信息的一部分,只有名值对儿才会法搜
所有名字和值都是经过URL编码的,所以必须使用decodeURICompinent()来解码
(6)cookie的不安全性:
很显然,cookie是保存在我们的浏览器中,这意味着我们是有办法对cookie进行修改。假设有一个这样的cookie保存在浏览器中:
然后我们通过某种方法改变它,改成:
然后再次请求服务器的时候,服务器根据这个cookie判断到用户已经登录了,这是很不安全的,而这时候session就派上用场了
(7)session的机制:
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
a、当客户端第一次请求session对象时,服务器会创建一个session,并通过特殊算法算出一个session的ID,用来标识该session对象,然后将这个session序列放置到set-cookie中发送给浏览器
b、浏览器下次发请求的时候,这个sessionID会被放置在请求头中,和cookie一起发送回来
c、服务器再通过内存中保存的sessionID跟cookie中保存的sessionID进行比较,并根据ID在内存中找到之前创建的session对象,提供给请求使用,也就是服务器会通过session保存一个状态记录,浏览器会通过cookie保存状态记录,服务器通过两者的对比实现跟踪状态,这样的做,也极大的避免了cookie被篡改而带来的安全性问题
d、由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面
注:session的实现也是必须依赖于浏览器中的cookie的,保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID
(8)session的一些基本问题:
a、session存放在服务器端的内存中
b、session是一个容器,可以存放会话过程中的任何对象
c、session因为请求(request对象)而产生,同一个会话中多个request共享了一session对象,可以直接从请求中获取到session对象
d、不是浏览器关闭了,session就消失了。除非程序通知服务器删除一个session,否则服务器会一直保留。之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session
(9)cookie和session的区别:
共同点:都是为了解决http无状态的特点而提出来的,cookie和session都是用来跟踪浏览器用户身份的会话方式
不同点:
a、机制不同:cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
b、存储的地方不同:cookie用于交互时存放在客户端,分为会话cookie和存放在硬盘的cookie,而session是交互时存放在服务端,一般存放在服务器的内存中
c、安全性不同:session比cookie安全
如果web服务器端使用的是session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造,除非能够获取某个登录用户的 sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的
如果浏览器使用的是cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发送给服务器,这些变量有一定的特殊标记。cookie一般很容易被别人篡改或者伪造,所以,使用 cookie被攻击的可能性比较大
d、限制不同:
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用cookie
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K
e、将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
参考网站:http://justsee.iteye.com/blog/1570652