Session、Cookie、Token 傻傻分不清?

      最后更新:2020-03-09 12:35:01 手机定位技术交流文章

      本文将从网络应用程序从传统身份验证到基于令牌的身份验证的演变过程的角度介绍会话、Cookie、令牌。


      很久以前,网络应用程序主要用于浏览文档,如网页黄页。因为它只是浏览,所以服务器不需要记录特定用户在某段时间内浏览了哪些文档。每个请求都是一个新的HTTP协议,对服务器来说是全新的。


      基于会话的身份验证

      随着交互式网络应用的兴起,如购物和其他需要登录的网站这就提出了一个新的问题,即哪些用户应该登录系统,他们采取了什么措施来管理会话(什么是会话?简单地说,如果用户需要登录,它可以简单地理解为一个会话,如果他不需要登录,它是一个简单的连接。),例如,不同的用户向购物车中添加不同的产品,这意味着必须区分每个用户因为HTTP请求是无状态的,所以我们想出了一种给每个用户分配一个会话id的方法。简单地说,它是一个随机字符串,既不重复也不容易找到要复制的规则,因此每个用户都会收到不同的会话ID。每次用户从客户端向服务器发起一个HTTP请求时,字符串都会一起发送。这样,服务器可以区分谁是谁。至于客户端(浏览器)如何保存“标识”,默认为Cookie。会话id将存储在客户端的Cookie中。

      以这种方式解决了区分用户的问题,但它也带来了一个新问题,即每个用户(客户端)只需要保存自己的会话id,而服务器需要保存所有用户的会话id。如果访问服务器的用户数量逐渐增加,将需要节省数万甚至数千万,这对于服务器来说是不可接受的成本。另一个例子是服务器是由两个服务器组成的集群。小明通过服务器a登录系统,会话id将保存在服务器a上。假设小明的下一个请求被转发到服务器b?服务器b没有小明的会话id。

      有人可能会说,如果小明总是登录到服务器A(粘性会话),这个问题不会解决吗?如果服务器a挂断了呢?还是将小明的请求转发到服务器b

      通过这种方式,它只能在集群之间进行会话复制和共享,即在两台机器之间复制会话id,如下图所示,但是这给服务器的性能和内存带来了巨大的挑战

      因此,如果所有用户的会话都以集中方式存储,那么缓存服务memcached也被考虑-因为Memcached是一个分布式内存对象缓存系统,所以它可以用来实现会话同步。会话id存储在一个服务器中,所有服务器都在这个位置访问数据,从而避免了重复。然而,这种“无数恩惠的集合”使得单一的失败点成为可能。也就是说,负责存储会话的服务器被挂起,所有用户都必须再次登录,这对于用户来说是不可接受的。

      之后,所有存储会话的服务器都将聚集在一起,以提高可靠性并避免单点故障。然而,会议产生的问题一个接一个地出现。

      ,所以有些人在想,为什么服务器必须保存这个会话,只让每个客户端保存它?但是,如果服务器不保存这些会话ID,它将如何验证客户端发送的会话ID确实是由服务器生成的?如果未经验证,服务器无法判断其是否是合法登录的用户。是的,这里的问题是验证。会话只是这个验证问题的一个解决方案。还有其他解决办法吗?


      基于令牌的身份验证

      例如,小明已经登录到系统,服务器向他发送包含小明的用户id的令牌。当小明请求通过Http再次访问服务器时,仅仅通过Http头来携带这个令牌是不够的

      服务器需要验证令牌是自己生成的,而不是伪造的。如果任何人都可以不经过验证就伪造它,那么这个令牌和会话id之间就没有本质的区别。别人怎么能不伪造它呢?让我们签署数据。例如,服务器使用HMAC-SHA256加密算法,加上一个只有服务器知道的密钥,对数据进行签名,并将签名和数据作为令牌发送给客户端。客户端收到令牌后,可以将其存储在Cookie或本地存储中。由于除了服务器之外,其他任何用户都不知道该密钥,因此它不能伪造令牌。通过这种方式,服务器不需要保存令牌。小明向服务器发送令牌时,服务器使用相同的HMAC-SHA256算法和相同的密钥再次计算数据的签名,并与令牌中的签名进行比较。如果相同,小明已经登录,即验证成功如果不是,那么请求就是假的。

      这样,服务器只需要生成令牌,不需要保存令牌,只需要验证令牌,从而实现了时间换空间(中央处理器计算会话存储空间的时间)不受会话id的限制,当用户访问次数较多时,直接添加机器可以很容易地进行水平扩展,这也大大提高了可扩展性。


      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/647.html

          热门文章

          文章分类