我刚刚开始学习web应用程序开发,使用python。我遇到了术语“cookie”和“会话”。我理解cookie,因为它们在浏览器上的键值对中存储了一些信息。但是关于会话,我有一点困惑,在会话中,我们也将数据存储在用户浏览器的cookie中。

例如,我使用用户名='rasmus'和密码='default'登录。在这种情况下,数据将被发布到服务器,它应该检查和登录我,如果认证。然而,在整个过程中,服务器也会生成一个会话ID,它将存储在浏览器的cookie中。现在,服务器还将这个会话ID存储在其文件系统或数据存储中。

但是仅仅基于会话ID,它如何能够在我随后遍历站点时知道我的用户名呢?它是否将服务器上的数据存储为字典,其中键将是会话ID和详细信息,如用户名,电子邮件等是值?

我有点困惑了。需要帮助。


当前回答

图片讲解:

你可以把会话想象成图书馆的身份证。每次你去图书馆的时候,你都要给他们看你的身份证,你的身份证是那个图书馆签发的。

简单类比解释

想象一下,你在一家银行,试图从你的账户中取出一些钱。但是天很黑;银行一片漆黑,没有灯光。你被另外20个人包围着。他们看起来都一样。每个人的声音都是一样的。每个人都是潜在的坏人。换句话说,HTTP是无状态的。

这家银行是一种有趣的银行类型——为了便于讨论,以下是事情的运作方式:

你跟你的出纳员说,要求取钱,然后 你必须在沙发上等一会儿,20分钟后 你从出纳员那里取钱。

但是出纳员如何把你和其他人区分开来呢?

记住,出纳员看不见你,也认不出你,因为灯都灭了。

如果你的出纳员把你的1万美元提现给了别人——一个错误的人怎么办?让柜员认出你是取款的人是至关重要的,这样你就能拿到你想要的钱(或资源)。

解决方案:

当你第一次出现在出纳员面前时,他或她会秘密地告诉你一些事情:

“当你和我说话的时候,”出纳员说,“你应该首先表明自己是GNASHEU329,这样我就知道是你了。”

没有人知道这个秘密密码。

我提取现金的例子:

所以我决定去银行休息20分钟然后我去柜员那里说"我想取我的提款"

柜员问我:“你是谁??!”

“是我,乔治·班克斯先生!”

“证明!”

然后我告诉他们我的密码:GNASHEU329

“当然可以,班克斯先生!”

这基本上就是会话的工作方式。它可以让一个人在数百万人的海洋中被唯一地识别出来。每次和出纳员打交道时,你都需要说明自己的身份。

Sessions和cookie的区别

会话:在上面的例子中,您可以将会话看作临时密码。一旦银行(即服务器)看到密码-他们将能够识别你是谁,你想要什么等等。

Cookie:你可以把Cookie简单地想象成一张纸~~身份证~~上面印着信息。每次你去银行的时候,你都要出示你在那个发卡行的身份证。

你可以在那张卡上存储任何东西,比如:

姓名/年龄/性别/婚姻状况 密码

银行可以把信息写到你的身份证上,你也可以。但这可能很危险:

下面是我的ID card / cookie:

name: Ben Koshy
sex: male
bank balance: $1.99.

这糟透了。但如果我想偷偷摸摸,我可以编辑我的身份证:

bank balance: $1 billion bucks.

万岁!我可以凭空印更多的钱,比耶伦和鲍威尔加起来还多,然后用来买快克可卡因等。

这带来了安全风险:正是因为这个原因,服务器“加密”了cookie上的信息,所以如果你篡改了它,银行就会知道——他们可以在你的身份证上写各种信息,下次你试图来银行时把你锁在外面。杰罗姆·鲍威尔试图改变银行余额,而且非常狡猾,这是银行对他的身份证所做的:

 Name: Jerome Powell
 Status: ID Card tampered - changed bank balance by fraudulent printing.
 Trust: Do not trust. 
 Judgment: Escort from building. 
 Outcome: guilty of theft / fraud.

以上不是严格意义上的,其术语完全准确,大意是用类比来解释概念。

其他回答

HTTP是无状态连接协议,即服务器无法区分不同用户的不同连接。

于是就有了cookie,当客户端第一次连接到服务器时,服务器会生成一个新的会话id,这个会话id随后会作为cookie值发送给客户端。从现在开始,这个会话id将标识该客户端连接,因为在每个HTTP请求中,它将在cookie中看到相应的会话id。

现在,对于每个会话id,服务器都保留了一些数据结构,这使他能够存储特定于用户的数据,这种数据结构可以抽象地称为会话。

会话是一个广泛的技术术语,它可以用来指存储在服务器端使用内存缓存或存储在客户端使用cookie、本地存储或会话存储的状态。

在浏览器或服务器上没有称为会话的特定内容。会话是一种在网络上代表用户会话的数据。这些数据可以存储在服务器或客户端上。

如何存储和共享是另一个主题。但简单来说就是当用户登录时,服务器会创建会话数据并生成会话ID。会话Id在自定义报头或set-cookie报头中发送回用户,这些报头负责自动将其存储在用户的浏览器上。然后,当用户下次访问时,会话ID将随请求一起发送,服务器将根据该ID检查是否存在现有会话并进行相应处理。

你可以在一个会话中存储任何你想要的东西,但主要目的是记住以前访问过你的网站的用户(浏览器),无论是关于登录、购物车还是其他活动。

