cookie 和session 的区别

大部分的浏览器现在都有cookies和session的功能,每次在输入登录名和密码,或者是某种操作的时候都会有cookie提醒,所以就想看看弄清它们的作用和区别,看完以后发现Session和cookies其实是一个非常头疼的问题。

          在程序中,会话跟踪是很重要的事情。理论上,一个客户的所有请求操作都该属于同一个会话。而另一个会话的请求属于另一个会话,得单独分开,不能产生混乱。 例如我平时用的比较多的一个软件咕咚。一个人去过的餐馆,城市,工作地点就应该放在该人的行动路线中,无论他是什么时候去的,这都是一个人的行动路径,不 能说是别人的。但是web都是使用http协议来传输数据的。HTTP是无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据 需要建立新的连接,这意味着服务器无法从连接上跟踪会话。当一个人运动完以后就有他的运动路径以及数据,如果没有跟踪会话,几天以后他可能就不知道这条运 动记录到底是谁的了?要跟踪该会话就的有一个机制。

        说它简单是因为他们都是HTTP协议的一个配置项,通过扩展HTTP协议来实现的,在servlet规范中也只是对应的一个类而已。Session和 cookie的作用都是为了保持访问用户与后端服务器的交互状态。他们有各自的优点也有各自的缺点,然而具有讽刺意义的是他们的优点和他们使用的场景又都 是矛盾的。

        说它复杂主要是表现在以下两个方面:
         第一、当我们的系统大到当我们需要使用到很多cookie的时候,我们不得不考虑HTTP协议对cookie的数量和大小的限制,这是一个需要解决的瓶颈。
        例如使用cookie来传递消息的时候,随着cookie的增加和访问量的增多,占用的带宽也会增大。现在一般会限制cookie的个数为20个,其总大小小于4KB。不同的浏览器有不同规定。
         第二、当我们的应用系统有几百万太服务器的时候如何来解决session在多态服务器之间的共享问题?
         (1). 写客户端Cookie的方式(将用户登录的信息写到客户端)
         (2). 服务器之间Session数据同步的方式(将用户登陆信息写到一个服务器A中,然后启动守护进程同步到其他服务器中。缺点:速度慢;如果是单向同步,如果A服务器坏了,也会影响其他的服务器的工作状态。)
         (3). 利用NFS共享Session数据的方式(该方式与MySQL方案类似,只是存储方式不一 样。大致就是有一台公共的NFS服务器(Network File Server)做共享服务器,依耐性太强,如果NFS意外down掉了,会影响其他的服务器的工作)
         (4). 利用Mysql数据库共享Session数据的方式(依耐性太强,数据库有问题就会影响其他服务器)
         (5). 使用硬件设备(比较成熟,稳定,付费)
          cookies是一种能够让网站服务器把少量数据存储到客户端的硬盘或内存,或者从客户端的硬盘读取的技术。cookies是当你浏览某网站的时候,有 web服务器置于你硬盘上的一个非常小的文本文件,他可以记录你的ID,密码,浏览过的网页以及在网页上停留的时间,主要用来提高用户和访问速度和效率等 等。
           它主要用到了一个人生活、知识搜索储备和行为思想的局限性,和程序的访问局限性(cache的存在)、内存池(物理内存访问的局限性)类似,因为它们不 会发生大的跳转和改变,所以在一个很短的时间内,如果与用户相关的数据被频繁访问,可以针对这个数据做缓存,这样可以大大提高数据的访问性 能,cookie的作用也正是在此,由于同一个客户端发出的请求,每次发出的请求都会带有第一次访问服务器设置的信息,这样服务端就可以根据cookie 值来划分访问的用户了。
            这个作用就像您去超市购物时,第一次给您办张购物卡,这个购物卡里存放了一些您的个人信息,下次您再来这个连锁超市时,超市会识别您的购物卡,下次直接购物就好了。
           有时候我们在登录的时候选择记住密码,那么下次登录的时候就不用再输入ID和密码,可以直接登录。当然大多数的cookies文件都是经过加密处理,因 此当我么打开的时候只是一些符号,数字和字母。它是以“名/值”对(name-value pairs)的形式存储,一个“名/值”对仅仅是一条命名的数据。一个网站也只能读取它放在我们电脑里的cookies文件,不能读取其它的 cookies的文件信息。属于文办文件,不是程序。cookies的使用很普遍,许多有提供个人化服务的网站,都是利用cookies来辨认使用者,以 方便使用者量身定做的类容,像是web接口的免费email网站,都要用到cookies。会话跟踪是web程序中常用的技术,用来跟踪用户的整个会话。 cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。

              cookies机制。由于HTTP是一种无状态的协议,服务器从网络怎么怎么知道客户的身份呢?那么就给每个客户端发送以通行证,这样每个人访问的时候带 着通行证及自己的信息,服务器就能确认客户的身份了。正统的cookies分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头上加上一行 特殊的指示以提示浏览器按照指示生成相应的cookie文本文件。纯碎的Javascrip和VBscrip也可以生成cookies。而cookie的 使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所在的cookie,如果某个cookie所申明的作用范围大于等于将要请求的资源所 在的位置,则把该cookie附在请求资源的HTTP请求头上发给服务器。当然每个cookie文本文件都可以设置一个过期时间,如果没有设置时间,则表 示该cookie的生命周期为浏览器会话期间,浏览器关闭,cookie就消失,会话cookie一般不保存在硬盘而是保存在内存。如果设置了过期时间, 浏览器会把它存储在硬盘,浏览器关闭后再次打开,这些cookie任然有效直至超过有效的设定时间(那时会让你再次输入密码或登录名等信息)。

          前面介绍cookie可以使服务器跟踪每个客户端的访问,但是每次客户端都会传回这些cookie数据,如果cookie很多,这就回到了问题一,增加了 客户端和服务器之间的数据传输量。而session的出现就是为了解决这个问题。同一个客户端每次和服务端交互时,不需要每次都传回所有的cookie 值,而只是传回一个ID,这个ID是客户端第一次访问服务器生成的,而且每个客户端是唯一的,通过这个ID就可以在服务器的档案袋里查询该客户的信息记 录。这个ID通常是name为JSESIONID的一个cookie。它是基于cookie工作的。

        注:Win7系统cookie存放位置:C:Users用户名AppDataRoamingMicrosoftWindows Cookies 注意:“用户名”替换为你登录电脑的用户名,一般cookies是一个隐藏的文件夹,我们需要对其进行,相应的属性设置才能看见,打开 这个txt文件你会发现里面的全是符号字母等符号,这是因为程序对cookie文件进行了加密操作,这也是必须的,后面会讲到其实这也是cookie的一 个缺点,在此存在安全隐患。

          session机制:session是一种服务器端的机制,服务器使用一种类似于散列表的结构。用类似的结构来保存信息,相应的增加了服务器的存储压力。 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session,客户端在次访问的时候只需要在session中查找 就可以了。如果cookie机制使通过检查客户身上的“通行证”来确定客户身份的话,那么session机制就是通过检查服务器端的“客户明细”来确认身 份。session相当于程序在服务器上建立的一份客户档案(在我们注册的时候)。当程序需要为某个客户的请求创建一个session时,服务器首先检查 这个客户端的请求里是否包含了一个session标志(session ID),如果已包含则说明以前为该客户创建过session,服务器按照sessionID把这个session检索出来,使用,如果检索不到会新建一个 session并且生成一个与此session相关联的sessionID,session是一个既不会重复,又不容易找到规律易仿造的字符串,这个 session ID将被在本次响应中返回给客户端保存。保存这个sessionID的方式采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标示发送给 服务器。一般cookie的名字都类似与session ID。但是cookie可以被人为的禁止,则必须保证有其他机制使cookie禁止以后,任然能把session传递给服务器。

总结:

       Cookie 和 Session 都是为了保持用户访问的连续状态,之所以要保持这种状态,一方面是为了方便业务实现,另一方面就是简化服务端程序设计,提高访问性能,但是这也带来了另外 一些挑战,如安全问题、应用的分布式部署带来的 Session 的同步问题及跨域名 Session 的同步等一系列问题。本章简单的分析了 Cookie 和 Session 的工作原理,简单的解决了两个关键的问题。

总体区别:

(1)、cookie数据存放在客户的浏览器上,session数据放在服务器上(但是其实现也是基于cookie)。

(2)、cookie如果数量过多,会增减客户端与服务器之间的数据传输压力。(所以单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie)
(3)、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。 考虑到安全,像登录关键信息密码应当使用session。
(4)、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的存储性能,考虑到减轻服务器性能方面,应当使用COOKIE。



参考博文资料:

http://my.oschina.net/gaollg/blog/71299

http://my.oschina.net/kevinair/blog/192829

http://blog.csdn.net/fangaoxin/article/details/6952954

http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html

http://www.cnblogs.com/friendan/archive/2013/01/02/2842544.html

http://www.cnblogs.com/thinksasa/archive/2013/03/18/2966992.html

在此感谢博主的分享!

原文地址:https://www.cnblogs.com/shaohuixia/p/5477141.html