Cookie & Session
Cookie & Session
Cookie和Session都是用来在浏览器中跟踪用户身份的会话方式,因为B to S的请求访问都是HTTP请求,而HTTP请求是无状态的,服务器端无法辨识请求是来自哪个客户端。
Cookie
Cookie是一段保存在客户端的字符串,能够用来将用户活动过程中的状态信息保存到客户端,服务器可以获得该信息以便进行处理,跟踪用户的状态,一般一个 cookie存储的数据不超过3K。
Cookie的工作原理:
- 浏览器第一次发送请求到浏览器端;
- 服务器端创建一个字符串Cookie,该Cookie中包含用户的信息,然后将该Cookie返回给浏览器端;
- 浏览器端再次访问服务器端时会在请求头中携带从服务器端获取的Cookie字符串;
- 服务器端通过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的工作原理
- 浏览器端第一次发送请求到服务器端,服务器端创建一个Session对象,同时会创建一个特殊的Cookie(是随机生成的一个标识Session对象的一个SessionId字符串),然后将该Cookie发送至浏览器端;
- 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端的时候会在请求头中携带Cookie对象;
- 服务器端会根据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生成的时候设置进去。
Cookie vs. Session
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不支持跨域访问。
参考文档:


