返回顶部
首页 > 资讯 > 精选 >Session消失机制的示例分析
  • 840
分享到

Session消失机制的示例分析

2023-06-27 16:06:25 840人浏览 独家记忆
摘要

小编给大家分享一下Session消失机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以前一直以为cookie就是一直保存在客户端的会话信息,而session是保存在服务器断的会话信息,浏览器关闭以后就会被清除发

小编给大家分享一下Session消失机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

以前一直以为cookie就是一直保存在客户端的会话信息,而session是保存在服务器断的会话信息,浏览器关闭以后就会被清除发现session就是cookie 。

Session消失机制的示例分析

Cookie

cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

Session

session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长相等)表明他就是张三。

session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果WEB服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

Token

Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

传统身份验证

Http 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

基于 Token 的身份验证

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP,以后APP请求时,凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。

那么我的问题来了:

服务器上的token存储到数据库中,每次查询会不会很费时。如果不存储到数据库,应该存储到哪里呢。

客户端得到的token肯定要加密存储的,发送token的时候再解密。存储到数据库还是配置文件呢?

token是个易失数据,丢了无非让用户重新登录一下,新浪微博动不动就让我重新登录,反正这事儿我是无所谓啦。

所以如果你觉得普通的数据库表撑不住了,可以放到 MSsql/MySQL 的内存表里(不过据说Mysql的内存表性能提升有限),可以放到 Memcache里(讲真,这个是挺常见的策略),可以放到redis里(我做过这样的实现),甚至可以放到 OpenResty 的变量字典里(只要你有信心不爆内存)。

token是个凭条,不过它比门票温柔多了,门票丢了重新花钱买,token丢了重新操作下认证一个就可以了,因此token丢失的代价是可以忍受的——前提是你别丢太频繁,要是让用户隔三差五就认证一次那就损失用户体验了。

基于这个出发点,如果你认为用数据库来保持token查询时间太长,会成为你系统的瓶颈或者隐患,可以放在内存当中。

比如memcached、Redis,KV方式很适合你对token查询的需求。

这个不会太占内存,比如你的token是32位字符串,要是你的用户量在百万级或者千万级,那才多少内存。

要是数据量真的大到单机内存扛不住,或者觉得一宕机全丢风险大,只要这个token生成是足够均匀的,高低位切一下分到不同机器上就行,内存绝对不会是问题。

客户端方面这个除非你有一个非常安全的办法,比如操作系统提供的隐私数据存储,那token肯定会存在泄露的问题。比如我拿到你的手机,把你的token拷出来,在过期之前就都可以以你的身份在别的地方登录。

解决这个问题的一个简单办法

在存储的时候把token进行对称加密存储,用时解开。

将请求URL、时间戳、token三者进行合并加盐签名,服务端校验有效性。

这两种办法的出发点都是:窃取你存储的数据较为容易,而反汇编你的程序hack你的加密解密和签名算法是比较难的。然而其实说难也不难,所以终究是防君子不防小人的做法。话说加密存储一个你要是被人扒开客户端看也不会被喷明文存储……

方法1它拿到存储的密文解不开、方法2它不知道你的签名算法和盐,两者可以结合食用。

但是如果token被人拷走,他自然也能植入到自己的手机里面,那到时候他的手机也可以以你的身份来用着,这你就瞎了。

于是可以提供一个让用户可以主动expire一个过去的token类似的机制,在被盗的时候能远程止损。

网络层面上token明文传输的话会非常的危险,所以建议一定要使用https,并且把token放在post body里。

补充:

cookie与session的区别

cookie数据存放在客户端上,session数据放在服务器上。

cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session。

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

考虑到减轻服务器性能方面,应当使用COOKIE。

单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

所以个人建议:

将登陆信息等重要信息存放为SESSION

其他信息如果需要保留,可以放在COOKIE中

session与token的区别

session 和 oauth token并不矛盾,作为身份认证 token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由api server的逻辑处理。 如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。这里的 Token是唯一的。不可以转移到其它 App上,也不可以转到其它 用户 上。 转过来说Session 。Session只提供一种简单的认证,即有此 SID,即认为有此 User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。 所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

打破误解:

“只要关闭浏览器 ,session就消失了?”

不对。对session来说,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。

然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。

如果服务器设置的cookie被保存在硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够打开原来的session.

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以以为客户端已经停止了活动,才会把session删除以节省存储空间。

