通过图片解释:
![Sessions explained via Picture](https://istack.dev59.com/mYLGr.webp)
**脚注 - 暂时忽略。**
你可以把一个会话想象成一张图书馆借书卡。每次你去图书馆,你都要出示你的借书卡,这张卡是由那个特定的图书馆发给你的。这样他们就能将你与存档中的记录匹配起来。
让我们一步一步详细解释:
通过类比的简单解释
想象一下,你在银行里,想要从你的账户里取钱。但是很黑,银行一片漆黑,没有光。你被其他20个人包围着。他们看起来都一样。每个人都有相同的声音。每个人都有可能是坏人。换句话说,HTTP是无状态的。
这家银行是一家有趣的银行 - 为了论证,我们来看看事情是如何运作的:
- 你和出纳员交谈,提出取钱的请求,然后
- 你必须在沙发上稍等片刻,20分钟后
- 你从出纳员那里领取你的钱。
但是出纳员怎么能把你和其他人区分开呢?
出纳员无法看到或者很容易辨认出你,记住,因为灯都灭了。
如果你的出纳把你的1万美元取款交给了别人 - 错误的人?!出纳能够认出你是提款人是非常重要的,这样你才能拿到你要求的钱(或资源)。
解决方案:
当你第一次出现在出纳面前时,他或她会告诉你一个秘密:
“每当你和我交谈时,”出纳说,“你应该首先以GNASHEU329的身份自我介绍 - 这样我就知道是你。”
没有其他人知道这个秘密密码。
我取款的示例:
所以我决定去休息20分钟,然后再去找出纳说:“我想取款。”
出纳问我:“你是谁?!”
“是我,乔治·班克斯先生!”
“证明一下!”
然后我告诉他们我的密码:GNASHEU329
“当然,班克斯先生!”
那基本上就是一个会话的工作原理。它可以在成千上万的人中唯一地识别一个人。每次与出纳员打交道时,你都需要进行身份验证。
会话和Cookie的区别:
Cookie:你可以将Cookie看作是一张塑料卡,上面印有信息。你可以在这张卡上存储任何东西,比如姓名、年龄、性别、婚姻状况、密码等。
会话:将其视为临时通行证。通行证存储在Cookie中,但这并不意味着它本身就是一个Cookie。
还记得上面的通行证吗?GNASHEU329。如果银行先生心机重重,决定修改数字,将最后一位改为GNASHEU320。这样做存在安全隐患:
你不希望任何人都能轻易篡改他人的通行证,或者轻易复制它,下面是一些例子:
与Cookie相关的安全问题:
银行可以在你的卡上写入信息,你也可以。但这可能是危险的。
name: Ben Koshy
sex: male
bank balance: $1.99 :'(
如果我想要偷偷摸摸的话,我可以修改我的身份证。
name: Ben Koshy
sex: male
bank balance: $1 billion bucks. <------ new line
万岁!我可以印更多的钱,比
耶伦和
鲍威尔加在一起还多。这会带来安全风险:因此银行会在cookie上“加密”信息,这样如果你篡改了它,银行就会知道。一般规则是,你永远不应该把任何可能被篡改的东西,比如银行余额或其他信息,放在cookie里。银行余额应该存储在服务器上,这样没有人可以直接篡改它。
在这种情况下,鲍威尔决定篡改他的cookie中的银行余额。银行现在可以使他的会话无效,并永久注销他。
name: Jerome Powell
title: "independent" bureaucrat - "Chairman of the Fed"
skill: lying to congress;.
session: tampering with the Fed's balance sheet,
criminal inflation, quantitative easing,
insolvent fed, destroying the dollar,
endless bailouts, telling everyone at the NY economic
club that bond yields are rising def. NOT because of
inflation.....riiiiiiight
-> session invalid. log him out the fed, permanently.
再见先生!
复制会话
想想任何基于网络的服务:Facebook、Gmail:如果我有你的密码,那么我就能访问你的账户。会话也是如此:如果我能够复制或重新创建你的会话,那么我就实际上拥有了你的密码,我可以冒充你。
如果你非常粗心大意,不小心在互联网上泄露了你的私钥,这种情况可能会发生。最近(2023年2月)有人在Github上发布了一些私钥。如果他们发布了Github的secret_base_key,这是他们Rails应用程序中的一个随机数,那么我就可以使用那个私钥来创建会话。一旦我创建了一个会话,我就可以有效地冒充别人。
**脚注:上面的图片并不完全准确,因为会话将由“服务器”分配 - 这通常是一个随机数。我想简化解释,所以我有点作弊,使用了一个略微不准确的类比,以便你能大致理解这个概念。我们可以稍后专注于具体细节。图书馆卡的类比更准确。如果你想要超级技术性的解释,可以查看cookie规范:
https://httpwg.org/http-extensions/draft-ietf-httpbis-rfc6265bis.html