当前位置: 首页 > 科技观察

只要关闭浏览器,Session就消失了?

时间:2023-03-17 00:28:50 科技观察

在做接口测试的时候,我们经常会遇到请求参数的类型是token,但是对于token、cookie、session的区别,大部分测试人员可能还是一知半解。Cookie是一个非常具体的东西,指的是一种可以永久保存在浏览器中的数据,只是浏览器实现的一种数据存储功能。cookie由服务器生成并发送到浏览器。浏览器将cookie以kv的形式保存在某个目录下的文本文件中。下次请求同一网站时,cookie将被发送到服务器。由于cookie是存放在客户端的,浏览器会加上一些限制来保证cookie不会被恶意使用,不会占用过多的磁盘空间,所以每个域的cookie数量是有限制的。Session会话字面意思是会话。这就好比你跟一个人说话,你怎么知道跟你说话的人是张三而不是李四呢?对方必须具备一定的特征(长相相似)才能表明他是张三。session也是一样,服务器需要知道当前是谁在向自己发送请求。为了进行这种区分,服务器必须给每个客户端分配一个不同的“身份”,然后客户端每次向服务器发送请求时,都会带上这个“身份”,服务器就知道请求来了从谁。至于客户端如何保存这个“身份”,有很多种方式。对于浏览器客户端,大家都默认使用cookie方式。服务器使用session将用户的信息暂时保存在服务器上,用户离开网站后session会被销毁。这种存储用户信息的方式比cookie更安全,但是session有一个缺陷:如果web服务器进行负载均衡,当下一个操作请求到达另一台服务器时,session就会丢失。TokenToken介绍:Token是客户端频繁向服务器请求数据,服务器频繁去数据库查询用户名和密码并进行比对,判断用户名和密码是否正确,并做出相应提示.在这样的背景下,TokenIt应运而生。Token的定义:Token是服务器生成的一串字符串,作为客户端请求的令牌。首次登录后,服务端生成一个Token,并将Token返回给客户端。之后客户端只需要带上这个Token就可以请求数据了,不需要再带你的用户名和密码了。最简单的token组成:uid(用户唯一标识),time(当前时间的时间戳),sign(签名,token前几位+salt通过hash算法压缩成一定长度的十六进制字符字符串,可以防止恶意第三方拼接令牌请求到服务器)。使用Token的目的:Token的目的是减轻服务器的压力,减少频繁的数据库查询,让服务器更加健壮。传统认证HTTP是一种无状态协议,即它不知道谁在访问应用程序。这里我们把用户当作一个客户端,客户端已经通过了用户名和密码的认证,但是客户端下次发送请求时,又要重新认证。解决方法是当用户请求登录时,如果没有问题,我们在服务器端生成一条记录,可以说明登录的用户是谁,然后将这条记录的ID号发送给客户端.端收到这个ID号后,会保存在cookie中。下次用户向服务器发送请求时,可以带上这个cookie,让服务器验证cookie中的信息,看是否可以在服务中使用。在客户端这里找到对应的记录。如果可以,说明用户认证通过,将用户请求的数据返回给客户端。以上是Session。我们需要在服务器端存储为登录用户生成的Session。这些会话可能存储在内存、磁盘或数据库中。我们可能需要在服务器端定期清理过期的Session。Token-basedauthentication使用基于令牌的认证方式,不需要在服务器端存储用户登录记录。大致流程如下:客户端使用用户名和密码请求登录服务器。服务端收到验证用户名和密码的请求后,会颁发一个Token,然后将Token发送给客户端。收到令牌后,可以将其存储在cookie中或本地存储中。客户端每次向服务端请求资源时,都需要带上服务端颁发的Token。服务器接收请求,然后验证客户端请求。有了Token,如果验证成功,就会将请求的数据返回给客户端。APP登录时,会将加密后的用户名和密码发送给服务器。服务器将验证用户名和密码。如果成功,它会通过某种方式随机生成32位的字符串作为token存储在服务器中,并将token返回给APP。以后APP请求的时候,需要校验的地方都要带token,然后服务器校验token,成功返回需要的结果,失败则返回错误信息。让他重新登录。服务器上的令牌设置了一个到期日期,APP每次请求时都会验证令牌和到期日期。那么我的问题来了:1、服务器上的token是存储在数据库中的,每次查询会不会很耗时。如果不存储在数据库中,应该存储在哪里。2、客户端获取到的token必须加密存储,发送token时再解密。它是存储在数据库中还是配置文件中?令牌是易失性数据。如果丢失,用户只能重新登录。新浪微博总是让我重新登录。反正我不在乎。所以如果觉得普通的数据库表撑不住了,可以放到MSSQL/MySQL的内存表中(不过据说mysql的内存表性能有限),可以放到Memcache中(说实话,这是一个很常见的策略)),可以放在redis中(我做过这样的实现),甚至可以放在OpenResty的变量字典中(只要你确信内存不会爆)。令牌是一张收据,但比票要温和得多。车票丢了,可以花钱重新买。如果您丢失了令牌,您可以重新操作并验证一个。因此,丢失令牌的代价是可以接受的——前提是你不要丢失太多。通常情况下,如果要求用户每三到五次进行身份验证,就会失去用户体验。基于这个出发点,如果你认为使用数据库来保存token查询时间过长,会成为你系统的瓶颈或隐患,可以将其存入内存。比如memcached、redis、KV方式就很适合你的token查询需求。这样不会占用太多内存。比如你的token是一个32位的字符串,如果你的用户量是几百万或者几千万,那么需要多少内存。如果数据量大到单台机器的内存无法容纳,或者你觉得有一次宕机全部丢失的风险,只要token生成的足够均匀,就可以分高高低低位分到不同的机器上,内存肯定不会有问题。在客户端,除非你有非常安全的方法,比如操作系统提供的私有数据存储,否则token肯定会泄露。例如,如果我拿到你的手机并复制你的令牌,我可以在它过期之前在其他地方以你的身份登录。解决这个问题的简单方法1.在存储token的时候,进行对称加密存储,需要时间的时候解锁。2.合并请求URL、时间戳、token并加salt签名,服务端验证合法性。这两种方法的出发点是更容易窃取你存储的数据,但更难反汇编你的程序来破解你的加密、解密和签名算法。不过,说难也不难,所以毕竟是防君子不防小人之道。说到加密存储,如果有人拿起客户端读取,不会被喷,明文存储。。。方法一,它无法解密存储的密文,方法二,它不知道你的签名算法和盐,两者可以混合食用。但是如果令牌被复制走了,他自然可以植入到他的手机里,那么他的手机也可以当你的手机用,你就瞎了。因此,可以提供类似的机制,让用户主动让过去的token过期,当被盗时可以远程止损。在网络层面以明文形式传输token是非常危险的,所以推荐使用HTTPS并将token放在postbody中。补充:cookie和session的区别1、cookie数据保存在客户端,session数据保存在服务端。2.Cookie不是很安全。其他人可以分析本地存储的COOKIE,进行COOKIE欺骗。考虑到安全性,应该使用session。3.会话会在一定时间内保存在服务器上。当访问量增加时,你的服务器性能会被占用更多。为了降低服务器的性能,你应该使用COOKIE。4、单个cookie保存的数据不能超过4K,很多浏览器限制一个站点最多保存20个cookie。5.所以个人建议:将登录信息等重要信息存储为SESSION。如果需要保留其他信息,可以放在COOKIE中。每个请求都有一个签名来防止监听和重放攻击,会话必须依赖链路层来保证通信安全。上面说了,如果需要实现一个有状态的session,仍然可以在server端添加一个session来保存一些状态。App通常使用restfulapi与服务端打交道。Rest是无状态的,即app不需要像浏览器一样使用cookie来保存session,所以使用sessiontoken来标记自己就可以了,session/state由apiserver的逻辑来处理.如果您的后端不是无状态的restapi,那么您可能需要在应用程序中保存会话。您可以在应用程序中嵌入webkit并使用隐藏的浏览器来管理cookie会话。Session是一种HTTP存储机制,目的是提供HTTP提供的Stateful持久化机制。所谓Session认证只是简单的将User信息保存在Session中,因为SID的不可预测性,所以暂时认为是安全的。这是一种身份验证方法。而Token,如果指的是OAuthToken或者类似的机制,提供认证和授权。认证是针对用户的,授权是针对应用的。其目的是让应用程序有权访问用户的信息。这里的Token是独一无二的。不能转让给其他应用,也不能转让给其他用户。转向会话。Session只提供简单的认证,即有了这个SID,就认为拥有了这个User的所有权限。它需要严格保密。此数据应仅存储在网站上,不应与其他网站或第三方应用程序共享。所以简单来说,如果你的用户数据可能需要分享给第三方,或者允许第三方调用某个API接口,就使用Token。如果永远只是自己的网站和自己的App,用什么都无所谓。打破误解:“只要关闭浏览器,session就消失了?”不对。对于session,除非程序通知服务器删除一个session,否则服务器会永远保留它。程序一般会在用户注销时发送删除会话的命令。但是浏览器在关闭前从来不会主动通知服务器自己将要关闭,所以服务器永远没有机会知道浏览器已经关闭。造成这种错觉的原因是大部分session机制使用sessioncookies来保存sessionids,关闭浏览器后sessionid消失,再次连接服务器时就找不到原来的session了。如果服务器设置的cookie保存在硬盘上,或者通过某种手段改写浏览器发送的HTTP请求头,将原来的sessionid发送给服务器,那么再次打开浏览器仍然可以打开原始会话。浏览器不会导致会话被删除,强制服务器为会话设置一个过期时间。当客户端最后一次使用session的时间超过了这个过期时间,服务器就可以认为客户端已经停止了活动,那么这个session就会被删除。删除以节省存储空间。作者|王菜鸟1993资料来源|cnblogs.com/JamesWang1993/p/8593494.html