会话是什么?它们是如何工作的?

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

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

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

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

217271 次浏览

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

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

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

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

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

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

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

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

“会话”指的是用户浏览网站的时间。这意味着从他们第一次到达网站的一个页面到他们停止使用网站之间的时间。实际上,不可能知道用户什么时候用完站点。在大多数服务器中,会有一个超时自动结束会话,除非同一用户请求另一个页面。

用户第一次连接某种类型的会话ID被创建(如何完成取决于web服务器软件和你在网站上使用的身份验证/登录类型)。 像cookie一样,这个通常不会在URL中发送,因为这是一个安全问题。相反,它与一堆其他东西一起存储,这些东西也统称为会话。会话变量类似于cookie——它们是随页面请求一起发送的名称-值对,并随页面从服务器返回——但它们的名称是在web标准中定义的

一些会话变量作为HTTP头信息传递。它们在每个页面浏览的幕后来回传递,因此它们不会显示在浏览器中,并告诉每个人一些可能是私有的东西。其中包括USER_AGENT(请求页面的浏览器类型)、REFERRER(链接到被请求页面的页面)等。一些web服务器软件会添加自己的标头或传输特定于服务器软件的附加会话数据。但是标准的方法有很好的记录。

希望这能有所帮助。

explain via Pictures:

.

Sessions explained via Picture

Simple - Explanation by analogy

.

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

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

  1. 你排队(或在网上)等候,然后和柜员交谈:你提出取钱的要求,然后
  2. 你必须在沙发上等一会儿,20分钟后
  3. 你必须亲自去柜员那里取钱。

但是柜员怎么把你和其他人区分开来呢?< / h3 >

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

解决方案:

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

“每当你跟我说话,”;柜员说,“你应该先证明自己是GNASHEU329,这样我就知道是你了。”

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

提现示例:

. bq83

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

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

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

“证明它!“

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

“当然,班克斯先生!”

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

如果你有任何问题或不清楚,请发表评论,我会尽力为你澄清。以下内容并非严格意义上的,其术语完全准确,但我希望它对您理解概念有所帮助。

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

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

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

Session是一个广泛的技术术语,它可以用来指存储在服务器端使用内存缓存或存储在客户端使用cookielocal storagesession storage的状态。

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

如何存储和共享是另一个主题。但简单来说就是当用户登录时,服务器会创建会话数据并生成会话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