看完了这篇文章,相信你对“Session消失机制的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Session消失机制的示例分析

本文链接: https://lsjlt.com/news/311786.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Session消失机制的示例分析
    小编给大家分享一下Session消失机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以前一直以为cookie就是一直保存在客户端的会话信息,而session是保存在服务器断的会话信息,浏览器关闭以后就会被清除发...
    99+
    2023-06-27
  • CocosCreator消息分发机制的示例分析
    这篇文章将为大家详细讲解有关CocosCreator消息分发机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述本篇开始介绍游戏业务架构相关的内容。在游戏业务层,所有需要隔离的系统和模块间通信...
    99+
    2023-06-14
  • springboot中inputStream神秘消失的示例分析
    这篇文章主要为大家展示了“springboot中inputStream神秘消失的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“springboot中inputStream神秘消失的示例分...
    99+
    2023-06-20
  • HTML5中页面消息传输机制的示例分析
    这篇文章主要介绍HTML5中页面消息传输机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!HTML5 的Message API能够让HTML5页面之间传递消息,甚至这些页面...
    99+
    2024-04-02
  • axios和session的示例分析
    这篇文章主要为大家展示了“axios和session的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“axios和session的示例分析”这篇文章吧。发...
    99+
    2024-04-02
  • MySQL锁机制的示例分析
    这篇文章主要介绍了MySQL锁机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。锁在MySQL中是非常重要的一部分,锁对MySQL...
    99+
    2024-04-02
  • Ajax中Session失效跳转登录页面的示例分析
    小编给大家分享一下Ajax中Session失效跳转登录页面的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在Struts...
    99+
    2024-04-02
  • oracle中SCN机制的示例分析
    小编给大家分享一下oracle中SCN机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SCN(System Chan...
    99+
    2024-04-02
  • CSS层叠机制的示例分析
    这篇文章主要为大家展示了“CSS层叠机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS层叠机制的示例分析”这篇文章吧。css中为什么要有层叠机制...
    99+
    2024-04-02
  • css溢出机制的示例分析
    这篇文章主要为大家展示了“css溢出机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css溢出机制的示例分析”这篇文章吧。为什么需要深入学习CSS溢...
    99+
    2024-04-02
  • Node.js中GC机制的示例分析
    这篇文章主要为大家展示了“Node.js中GC机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Node.js中GC机制的示例分析”这篇文章吧。V8 ...
    99+
    2024-04-02
  • JavaScript执行机制的示例分析
    小编给大家分享一下JavaScript执行机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!进程与线程我们都知道计算机...
    99+
    2024-04-02
  • Flex事件机制的示例分析
    这篇文章主要为大家展示了“Flex事件机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex事件机制的示例分析”这篇文章吧。什么是Flex事件机制Flex事件可以看作是一种触发机制...
    99+
    2023-06-17
  • Flex绑定机制的示例分析
    这篇文章给大家分享的是有关Flex绑定机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex绑定机制在我们了解了事件机制后,那么理解Flex绑定就不难了,Flex绑定其实也是事件机制的运用。1.什么...
    99+
    2023-06-17
  • laravel7.0广播机制的示例分析
    小编给大家分享一下laravel7.0广播机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!laravel7.0广播机制(Redis + socket....
    99+
    2023-06-20
  • Python自省机制的示例分析
    这篇文章将为大家详细讲解有关Python自省机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。何为自省在计算机编程领域里,自省是一种能力,是通过一定机制在程序运行时获知对象的类型及对象的内部结构...
    99+
    2023-06-21
  • Flex中Hook机制的示例分析
    小编给大家分享一下Flex中Hook机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在前一篇简要介绍了基于Flex的界面组合SDK,其中使用Hook机制实现UI Part生命周期管理、Master-Detail...
    99+
    2023-06-17
  • java中锁机制的示例分析
    这篇文章主要介绍java中锁机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使...
    99+
    2023-06-19
  • Zookeeper选取机制的示例分析
    小编给大家分享一下Zookeeper选取机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Zookeeper 是一个分布式服务框架,主要是用来解决分布式...
    99+
    2023-06-27
  • Linux中cpufreq机制的示例分析
    小编给大家分享一下Linux中cpufreq机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!从 2.6.0 Linux 内核开始,您可以通过 CPUf...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作