ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

我在这里变得很困惑。需要帮忙。

“它是否将数据作为字典存储在服务器上,其中键是会话 ID,而用户名、电子邮件等详细信息是值?” ...是的。 'dict' 可能是一个关系数据库,但这基本上就是它的工作原理。
我也想了解网络会话,现在我明白了。如果有任何帮助,我最终编写了自己的 wiki:machinesaredigging.com/2013/10/29/how-does-a-web-session-work
万一你不知道:在客户端存储密码是不安全的,即使密码是经过哈希处理的(实际上并没有什么区别。Cracker 可以通过创建假 cookie 直接输入哈希密码)是存储登录状态的更好方法。
我使用协议级别详细信息编写了自己的 - bitspedia.com/2012/05/…

u
unicorn2

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

Cookie 或 URL 参数(例如 http://example.com/myPage?asd=lol&boo=no )都是在 2 个或多个请求之间传输数据的合适方式。但是,如果您不希望该数据在客户端可读/可编辑,则它们并不好。

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

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

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


“您不希望在客户端维护该数据”。为什么不?如果您使用强密码术,您可以让客户端保留加密并存储在 cookie 中的会话数据。这极大地简化了向多个节点的扩展,因为服务器不需要“记住”任何东西。
@MattHarrison 在不“记住任何东西”服务器端的情况下如何解密数据?无论如何,我试图在我的回答中扩展这个主题。
@MattHarrison 请记住,在用户端存储大量数据会增加您的流量。
如果第三方可以拦截用户的会话密钥,他们就不能充当用户吗?假设该站点不使用 HTTPS,即使密钥已加密,第三方似乎也可以使用会话密钥伪装成用户。服务器只会解密它。
@ user137717 是的,如果您允许对会话的访问字面意思是“每个提供正确会话ID 的人”,那么这是一种可能性。您可以设置许多限制,最简单和最常见的一种是将客户端 IP 存储在会话中:如果来自另一个 IP 的客户端提供相同的会话 ID,则将其标记为伪造并删除会话。
B
BenKoshy

图片说明:

https://i.stack.imgur.com/mYLGr.png

类推简单

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

这家银行是一种有趣的银行——为了争论,这里是事情的运作方式:

您排队(或在线)等待并与柜员交谈:您提出取款请求,然后您必须在沙发上稍等片刻,20分钟后您必须去实际取款出纳员。

但是,除了其他人之外,出纳员会如何告诉你呢?

出纳员看不到或轻易认出你,记住,因为灯全灭了。如果您的出纳员将您的 10,000 美元提款给了其他人 - 错误的人怎么办?!出纳员能够认出您是提款的人,这一点绝对至关重要,这样您才能获得您要求的资金(或资源)。

解决方案:

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

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

没有其他人知道秘密密码。

我如何提取现金的示例:

所以我决定去放松 20 分钟,然后我去找柜员说“我想取款”

出纳员问我:“你是谁??!”

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

“证明给我看!”

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

“当然是班克斯先生!”

这基本上就是会话的工作方式。它允许一个人在数百万人的海洋中被唯一识别。每次与出纳员打交道时,您都需要表明自己的身份。

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


喜欢这个解释 - 在你的类比中,你将如何防止其他人窃听并听到出纳员告诉你的秘密密码?换句话说,如果 session_id 被盗,是否有人可以模仿您的凭据?
可爱的例子!将与渴望学习的热心人分享!
在您的类比中,GNASHEU329 是用户密码,它会生成一个在特定时间到期的身份验证令牌;然后班克斯先生可以使用身份验证令牌进行多次连续提款,而无需反复向出纳员提供密码?
在这个类比中,什么是 cookie,什么是会话/它们有什么不同?另外,如果会话关闭,重新打开时如何获取新信息?感谢:D
@BKSpureon 这确实有道理,我还有一个问题。因此,会话确实关闭了,但是在您的计算机或 Web 服务器中有一些信息,其中包含您创建新会话时的信息,并且可以使用会话 ID 访问它(会话 ID 是否始终相同?) , 那正确吗?只是想确保我理解正确。
T
Tim Rourke

“会话”是用来指代用户浏览网站的时间的术语。它表示从他们第一次到达网站页面到他们停止使用该网站的时间。在实践中,不可能知道用户何时完成了网站。在大多数服务器中,除非同一用户请求另一个页面,否则会自动结束会话的超时。

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

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

希望有帮助。


我知道在我使用的 IIS 服务器上,我可以从 USER_NAME 标头中获取用户名,但这可能是特定于 IIS 的。
REFERRER 在这里是什么意思?
@Gab是好人REFERRER通常表示客户端在“Referer”HTTP请求标头中发送的任意字符串。它应该包含资源的 URL,您知道,该资源将客户端引用到当前资源。
谢谢,它应该,所以不一定。所以我认为人们经常使用与 RFC 中建议的语义不同的标头,对吧?
首先你写了 Like cookies, this usually doesn't get sent in the URL anymore,然后是 Session variables are like cookies - they're name-value pairs sent along with a request for a page。究竟会发生什么?下次您提出任何请求时会发送吗?
n
nbro

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

因此出现了cookie,一旦客户端第一次连接到服务器,服务器就会生成一个新的会话ID,稍后将作为cookie值发送给客户端。从现在开始,这个会话 id 将识别该客户端连接,因为在每个 HTTP 请求中,它都会在 cookie 中看到适当的会话 id。

现在对于每个 session id,服务端都保存了一些数据结构,这使得他可以存储特定于用户的数据,这个数据结构你可以抽象地调用 session.


您能否对此进行更多说明-“现在,对于每个会话 id,服务器都保留了一些数据结构,这使他能够存储特定于用户的数据,您可以抽象地调用该数据结构会话。”?服务器存储了哪些特定的客户端信息?
您能否对此进行更多说明-“现在,对于每个会话 id,服务器都保留了一些数据结构,这使他能够存储特定于用户的数据,您可以抽象地调用该数据结构会话。”?服务器存储了哪些特定的客户端信息?
和上面一样的问题,如果你回答会很有帮助。
L
Luv33preet

将 HTTP 想象成一个人(A),他有短期记忆损失,一旦那个人离开视线,就会忘记每个人。

现在,为了记住不同的人,A 为那个人拍了一张照片并保存下来。每个人的照片都有一个 ID 号。当那个人再次出现时,那个人告诉A它的ID号,A通过ID号找到他们的照片。瞧!!,A知道那个人是谁。

HTTP 也是如此。它正在遭受短期记忆损失。它使用 Sessions 记录您在使用网站时所做的一切,然后,当您再次访问时,它会借助 Cookies 识别您(Cookie 就像一个令牌)。图片是这里的Session,ID是这里的Cookie。


T
Tenzin Chemi

Session 是广义的技术术语,可用于指代使用内存缓存存储在服务器端或使用 cookielocal storagesession storage 存储在客户端的状态。

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

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

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

这就是为什么保护会话 ID 不被黑客截获也很重要,黑客将使用它来将自己标识为另一个用户。

通过阅读 Cookie,您将了解会话:(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