构成即时消息开发的基础知识(4):正确理解短连接中的Cookie、会话和令牌

 1.前言

 

 众所周知,即时消息是典型的快速数据流交换系统。目前,主流即时通信系统(尤其是移动即时通信系统)的数据流切换模式是通过Http短连接+TCP或UDP长连接来实现的。Http短连接主要用于从服务器读取各种持久信息,如用户信息、聊天历史、好友列表等,而长连接用于接收和发送实时聊天消息或指令。

 

 作为即时通讯系统中不可或缺的技术,Http短连接的重要性是不可替代的。然而,作为一种传统的互联网信息交换技术,一些典型的概念如Cookie、Session和Token对于即时消息新手程序员来说并不容易理解。鉴于Http短连接在即时通讯系统中的重要性,如何正确理解Cookie、会话、令牌等。,确定您的技术解决方案是否能够找到最佳实践。本文将解释这三种方法的原理、用途和正确的应用场景。

 

 题外话:本文讨论的使用Http短连接的话题可能不适用于微信等即时通信,因为微信的短连接不是使用Http标准协议实现的,而是在自主开发的火星网络层框架基础上重新创建了一种短连接机制,更适合即时通信场景(低延迟、低流量、更好的弱网络适应算法等)。)。详情请见“承诺:微信使用的移动即时通讯网络层跨平台组件库Mars已正式开通”当然,Mars不错,但可能不适合您的团队,因为与标准总体方案相比,定制方案技术力量不强,不易控制。

 

 文章:“移动即时通信开发者必须阅读(一):易于理解和理解移动网络的“弱点”和“缓慢”,《移动即时通信开发者必须阅读(二):历史上最完整的移动弱网络优化方法概述》,《现代移动网络中短连接优化方法概述:请求速度、弱网络适应、安全保证》详细介绍了当今移动网络中http短连接的网络层技术问题。

 

 小白必须读:如果这篇文章对你来说有点无聊,那就读这篇文章:“小白必须读:关于会话和短连接中令牌的流言”。

 2.系列文章

 

 ▼ IM开发干货系列文章(本文是其第十三篇文章):

 

 即时消息传递保证机制的实现(一):保证在线实时消息的可靠传递

 即时消息传递保证机制的实现(二):保证离线消息的可靠传递

 如何确保即时消息的“时间”和“一致性”?》

 我应该使用“推”还是“拉”来同步即时消息单聊和群聊的在线状态?》

 即时消息群聊新闻如此复杂,如何确保它不丢失或沉重?》

 安卓即时通讯智能心跳算法的设计与实现探讨(含示例代码)

 “当即时消息登录移动终端时,如何通过提取数据来节省流量?》

 易于理解:基于集群共享移动终端即时通信接入层的负载均衡方案

 浅谈移动即时通信的多点登录和消息漫游原理

 构成即时通讯开发的基础知识(一):正确理解前端HTTP单点登录接口的原理

 构成即时消息开发的基础知识(2):如何为大量图像文件设计服务器端存储架构?》

 补充即时通讯开发的基础知识(3):快速了解服务器端数据库读写分离的原理和实用建议

 构建即时消息开发的基础知识(4):正确理解在HTTP短连接中的Cookie、会话和令牌(本文)

 如何实现即时通讯群聊信息的阅读回执功能?》

 即时消息群聊消息是一份拷贝(即扩散阅读)还是多份拷贝(即扩散写作)?》

 构成即时消息开发的基础知识(5):易于理解、正确理解并充分利用MQ消息队列

 一种低成本保证即时消息定时的方法探讨

 补上一课关于即时消息开发的基础知识(6):您的数据库使用NoSQL还是SQL?读读这个!》

 在即时通讯中实现“身边人”功能的原则是什么?如何有效地实现它?》

 构成即时通讯开发的基础知识(七):主流移动账户登录方法的原理和设计思路

 弥补即时通讯发展的基础知识(8):历史上最流行的,彻底了解字符乱码问题的本质

 如何实现即时通讯的扫描码板功能?有一篇文章了解主流应用的扫描代码登陆技术的原理

 “即时通讯做手机扫描码登录?让我们先来看看微信扫描码登录功能的技术原理

 构成即时通讯发展的基础知识(9):想发展即时通讯集群吗?首先了解什么是RPC!》

 

 如果你是即时通讯开发的初学者,强烈建议你先阅读“初学者:从头开始开发移动即时通讯”。

 3.什么是饼干?

 

 Cookie技术起源于互联网上HTTP协议的快速发展。随着互联网时代的飞速发展,带宽和其他限制不再存在。人们需要更复杂的互联网交互活动,所以他们必须与服务器保持活跃(简称保持活跃)。因此,在浏览器开发的早期阶段,为了满足用户的需求,在技术上引入了各种保持网页浏览状态的手段,包括Cookie技术。Cookie是存储在计算机浏览器目录中的文本文件。当浏览器运行时,它存储在内存中发挥作用(这种cookie称为会话cookie)。一旦用户从网站或服务器上注销,cookies就可以存储在用户的本地硬盘上(这种Cookies称为持久Cookies)。

 

 cookie的由来:1993年,网景公司的一名员工卢·蒙特利(Lou Montulli)发明了如今广泛使用的cookie,以进一步提高用户访问网站的速度,并进一步实现个性化网络。(因此,适当的懒惰也将推动人类计算机发展史上的一小步~)

 

 cookie的及时性:目前,一些cookie是暂时的,而另一些是持久的。临时cookies只在浏览器中存储一段指定的时间。一旦超过指定时间,系统将清除cookies。

 

 Cookie使用限制:必须在输出HTML文件内容之前设置cookie;不同的浏览器(网景浏览器、网络浏览器)处理Cookie的方式不一致,所以我们在使用它们时必须考虑它们。如果客户端用户设置了cookie的禁止,则无法建立cookie。在客户端,浏览器最多可以创建300个cookie,每个cookie不能超过4KB,每个网站可以设置的cookie总数不能超过20个。

 

 执行过程:

 

 答:首先,客户端将向服务器发送一个http请求;

 在服务器接收到客户端请求后,它向客户端发送一个http响应,这个响应头包含设置Cookie头;

 c:在客户端发起的第二个请求(注意:如果服务器需要我们带cookies,我们需要在步骤b上面得到cookies,然后一起发起第二个请求作为请求头),这为服务器提供了可以用来唯一标识客户端身份的信息。此时,服务器还可以判断客户机上是否启用了cookies。虽然用户可能会在与应用程序交互的过程中突然禁用cookies,但这种情况基本上不太可能发生,因此可以忽略,这在实践中已被证明是正确的。

 

 为了便于理解,您可以先看一下这个流程图来深化这个概念:

 构成即时消息开发的基础知识(4):正确理解短连接中的Cookie、会话和令牌

 

 那么,浏览器上的请求头和Cookie在哪里?下图为每个人捕捉到了其中一个:

 构成即时消息开发的基础知识(4):正确理解短连接中的Cookie、会话和令牌

 4.Cookie和会话

 

 众所周知,HTTP是一个无状态协议,因此每次客户端发送请求时,下一个请求都不能知道最后一个请求中包含的状态数据。我们如何联系用户的状态数据?

 

 例如,在淘宝的某个页面,你登录了。当您跳转到产品页面时,服务器如何知道您已登录?

 5.关于会话

 

 饼干非常方便,但是使用饼干有一个很大的缺点。cookie中的所有数据都可以在客户端修改,而且数据很容易被伪造,所以一些重要的数据不能存储在cookie中,如果cookie中的数据字段太多,会影响传输效率。为了解决这些问题,创建了一个会话,会话中的数据保存在服务器端。

 

 总之:会话是为服务器准备的,但没有为客户端准备的会话。会话意味着,当服务器与客户端建立连接时,它会添加一个客户端连接标志,该标志最终将被转换为服务器软件(Apache、Tomcat、JBoss)中的临时Cookie,并发送给客户端。当客户端第一次请求时,服务器将检查它是否携带此会话(临时Cookie),如果不携带,它将添加一个会话,如果携带,它将取出此会话以执行相关操作。

 

 会话由会话id操作。会话id通常存储在客户端的Cookie中。例如,在express (Nodejs)中,默认情况下它是connect.sid字段。当请求到来时,服务器检查存储在Cookie中的session_id,并将其与服务器的session数据相关联,以保存和修改数据。

 

 也就是说,当您浏览网页时,服务器会随机生成一个长度为1024位的字符串,存储在您的Cookie的connect.sid字段中。当您下次访问时,Cookie将携带该字符串,然后浏览器将知道您是上次访问的XXX,然后从服务器的存储中检索上次记录在您身上的数据。因为字符串是随机生成的,并且有足够的数字,所以不用担心有人会伪造它。伪造成功的概率低于坐在家里编程时被邻居的狗突然闯入并杀死的概率。

 

 下图显示了完整的Cookie+会话应用程序流程:

 构成即时消息开发的基础知识(4):正确理解在HTTP短连接中的Cookie、会话和令牌

 

 会话可以存储在:

 

 1)记忆;

 2)Cookie本身;

 3)redis或memcached缓存;

 4)在数据库中。

 

 在网上,缓存方案更常见。如果存储了数据库,与前三者相比,查询效率太低,这是不推荐的;Cookie会话存在安全问题,这将在下面提到。

 

 传统的身份验证方法包括从最早的Cookie到会话和加密会话Cookie。接下来,让我们看看令牌身份验证。

 6.什么是令牌?

 

 6.1令牌的来源

 

 网络前端框架类库,如Ember、Angular和Backbone,正在随着更复杂的网络应用程序而增长。由于这个原因,服务器端的构造正在摆脱传统的任务,变得更像是API。API将前端和后端的传统概念分离开来。开发人员可以脱离前端,独立开发后端,这使得测试更加方便。这种方法还使移动应用程序和网络应用程序能够使用相同的后端。

 

 使用应用编程接口时,挑战之一是身份验证。在传统的web应用程序中,服务器成功返回响应取决于两件事。首先,他通过存储机制保存会话信息。每个会话都有自己唯一的信息(id),通常是一个长的随机字符串,用于将来的请求检索信息。其次,响应头中包含的信息使客户端保存一个Cookie。服务器会自动为每个子请求添加一个会话标识,这使服务器能够通过检索会话中的信息来识别用户。这就是传统的网络应用程序如何避开HTTP是无状态的事实。

 

 该应用编程接口应该被设计成无状态的。这意味着没有登录和注销方法,没有会话,并且API设计者也不能依赖Cookie,因为不能保证这些请求是由浏览器发送的。自然,我们需要一种新的机制。代币出现了。

 

 6.2什么是令牌

 

 令牌是用户身份的认证方法,我们通常称之为令牌。令牌最简单的组成部分是uid(用户的唯一身份)、时间(当前时间的时间戳)和符号(签名,通过哈希算法将其压缩为特定的十六进制字符串,可以防止恶意第三方拼接令牌来请求服务器)。您还可以将不变的参数放入令牌中,以避免多次搜索数据库。

 

 我们可以把代币看作是一本安全的护照。你在安全的前台验证你的身份(通过你的用户名和密码)。如果你成功地验证了自己,你就可以得到这个。当你走进大楼(试图通过调用API获取资源)时,你将被要求验证你的护照,而不是在前台重新验证。

 

 简单地说,就像下面的图片:

 构成即时消息开发的基础知识(4):正确理解在HTTP短连接中的Cookie、Session和Token 2 . jpg

 

 6.3令牌的应用场景

 

 令牌的使用过程:

 

 答:在用户第一次成功登录后(注册也是一个适用的场景),服务器将生成一个令牌值,该令牌值将保存在服务器中(保存在数据库中),然后返回给客户端;

 b:客户端获得令牌值后,会将其保存在本地。(SP存储是每个人都可以轻松支持和理解的存储);

 c:当客户端再次发送网络请求(通常不是登录请求)时,它会将该令牌值附加到参数上,并将其发送到服务器;

 在收到客户端的请求后,服务器将取出令牌值,并将其与本地(数据库)中存储的令牌值进行比较。

 

 令牌的身份验证逻辑:

 

 比较1:如果两个令牌值相同,则用户已经成功登录!当前用户处于登录状态!

 比较2:如果没有令牌值,则意味着登录不成功;

 比较3:如果令牌值不同,则意味着原始登录信息已经过期,因此用户可以再次登录。

 

 6.4令牌的安全性

 

 我们可以将经过身份验证的令牌记录保存在服务器上,以添加额外的安全层,然后在每一步验证令牌时验证记录(例如,每次客户端请求应用编程接口时检查令牌的合法性)。这将防止第三方伪装令牌,还将使服务器使令牌无效。

 7.Cookie和会话之间的差异摘要

 

 1)cookie数据存储在客户端的浏览器上,会话数据存储在服务器上;

 2)饼干不太安全。其他人可以分析存储在本地的饼干并欺骗饼干。会话;应在考虑安全性的情况下使用;

 3)会话将在服务器上保存一段时间。当访问次数增加时,它将占用服务器的性能。考虑到服务器性能的降低,cookie应该使用;

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

 

 所以个人建议:

 

 将登录信息等重要信息保存为会话;;

 如果需要保存,其他信息可以放在cookie中。

 

 8.令牌和会话之间的差异摘要

 

 会话和令牌并不矛盾。作为身份验证令牌,安全性优于会话,因为每个请求都有一个签名来防止拦截和重放攻击,会话必须依赖链路层来确保通信安全。如上所述,如果您需要实现有状态会话,您仍然可以添加会话来保存服务器端的一些状态

 

 应用程序通常使用restful api来处理服务器。其余的是无状态的,也就是说,应用程序不需要像浏览器一样使用cookie来保存会话,所以使用会话令牌来标记自己就足够了,会话/状态由api服务器的逻辑来处理。如果您的后端不是无状态rest api,您可能需要在应用程序中保存会话。您可以在应用程序中嵌入webkit,并使用隐藏的浏览器来管理cookie会话。

 

 会话是一种HTTP存储机制,旨在为无状态HTTP提供一种持久机制。所谓的会话认证只是将用户信息存储在会话中。由于样本号的不可预测性,它暂时被认为是安全的。这是一种认证方式。令牌,如果它指的是授权令牌或类似的机制,提供认证和授权,认证是针对用户的,授权是针对应用的。目的是让应用程序有权访问用户的信息。这里的令牌是独一无二的。您不能转移到其他应用程序或其他用户。转到会话。会话只提供一个简单的身份验证,也就是说,如果有这个SID,就意味着有这个用户的所有权限。它需要严格保密,这些数据应该只存储在站内,不应该与其他网站或第三方应用程序共享。简单地说,如果您的用户数据可能需要与第三方共享,或者允许第三方调用API接口,请使用令牌。如果它永远只是你自己的网站和你自己的应用,你用什么并不重要。

 

 令牌就是令牌。例如,当您授权(登录)一个程序时,它是判断您是否已经授权该软件的基础;Cookie是一个写在客户端的txt文件,它包含了你的登录信息,所以下次你登录到一个网站时,你会自动调用cookie来自动登录用户名;会话类似于cookie,只是会话是一个写在服务器端的文件,cookie文件需要写在客户端,但是文件包含您的浏览器号。会话状态存储在服务器端,客户端只有sessionid。令牌的状态存储在客户端。


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?