cookie和session的区别?一文讲透

一、问题

cookie和session的区别?

二、回答

1、总结如下

  • cookie:

- cookie存储于客户端本地,即浏览器缓存

- cookie存储着sessionId,作为后台session缓存的主键,可以快速识别用户身份,减少后台请求

- 问题:数据量较小,不适合存储大数据,如有些图片很大就支撑不了

- 问题:有些服务器禁用cookie,就无法使用cookie

- 替代方案:采用HTML5的Session Storage,支持较大的数据存储

  • session:

- session存储于服务器端,即web服务器缓存

- session存储着登录后用户的基本信息,以减轻数据库服务器的压力

- session后台有设置缓存失效时间,长时间不登录,后台会清除session缓存

- 服务器重启会导致session缓存数据丢失

- 问题:集群数据共享问题,如web1存用户基本信息,web2下单,从web2中无法获取到web1的用户信息

- 替代方案1:使用Redis替代session,实现分布式缓存

- 替代方案2:不使用缓存,将信息写在HTTP协议里,使用token

2、cookie与session交互示意图

如上图,当客户端用户在www.xxx.com网址下输入用户名密码,登录成功,服务器端会为admin这个用户创建一份session缓存空间,存储admin用户的基本用户信息,其主键为sessionId;

服务器端在响应的header中,将sessionId返回给客户端,客户端得到sessionId,会将其存储到本地磁盘中:名称sessionId,值1234,Domain为.xxx.com,还有过期时间等;

当用户继续操作如添加购物车,此时客户端检测到本地有.xxx.com域名的cookie,会自动在请求header中加上该cookie,值为sessionId=1234,发给服务端;

服务器端接收到请求,检测sessionId为1234在缓存区有该主键的session,从而知道用户身份是admin用户,返回成功。

3、cookie的问题及解决方案

(1)清理掉cookie导致重新登录的原因?

当我们将浏览器中的cookie清除掉以后,它会清掉本地存储的sessionId信息,这样再次访问该网站,请求头里没有携带sessionId,后台无法通过sessionId检测到你是谁,就会认为你是没登录过的用户,让你重新登录。

(2)cookie容量较小,现在有的图片很大,无法存储,且有的服务器禁用cookie,如何解决?

可以采用HTML5的Session Storage,以支持较大的数据存储。

4、session的问题及解决方案

(1)长时间不登录导致账号被踢掉的原因?

服务器端的sessionId缓存空间很小,大概只有4k,当大量用户登录,服务器需要为每个用户创建session缓存空间,就不够用对服务器来说有压力,为了解决这个问题就有了session缓存的失效时间,一般为30分钟。

长时间不登录,如超过30分钟,服务器端的session超过失效时间就会自动清掉,此时客户端拿着老的cookie里存的sessionId去访问服务器,服务器检测不到对应的session信息,即不认识你,就会让你重新登录。

(2)服务器重启导致session缓存数据丢失的原因?

因为session数据存在缓存里,又没有落在磁盘上,服务器重启缓存数据会丢失,session缓存数据自然也就没了,这是正常的特性,如同未保存的word文档打开后数据丢失一样。

(3)session真正的问题是:集群环境下的数据共享问题

现在很多后台服务器都是分布式集群环境,比如我有2台web服务器,web1缓存中存储了登录后的用户基本信息,web2下单,那么在web2服务器上想要获取web1缓存中的用户信息是获取不到的。

为了解决这个问题,目前有2种替代方案:

第一种是:利用redis缓存存储,也就是不把缓存缓在单个服务器上,而是缓在一个redis缓存数据库里,这样web1可以写redis,web2读redis,大家都操作一份缓存数据;

第二种是:利用token,也就是用户基本信息不放在缓存中,而是写到http协议里,这样web1登录完了以后,把用户信息放在token里返回,web2操作时带着token去访问,服务器也能识别到用户身份。

相关推荐
爱吃土豆的程序员9 天前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
阑梦清川10 天前
JavaEE进阶----SpringMVC(三)---响应的获取
java·java-ee·cookie·响应
CXDNW11 天前
【网络面试篇】其他面试题——Cookie、Session、DNS、CDN、SSL/TLS、加密概念
网络·笔记·面试·cdn·dns·cookie
桃酥40311 天前
day08|计算机网络重难点之 DNS查询过程、CDN是什么,有什么作用?、Cookie和Session是什么?有什么区别?
计算机网络·cdn·dns·cookie·session
阿华的代码王国14 天前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
初晴~21 天前
【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())
java·spring boot·后端·python·spring·cookie·session
Caleb-niu22 天前
一文读懂 HTTP Cookies
前端·http·cookie
魔道不误砍柴功1 个月前
什么是 Session?如何应用?
http·https·cookie·session
lilaihao10301 个月前
利用session机制造测试账号,无需前端也可以测试后端接口
session·身份接口测试·创建测试账号
allanGold1 个月前
【WKWebview】WKWebView Cookie 同步
cookie·wkwebview