Cookie & Session

Cookie和Session都是用来在浏览器中跟踪用户身份的会话方式,因为B to S的请求访问都是HTTP请求,而HTTP请求是无状态的,服务器端无法辨识请求是来自哪个客户端。

Cookie是一段保存在客户端的字符串,能够用来将用户活动过程中的状态信息保存到客户端,服务器可以获得该信息以便进行处理,跟踪用户的状态,一般一个 cookie存储的数据不超过3K。

Cookie的工作原理:

  1. 浏览器第一次发送请求到浏览器端;
  2. 服务器端创建一个字符串Cookie,该Cookie中包含用户的信息,然后将该Cookie返回给浏览器端;
  3. 浏览器端再次访问服务器端时会在请求头中携带从服务器端获取的Cookie字符串;
  4. 服务器端通过Cookie中携带的数据便可以区分不同的用户;

访问百度网站中浏览器中的Cookie示例:

1
Cookie:BIDUPSID=7CA7EB951E290B33CA40110D9ED9C0D1; PSTM=1587792871; BD_UPN=123253;__yjs_duid=1_9d2ad8f9e190a6d780bbc7d44cd4d11c1620624931104; BAIDUID=BE455C05128F1594C731E5B0B822F103:SL=0:NR=10:FG=1;...

PS:字符串很长,后面的省略了。

Session

Session是存储在服务器(应用服务器)上的对象,该对象由服务器创建并维护,Session存储的数据大小没有限制,服务器会为客户端与服务器的每一次会话过程都创建并维护一个Session对象。

Session的工作原理

  1. 浏览器端第一次发送请求到服务器端,服务器端创建一个Session对象,同时会创建一个特殊的Cookie(是随机生成的一个标识Session对象的一个SessionId字符串),然后将该Cookie发送至浏览器端;
  2. 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端的时候会在请求头中携带Cookie对象;
  3. 服务器端会根据Cookie的值去查询Session对象,从而区分不同的用户;

简单的说,当你登陆一个网站的时候,如果web服务器端使用的是Session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话Sessionid(以Cookie的方式,Sessionid是服务器和客户端连接时候随机分配的),服务器根据当前Sessionid判断相应的用户数据标志,以确定用户是否登陆或具有某种权限。由于数据是存储在服务器上面,所以客户端是无法伪造的。

如果浏览器使用的是Cookie,那么用户的所有数据都保存在浏览器端,比如:登陆以后,服务器设置了Cookie用户名,那么当再次请求服务器的时候,浏览器会将用户名一起发送给服务器,服务器会解析Cookie变量,所以只要不关闭浏览器,那么Cookie变量一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的Cookie变量,然后伪造一个数据包发送过去,那么服务器会认为你是合法的。所以,使用Cookie被攻击的可能性比较大。

如果Cookie设置了有效期,那么Cookie会保存到客户端的硬盘上,下次在访问网站的时候,浏览器先检查有没有Cookie,如果有的话,读取Cookie并发送给服务器。所以,如果你在个人PC上面保存了某个论坛Cookie,有效期是一年,如果有人入侵你的PC,将Cookie拷走,放在他的机器下面,那么他登陆该网站的时候就是用你的身份登陆的。当然,伪造的时候需要注意,直接Copy Cookie文件到 Cookie目录,浏览器是不认的,它有一个index.dat 文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 Cookie文件,并且要从保证时间上骗过浏览器。

两个都可以用来存用户数据,Session过期与否,取决于服务器的设定。Cookie过期与否,可以在Cookie生成的时候设置进去。

1、目标对象不同

Cookie:是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次访问相应网站,浏览器都会查找该网站的 Cookies,如果有,则会将该文件发送出去。Cookies文件的内容大致上包括了诸如:用户名、密码、设置等信息。

Session:是针对每个用户的,只有客户端才能访问,程序为该客户添加一个 Session。Session中主要保存用户的登录信息、操作信息等等。此 Session将在用户访问结束后自动消失。

2、存储数据大小不同

Cookie:一个 Cookie存储的数据不超过3K。

Session:Session存储在服务器上可以任意存储数据,当 Session存储数据太多时,服务器可选择进行清理。

3、生命周期不同

Cookie:Cookie的生命周期当浏览器关闭的时候就消亡了,Cookie的生命周期是累计的,从创建时就开始计时,默认30min后Cookie生命周期结束,当然了,用户可以自定义有效时间。

Session:Session的生命周期是间隔的,JSESSIONID的Cookie默认过期时间为-1,只需关闭浏览器当前窗口,该Session就会失效,因此Session不能长期有效。

4、存储位置不同

Cookie:Cookie数据保存在客户端,不占用服务器资源。

Session:Session数据保存在服务器端,如果数量过多很消耗大量内存空间。

5、数据类型不同

两者都是key-value结构,但针对value的类型是有差异的。

Cookie:key是固定值:”Cookie”,value只能是ASCII字符串类型。

Session:key是SessionId(名为JSESSIONID的一个Cookie),value是object类型。

6、安全性不同

Cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用Session。

7、跨域支持

Cookie支持跨域访问;Session不支持跨域访问。


参考文档:

cookie与session区别

Cookie和session的区别