这就是为什么保护会话ID不被黑客拦截的原因,黑客会用它来识别自己是另一个用户。

通过阅读Cookie,您将获得session的概念:(https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)

节选自MDN:

Cookies are mainly used for three purposes:

Session management

    Logins, shopping carts, game scores, or anything else the server should remember
Personalization

    User preferences, themes, and other settings
Tracking

    Recording and analyzing user behavior

把HTTP想象成一个人(a),他有短期记忆丧失,一旦那个人离开他的视线,他就会忘记那个人。

现在,为了记住不同的人,A拍下了那个人的照片并保存下来。每个人的照片都有一个身份证号码。当这个人再次出现在视线中时,这个人告诉A他的身份证号码,A通过身份证号码找到他的照片。 瞧!!A知道那个人是谁。

HTTP也是如此。它患有短期记忆丧失。它使用会话记录你在使用网站时所做的一切,然后,当你再次访问时,它会在Cookie的帮助下识别你(Cookie就像一个令牌)。 图片是Session, ID是Cookie。

图片讲解:

你可以把会话想象成图书馆的身份证。每次你去图书馆的时候,你都要给他们看你的身份证,你的身份证是那个图书馆签发的。

简单类比解释

想象一下,你在一家银行,试图从你的账户中取出一些钱。但是天很黑;银行一片漆黑,没有灯光。你被另外20个人包围着。他们看起来都一样。每个人的声音都是一样的。每个人都是潜在的坏人。换句话说,HTTP是无状态的。

这家银行是一种有趣的银行类型——为了便于讨论,以下是事情的运作方式:

你跟你的出纳员说,要求取钱,然后 你必须在沙发上等一会儿,20分钟后 你从出纳员那里取钱。

但是出纳员如何把你和其他人区分开来呢?

记住,出纳员看不见你,也认不出你,因为灯都灭了。

如果你的出纳员把你的1万美元提现给了别人——一个错误的人怎么办?让柜员认出你是取款的人是至关重要的,这样你就能拿到你想要的钱(或资源)。

解决方案:

当你第一次出现在出纳员面前时,他或她会秘密地告诉你一些事情:

“当你和我说话的时候,”出纳员说,“你应该首先表明自己是GNASHEU329,这样我就知道是你了。”

没有人知道这个秘密密码。

我提取现金的例子:

所以我决定去银行休息20分钟然后我去柜员那里说"我想取我的提款"

柜员问我:“你是谁??!”

“是我,乔治·班克斯先生!”

“证明!”

然后我告诉他们我的密码:GNASHEU329

“当然可以,班克斯先生!”

这基本上就是会话的工作方式。它可以让一个人在数百万人的海洋中被唯一地识别出来。每次和出纳员打交道时,你都需要说明自己的身份。

Sessions和cookie的区别

会话:在上面的例子中,您可以将会话看作临时密码。一旦银行(即服务器)看到密码-他们将能够识别你是谁,你想要什么等等。

Cookie:你可以把Cookie简单地想象成一张纸~~身份证~~上面印着信息。每次你去银行的时候,你都要出示你在那个发卡行的身份证。

你可以在那张卡上存储任何东西,比如:

姓名/年龄/性别/婚姻状况 密码

银行可以把信息写到你的身份证上,你也可以。但这可能很危险:

下面是我的ID card / cookie:

name: Ben Koshy
sex: male
bank balance: $1.99.

这糟透了。但如果我想偷偷摸摸,我可以编辑我的身份证:

bank balance: $1 billion bucks.

万岁!我可以凭空印更多的钱,比耶伦和鲍威尔加起来还多,然后用来买快克可卡因等。

这带来了安全风险:正是因为这个原因,服务器“加密”了cookie上的信息,所以如果你篡改了它,银行就会知道——他们可以在你的身份证上写各种信息,下次你试图来银行时把你锁在外面。杰罗姆·鲍威尔试图改变银行余额,而且非常狡猾,这是银行对他的身份证所做的:

 Name: Jerome Powell
 Status: ID Card tampered - changed bank balance by fraudulent printing.
 Trust: Do not trust. 
 Judgment: Escort from building. 
 Outcome: guilty of theft / fraud.

以上不是严格意义上的,其术语完全准确,大意是用类比来解释概念。

由于HTTP是无状态的,为了将请求与任何其他请求相关联,您需要一种方法来在HTTP请求之间存储用户数据。

cookie或URL参数(例如http://example.com/myPage?asd=lol&boo=no)都是在两个或多个请求之间传输数据的合适方式。 然而,如果你不想让数据在客户端可读/可编辑,它们就不太好了。

解决方案是将数据存储在服务器端,给它一个“id”,并让客户端只知道(并在每个http请求时返回)这个id。好了,实现了会话。或者您可以使用客户端作为方便的远程存储,但您将加密数据并保留服务器端的秘密。

当然,还有其他方面需要考虑,比如你不希望人们劫持其他人的会话,你希望会话不是永远持续,而是过期,等等。

在您的特定示例中,用户id(可以是用户名或用户数据库中的另一个唯一id)在成功识别后存储在服务器端的会话数据中。然后,对于您从客户端获得的每个HTTP请求,会话id(由客户端给出)将指向包含经过身份验证的用户id的正确会话数据(由服务器存储)—这样您的代码将知道它正在与哪个用户对话。