Fork me on GitHub

Cookie与Session的区别与应用

  • 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等服务端进行数据交互
  • Cookie和Session都是用来跟踪浏览器用户身份会话方式

Cookie的概念

  • Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户实现用户自定义功能
  • Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的。
  • Cookie的Expires属性标识了Cookie的有效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。
    • 如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种Cookie被称为会话Cookie会话Cookie一般不保存在硬盘上而是保存在内存里
    • 如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie依然有效直到超过设定的过期时间
  • 存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。
  • 对于保存在内存的Cookie,不同的浏览器有不同的处理方式。

Session的概念

  • Session存放在服务器端、用来存放用户数据的(类似于HashTable结构)。
  • 当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器
  • 当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable
  • 一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable
    • 在销毁之前,程序员可以将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。
    • 也有使用数据库将这个HashTable序列化后保存起来的,这样的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。
    • 一般还是采取前一种方式,以减轻服务器压力。

Cookie和Session的区别

  1. 保持状态
    • Cookie保存在浏览器端,服务端可以知道其中的信息。
    • Session保存在服务器端,客户端不知道其中的信息。
  2. 使用方式
    • Cookie机制
      • 如果不在浏览器中设置过期时间,Cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种Cookie简称会话Cookie
      • 如果在浏览器中设置了Cookie的过期时间,Cookie被保存在硬盘中,关闭浏览器后,Cookie数据仍然存在,直到过期时间结束才消失
      • Cookie是服务器发给客户端的特殊信息,Cookie是以文本的方式保存在客户端,每次请求时都带上它。
    • Session机制
      • 当服务器收到请求需要创建Session对象时,首先会检查客户端请求中是否包含sessionid
        • 如果有sessionid,服务器将根据该id返回对应Session对象
        • 如果客户端请求中没有sessionid,服务器会创建新的Session对象,并把sessionid在本次响应中返回给客户端
      • 通常使用Cookie方式存储sessionid客户端,在交互中浏览器按照规则将sessionid发送给服务器。
      • 如果用户禁用Cookie,则要使用URL重写,可以通过response.encodeURL(url) 进行实现。API对encodeURL的解释为:
        • 当浏览器支持Cookie时,url不做任何处理。
        • 当浏览器不支持Cookie的时候,将会重写url将SessionID拼接到访问地址后。
  3. 存储内容
    • Cookie只能保存字符串类型,以文本的方式。
    • Session中保存的是对象(通过与Hashtable类似的数据结构来保存),能支持任何类型的对象(Session中可含有多个对象)。
  4. 存储的大小
    • Cookie:单个Cookie保存的数据不能超过4kb.
    • Session大小没有限制。
  5. 安全性
    • 针对Cookie所存在的攻击:Cookie欺骗,Cookie截获。
    • Session的安全性大于Cookie。原因如下:
      (1)sessionID存储在Cookie中,若要攻破Session首先要攻破Cookie;
      (2)sessionID是要有人登录,或者启动session_start才会有,所以攻破Cookie也不一定能得到sessionID
      (3)第二次启动session_start后,前一次的sessionID就失效了,Session过期后,sessionID也随之失效。
      (4)sessionID是加密的。
      (5)综上所述,攻击者必须在短时间内攻破加密的sessionID,这很难。
  6. 路径区分
    • Session不能区分路径,同一个用户在访问一个网站期间,所有的Session在任何一个地方都可以访问到。
    • Cookie中如果设置了路径参数,那么同一个网站中不同路径下的Cookie互相是访问不到的。
  7. 应用场景
    • Cookie
      (1)判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除Cookie,则每次登录必须重新填写登录的相关信息。
      (2)保存上次登录的时间等信息。
      (3)保存上次查看的页面。
      (4)浏览计数。
    • Session:Session用于保存每个用户的专用信息,变量的值保存在服务器端,通过SessionID来区分不同的客户。
      (1)网上商城中的购物车。
      (2)保存用户登录信息。
      (3)将某些数据放入session中,供同一用户的不同页面使用。
      (4)防止用户非法登录。
  8. 缺点
    • Cookie
      (1)大小受限。
      (2)用户可以操作(禁用)Cookie,使功能受限。
      (3)安全性较低。
      (4)有些状态不可能保存在客户端。
      (5)每次访问都要传送Cookie给服务器,浪费带宽。
      (6)Cookie数据有路径(path)的概念,可以限制Cookie只属于某个路径下。
    • Session
      (1)Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内存压力会比较大。
      (2)依赖于Cookie(sessionID保存在Cookie),如果禁用Cookie,则要使用URL重写,不安全。
      (3)创建Session变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,过度使用Session变量将会导致代码不可读而且不好维护。

Session和Cookie的应用

利用Cookie实现自动登录
  • 当用户在某个网站注册后,就会收到一个惟一用户ID的Cookie。
  • 客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。
实现跨窗口的会话跟踪
  • 通常session、cookie是不能跨窗口使用的,当我们新开了一个浏览器窗口进入相同页面时,系统会赋予我们一个新的sessionid,这样我们就达不到信息共享的目的
  • 解决方案:我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID,这样通过session cookie和persistent cookie的结合就能实现跨窗口的会话跟踪(session tracking)。
------ 本文结束 ------