首页 > 其他分享 >cookie和session的区别?一文讲透

cookie和session的区别?一文讲透

时间:2023-11-28 13:44:23浏览次数:32  
标签:缓存 用户 sessionId session cookie 服务器 讲透

一、问题

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去访问,服务器也能识别到用户身份。

标签:缓存,用户,sessionId,session,cookie,服务器,讲透
From: https://www.cnblogs.com/miaomiaokaixin/p/17861774.html

相关文章

  • 看完就会!一篇讲透关于企业帮助中心!
    引言:在现代商业环境中,企业帮助中心成为了为用户提供支持和解决问题的重要渠道。一个高效的企业帮助中心可以极大地提升用户满意度,增强品牌形象,并减轻客服团队的工作压力。本文将探讨企业帮助中心的重要性,以及建立和优化帮助中心的关键步骤,帮助企业为用户提供卓越的支持体验。第一部......
  • keycloak~关于session idle和session max的解释
    keycloak可以帮助我们实现这个功能:用户token每5分钟失效一次,失效后通过refresh_token来换新的token,而refresh_token每30天失效一次,但如果用户3天都没有任何操作(就是没有用refresh_token去换新的token),那么3天后也让refresh_token失效,用户需要从新去登录。先说refresh_token过期时......
  • Flask Session 登录认证模块
    Flask框架提供了强大的Session模块组件,为Web应用实现用户注册与登录系统提供了方便的机制。结合Flask-WTF表单组件,我们能够轻松地设计出用户友好且具备美观界面的注册和登录页面,使这一功能能够直接应用到我们的项目中。本文将深入探讨如何通过Flask和Flask-WTF构建一个......
  • uniapp 封装一个类似js-cookie可时效性存储token的方法
    贴代码cache.js/***存储数据*key:缓存的键名,必填*value:缓存的值,选填*seconds:缓存的过期时间,选填,单位为秒,默认为28天*/functionset(key,value,seconds){if(!key){//如果key为空,直接返回console.log("key不能空");return;}const......
  • Cookie session
    今日概要【零】发展史一开始:只有一个页面,没有登录功能,大家看到东西都一样新闻时代发展,出现了需要登录注册的网站,要有一门技术存储我们的登录信息京东、天猫cookie存储形式:k:v键值对存储位置:客户端不安全,信息可能会泄露时代发展,需要有一门新的安全的技术sess......
  • postman 出现Enable JavaScript and cookies to continue 如何反爬(js反爬)
    网页无法F12,禁止调试出现debug怎么办直接F8禁用,ctrl+F8开启调试断点网站禁止ip访问,并且关闭了icmp回包,调试最好禁用缓存,以便实时更新用postman单独访问首页的index的首页也是无法获取网页内容考虑网页使用js进行跳转实例:比如使用postman请求https://www.phind.com/简......
  • 【转载】Laravel10.x Session 储存到 Redis
    参考https://learnku.com/docs/laravel/10.x/session/14855#configurationhttps://blog.csdn.net/wen_3370/article/details/88072364注意经过测试Cache的内容默认存储到DB1经过测试Session配置为储存到Redis则默认存储到DB0环境软件/系统版本说明wi......
  • 微信小程序 在session失效时,自动重新登录
    调试程序的时候经常会碰到很长时间不去碰手机,这样小程序session失效了,但是数据还是存在。去检测一下是否失效,来决定是否需要重新登录:onCheckSessionValid(){setInterval(function(){wx.checkSession({success:function(){//session_key......
  • 请求扩展、蓝图、flask-session、数据库连接池、wtforms、flask-script、信号、flask-
    请求扩展#1before_request:请求来了会走,依次从上往下执行,但是如果其中一个返回了响应对象,后续的就不走了,视图函数也不走而来#2after_arequest:请求走了,会从下往上依次执行,它必须返回响应对象假设:写了3个before_request第二个返回了响应对象写了3个af......
  • Nginx实现Cookie的访问控制配置
    通过基于Cookie的访问控制配置,可以限制用户访问特定的页面或资源。本文将介绍如何使用Nginx来实现这样的访问控制,并给出具体的代码示例。开启Nginx的http_auth_request模块首先,需要确保Nginx已经启用了http_auth_request模块。如果没有启用,可以通过编辑Nginx配置文件添加该模块。......