首页 > 资讯 > 科技 > 正文
2024-02-29 08:08

彻底了解 cookie、会话和令牌

发展历程

1. 很久以前,网络基本上只是浏览文档。 既然是浏览,那么作为服务器,就不需要记录在一定时间内谁浏览了哪些文档。 每个请求都是一个新的HTTP协议,也就是一个请求。 添加响应,特别是因为我不必记住是谁刚刚发出了 HTTP 请求,并且每个请求对我来说都是新的。 这是一个非常激动人心的时刻。

2.然而,随着交互式Web应用的兴起,比如网上购物网站、需要登录的网站等,我们立即面临一个问题,那就是要管理会话,我们必须记住谁登录了系统以及谁自己购买。 把产品放进车里意味着我必须区分每个人,这是一个很大的挑战。 因为 HTTP 请求是无状态的,所以我想出的解决方案是向每个人发送一个会话 ID(id)。 说白了,就是一个随机的字符串,每个人接收的方式都不一样。 每次有人向我发送HTTP请求时,就把这个字符串一起发送给我,这样我就可以区分谁是谁。

3、这样,大家都很开心,但是服务器却不开心。 每个人只需要保存自己的ID,服务器需要保存每个人的ID! 如果接入服务器太多,就会有几千甚至几十万。

这对于服务器来说是一个巨大的开销,严重限制了服务器的扩展能力。 比如我用两台机器组成一个集群,小F通过机器A登录系统,那么ID就会保存在机器A上。假设小F的下一个请求转发到机器B上怎么办? 机器B没有小F的ID。

有时候会用一个小技巧:让小F的请求一直卡在A机器上,但这不行。 如果A机挂了,就得转移到B机上。

所以我必须制作一份副本并在两台机器之间移动 ID。 我几乎筋疲力尽了。

后来有人打电话给我想出了一个解决方案:将ID集中存储在一个地方,所有机器都会访问这个地方的数据。 这样虽然不需要复制,但是却增加了单点故障的可能性。 如果责任人的机器死机了,大家都得重新登录,估计会被骂死。

我也尝试过把这台单机放到集群中来增加可靠性,但无论怎样,这台小机器对我来说都是一个沉重的负担。

4.所以有些人一直在想,我为什么要拯救这个可憎之物呢? 如果让每个客户都保存它该有多好?

但如果这些ID没有保存,我如何验证客户端发送给我的ID确实是我生成的呢? 如果不验证,我们不知道他们是否是合法登录用户,不怀好意的人就可以伪造ID为所欲为。

嗯,对了,重点是验证!

比如小F登录了系统,我给他发了一个token,里面有小F的用户id。 下次小F再次请求通过HTTP访问我时,我会通过HTTP带上这个token。 如果你不这样做也没关系。

但这和ID没有本质区别。 任何人都可以伪造,所以我得想办法阻止别人伪造。

然后对数据进行签名。 比如我使用HMAC算法,添加一个只有我知道的密钥,对数据进行签名,并用这个签名和数据作为令牌。 由于密钥不为其他人所知,因此不可能伪造令牌。

我不会保存这个令牌。 当小F把这个token发给我的时候,我会用同样的HMAC算法和同样的密钥对数据再次计算签名,并与token中的签名进行比较。 如果相同的话,我就知道小F已经登录了,可以直接获取小F的用户id。 如果不相同,那么数据部分肯定被篡改了,我会告诉发件人:抱歉,没有进行身份验证。

Token中的数据是明文存储的(虽然我会使用编码,但是没有加密),仍然可以被别人看到,所以我无法在里面保存密码等敏感信息。

当然,如果一个人的令牌被别人窃取了,我也无能为力。 我也会认为小偷是合法用户。 这其实就和一个人的身份证被别人盗用是一样的。

这样我就不保存了,我只是生成token,然后验证token,我用我的CPU计算时间来获取我的存储空间!

解除了身份证的负担,可以说是高枕无忧了。 我的机器集群现在可以轻松水平扩展。 随着用户访问量的增加,我可以直接添加机器。 这种无国籍的感觉真好!

它是一个非常具体的东西,指的是一种可以永久保存在浏览器中的数据。 它只是浏览器实现的一个数据存储功能。

由服务器生成并发送到浏览器,浏览器将其以kv格式保存到某个目录下的文本文件中,并在下次请求同一网站时发送到服务器。 由于它存在于客户端,浏览器添加了一些限制,以确保它不会被恶意使用,也不会占用过多的磁盘空间,因此每个域的数量是有限的。

从字面上看,对话。 这与您与某人交谈时类似。 你怎么知道跟你说话的人是张三而不是李四? 对方必须具有某些特征(例如外表)表明他是张三。

也是类似的原因。 服务器需要知道当前谁正在向自己发送请求。 为了进行这种区分,服务器为每个客户端分配不同的“身份标识符”。 那么每次客户端向服务器发送请求时,都会带上这个“身份标识符”,服务器就知道这个请求来自谁。 至于客户端如何保存这个“身份”,有很多方法。 对于浏览器客户端,大家都使用默认的方法。

服务器将用户的信息暂时保存在服务器上,用户离开网站后该信息将被销毁。 这种存储用户信息的方法相对来说比较安全,但是它有一个缺陷:如果Web服务器是负载均衡的,那么当下一个操作请求到达另一台服务器时就会丢失。

代币

基于Token的认证在Web领域随处可见。 在大多数使用Web API的互联网公司中,这是处理多用户身份验证的最佳方式。

以下功能允许您在程序中使用基于令牌的身份验证

无状态且可扩展

支持移动设备

跨程序调用

安全

使用基于令牌的身份验证的人

您见过的大多数 API 和 Web 应用程序都使用它。 例如,、+等。

Token的由来

在介绍基于Token的认证原理和优点之前,不妨先看一下之前的认证是如何进行的。

基于服务器的身份验证