什么是会议?它们如何运作?


332

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

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

但是,仅根据会话ID,在以后遍历网站时如何知道我的用户名?它是否将数据存储在服务器作为一个字典,其中的关键将是一个会话ID和细节像usernameemail等是值是多少?

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


9
“它是否将数据存储在服务器上作为字典,其中密钥将是会话ID,而用户名,电子邮件等详细信息将是值?” ...是。“ dict”可能是一个关系数据库,但这基本上就是它的工作方式。
bobince 2010年

14
我也想了解网络会话,现在我了解了。如果有什么帮助,我最终写了自己的Wiki:machinesaredigging.com/2013/10/29/how-does-a-web-session-work
eloone 2013年

如果您不知道:即使对密码进行了哈希处理,在客户端存储密码也是不安全的(实际上,这没有什么区别。Cracker可以通过创建伪造的cookie直接输入经过哈希处理的密码)是存储登录状态的更好方法。
cytsunny 2014年

1
我写我自己使用的协议层次的细节- bitspedia.com/2012/05/...
阿西夫沙赫扎德

Answers:


400

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

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

解决方案是存储该数据服务器端,给它一个“ id”,然后让客户端仅知道该ID(并在每个http请求传回)。到这里,会议已实施。或者,您可以将客户端用作方便的远程存储,但是您将对数据进行加密并保留秘密的服务器端。

当然,还有其他方面需要考虑,例如您不希望人们劫持他人的会话,您希望会话不会永远持续下去而是要终止,等等。

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


3
“您不希望该数据在客户端维护”。为什么不?如果您使用强大的加密技术,则可以让客户端保留加密并存储在cookie中的会话数据。由于服务器不需要“记住”任何内容,因此极大地简化了扩展到多个节点的过程。
马特·哈里森

5
@MattHarrison您如何在不“记住任何内容”服务器端的情况下解密数据?无论如何,我都试图在我的答案中扩展这个主题。
Luke404'2

2
@MattHarrison请记住,在用户端存储大量数据将增加您的访问量。
尼塔斯2015年

5
如果第三方可以拦截用户的会话密钥,那么第三方是否可以充当用户?假设该站点未使用HTTPS,即使该密钥已加密,似乎第三方也可能伪装成具有会话密钥的用户。服务器只会解密它。
user137717

2
@ user137717是的,如果您允许访问会话的字面意思是“每个提供正确会话ID的用户”,则有可能。您可以设置许多限制,最简单也是最常见的限制之一就是将客户端IP存储在会话中:如果来自另一个ip的客户端显示相同的会话ID,则您会将其标记为伪造并删除会话。
Luke404

110

类推简单解释

假设您在一家银行,试图从您的帐户中取出一些钱。但是天黑了。银行是黑色的:没有光,你看不到你的手在你的面前。您周围还有另外20个人。它们看起来都一样。每个人都有相同的声音。每个人都是潜在的坏人。换句话说,HTTP是无状态的。

这家银行是一种很有趣的银行-为了争辩,这是事情的运作方式:

  1. 您排队(或在线)等待,然后与柜员交谈:您提出提款要求,然后
  2. 您必须在沙发上稍等片刻,然后20分钟后
  3. 您必须去实际从出纳员那里收钱。

但是出纳员会如何告诉您与众不同的地方?

记住,出纳员看不见您或很容易认出您,因为灯光都熄灭了。如果您的出纳员将您的$ 10,000提款给其他人-错误的人呢?柜员必须将您识别为进行提款的人,这一点绝对至关重要,这样您才能获得所需的钱(或资源)。

解:

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

柜员说:“无论何时,我都在和我说话,您应该首先将自己标识为GNASHEU329-这样我就知道是您”。

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

我如何提取现金的示例:

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

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

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

“证明给我看!”

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

“当然是班克斯先生!”

这基本上就是会话的工作方式。它使一个人可以在数百万人的海洋中被唯一标识。每次与柜员打交道时,您都需要证明自己的身份。

如果您有任何疑问或不清楚-请发表评论,我会尽力为您解决。

图片说明:

通过图片解释的会话


9
喜欢这个解释-打个比方,您如何防止其他人窃听他人的电话,并听到柜员告诉您的秘密密码?换句话说,如果session_id被盗,有人无法模仿您的凭据吗?
wmock

@wmock会话劫持肯定是一个问题:检查一下!owasp.org/index.php/Session_hijacking_attack
BKSpurgeon

2
可爱的例子!它应该与渴望学习的人分享!
维克多

以此类推,GNASHEU329是用户密码,它会生成一个身份验证令牌,该令牌将一直过期直到某个时间;然后,班克斯先生可以使用auth令牌连续进行几次提款,而不必重复给出纳员输入密码?
丹尼尔·利兹克(5

@DanielLizik你很清楚。了解概念!但是我对基于令牌的工作流知识不足,无法为您提供明智的答案。一般原则是服务器需要能够以某种方式识别谁是发出请求的人。
BKSpurgeon

39

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

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

一些会话变量作为HTTP标头传递。它们是在每次浏览页面的背后来回传递的,因此它们不会出现在浏览器中并告诉所有人可能是私有的信息。其中包括USER_AGENT或请求页面的浏览器类型,REFERRER或链接到所请求页面的页面等。某些Web服务器软件添加其自己的标头或传输服务器软件特定的其他会话数据。但是标准的文件已被很好地记录下来。

希望能有所帮助。


我知道在使用的IIS服务器上,可以从USER_NAME标头获取用户名,但这可能是特定于IIS的。
蒂姆·洛克

REFERRER在这里是什么意思?
Gab是好人2015年

@Gab是好人REFERRER通常表示客户端在“ Referer” HTTP请求标头中发送的任意字符串。它应该包含将客户端引至当前资源的资源的URL。
Luke404

谢谢,应该,所以不一定。所以我认为人们经常使用此标头与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。到底会发生什么?下次发出请求时会发送吗?
毕马威

19

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

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

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


1
您是否可以对此进行更多说明-“现在,对于每个会话ID,服务器都会保留一些数据结构,这使他可以存储特定于用户的数据,您可以抽象地调用会话。” 服务器存储哪些特定的客户端信息?
realPK 2014年

您是否可以对此进行更多说明-“现在,对于每个会话ID,服务器都会保留一些数据结构,这使他可以存储特定于用户的数据,您可以抽象地调用会话。” 服务器存储哪些特定的客户端信息?
加布是好人2015年

与上述问题相同,如果您回答,将会很有帮助。
Suraj Jain

4

可以将HTTP想象为一个拥有短期记忆丢失并且在每个人消失后都会忘记每个人的人(A)。

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

与HTTP相同。它正遭受短期记忆丢失。它使用Sessions记录您在使用网站时所做的一切,然后当您再次访问时,它借助Cookies来识别您的身份(Cookie就像一个令牌)。图片是会话,ID是Cookie。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.