Session和Cookie的区别

less than 1 minute read

很多HTTP协议的初学者对Session和Cookie都比较疑惑。本文尝试做一个简单的解释和区分。

从功能上,Session和Cookie都是用来临时存储来访者信息的,为什么要存储来访者的信息?主要是用于下次访问的时候可以记住来访者之前的操作。HTTP协议是一个无状态的协议,何为无状态,说白了就是两次通过HTTP协议进行的访问之间,没有状态记忆。比如,用户通过用户名和密码登录了一个网站,第一次的HTTP请求就是验证用户名和密码,用户名和密码验证成功了。后面,来自该用户的HTTP请求都应该被当成已经是登录状态来进行处理,但是,HTTP协议是一个无状态协议,仅仅凭借HTTP协议的内容,网站无法知道来自该用户的后一次访问之前已经做了用户名和密码的登录,并且已经成功验证,登录成功了。

这个时候,就用到了Session和Cookie。

先说Cookie的方案,当用户通过一次用户名、密码验证登录成功后,网站会返回给客户端,即浏览器,一个Cookie信息,里面有一个标志用户已经登录的特殊的值,比如:”login=Yes;UserID=123456;”,浏览器会将这个Cookie信息保存在用户的本地某个磁盘位置。当用户第二次访问网站的时候,浏览器会带着这个“标志用户已经登录的特殊的值”,比如之前保存的字符串:”login=Yes;UserID=123456;”,通过HTTP报文头的Cookie域,上送到网站的服务端,此时,服务端检查到上送的报文头中的Cookie域中包含了这个“标志用户已经登录的特殊的值”,就知道,这个用户是已经登录过的用户,这样,就相当于在第二次访问的时候,知道了用户的当前状态。这样Cookie在这里就完成了用来临时存储来访者信息的一个功能。通过这种临时存储来访者信息的功能,完成了两次HTTP请求之间的状态转移。

这里我们很容易想到一个问题,cookie是保存在用户本地的,信息的安全性很难保证,更不用说还可能存在假冒请求的情况出现。

再说Session的方案,当用户通过一次用户名、密码验证登录成功后,网站会返回给客户端浏览器一个SessionID信息,一般是一个长长的字符串,比如:”sessionid=2sfs3221fe34324jk3243232k4j3”。当用户第二次访问网站的时候,浏览器会带着这个“SessionID”信息上送请求到网站的服务端,此时,服务端检查到上送的报文中有这个“SessionID”信息,就通过这个“SessionID”信息到自己内存中的Session存储的位置中查找是否存在这样一个信息,如果存在这样的“SessionID”信息,就会通过这个“SessionID”信息进而找到其他的会话信息比如:UserID=123456 等,这样就会判断出这个用户是一个已经登录过的用户,这样,就相当于在第二次访问的时候,知道了用户的当前状态。而Session在这里就完成了用来临时存储来访者信息的功能,而“SessionID”信息就相当于存储在服务端内存中的用户信息的一个索引号。

通过上面的关于Cookie和Session的描述,可以看出:

  • Session和Cookie都可以实现临时存储用户信息的功能,存储的目的是为了实现两个HTTP请求之间的数据共享
  • Cookie将数据保存在用户端,通过第二次将保存的数据直接上送来实现两个HTTP请求之间数据的共享;Session将数据保存在服务端,而通过一个Sessionid作为索引,并将该索引传递给用户端来,通过第二次上送这个索引来实现数据在两个HTTP请求之间的共享。
  • 由于Cookie存储在客户端,数据的安全性不如Session高
  • 由于Cookie存储在客户端,每次上送都要将所有需要在两次HTTP请求之间共享的数据全部上送,所以,当交易量较大的时候,会比较占用网络带宽
  • 由于Session存储在服务端,并且一般在内存中,当用户在线数量较大的时候,会占用比较多的内存空间,对服务端的内存要求比较高。

Updated: