会议是什么?他们是如何工作的?

Ras*_*mus 301 language-agnostic session

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

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

但基于会话ID,如何在我后续遍历网站时知道我的用户名?它是否将数据作为dict存储在服务器上,其中键是会话ID username,email等等细节是值?

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

Luk*_*404 368

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

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

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

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

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

  • @user137717 是的,如果您允许对会话的访问从字面上看是“每个提供正确会话 ID 的人”,那么这是一种可能性。您可以设置许多限制,最简单和最常见的一个是将客户端 IP 存储在会话中:如果来自另一个 IP 的客户端显示相同的会话 ID,您将其标记为伪造并删除会话。 (5认同)
  • @MattHarrison你如何在没有"记住任何东西"服务器端的情况下解密数据?无论如何,我试图在我的答案中扩展这个主题. (4认同)
  • @MattHarrison 请记住,在用户端存储大量数据会增加您的流量。 (3认同)
  • 如果第三方可以拦截用户的会话密钥,它是否能够充当用户?假设该站点不使用HTTPS,即使密钥已加密,似乎第三方也可以伪装成具有会话密钥的用户.服务器只会解密它. (3认同)
  • "你不希望客户端维护这些数据".为什么不?如果您使用强加密技术,您可以让客户端保持加密并存储在cookie中的会话数据.这大大简化了向多个节点的扩展,因为服务器不需要"记住"任何东西. (2认同)
  • 对于现在阅读此内容的任何人:-“可能只记得一把钥匙。但是安全性将下降……很多。” - 这是真的。可以采用一种方法,其中该密钥定期更改。这会使用户拥有的现有令牌失效,但是可以通过使用一个访问令牌(使用此密钥)和一个刷新令牌来解决。关于检测令牌盗窃,您可以使用RFC 6819中强调的旋转刷新令牌的概念。这是一篇文章,介绍了可以使用的所有不同协议:https://medium.com/@supertokens.io/ee5245e6bdad (2认同)

BKS*_*eon 76

简单的类比解释

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

这家银行是一个有趣的银行类型 - 为了争论这里的事情是如何运作的:

  1. 你排队等候(或在线)并与出纳员交谈:你提出取钱的请求,然后
  2. 你必须在沙发上等一下,20分钟后
  3. 你必须去实际上从柜员那里收钱.

但出纳员将如何区别于其他人?

请记住,出纳员无法看到或容易认出你,因为灯光全部都在外面.如果您的出纳员向其他人提供10,000美元的提款 - 错误的人怎么办?出纳员可以将您识别为退出的人,这样您就可以获得所要求的资金(或资源),这一点至关重要.

解:

当您第一次看到出纳员时,他或她会秘密告诉您一些事情:

"当你和我说话的时候,"出纳员说,"你应该首先把自己称为GNASHEU329 - 我知道这就是你".

没人知道秘密密码.

我如何撤回现金的示例:

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

出纳员问我:"你是谁?!"

"这是我,乔治班克斯先生!"

"证明给我看!"

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

"当然是班克斯先生!"

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

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

图片说明:

会议通过图片解释

  • 喜欢这个解释 - 在你的类比中,你如何防止其他人窃听,并听到出纳员告诉你的秘密密码?换句话说,如果session_id被盗,那么某人是否有可能模仿您的凭据? (7认同)
  • 可爱的例子!!它将与渴望学习的人分享! (3认同)

Tim*_*rke 36

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

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

一些会话变量作为HTTP标头传递.它们在每个页面浏览的幕后来回传递,因此它们不会显示在浏览器中并告诉每个人可能是私密的.其中包括USER_AGENT,或请求页面的浏览器类型,REFERRER或链接到所请求页面的页面等.某些Web服务器软件添加自己的标题或传输特定于服务器软件的其他会话数据.但标准的文件很好.

希望有所帮助.


Art*_*ger 19

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

因此来自cookie,一旦客户端第一次连接到服务器,服务器就会生成一个新的会话ID,稍后将以cookie值的形式发送给客户端.从现在开始,此会话ID将标识该客户端连接,因为在每个HTTP请求中,它将在cookie中看到相应的会话ID.

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

  • 您能否对此进行更多说明 - “现在对于每个会话 ID,服务器保留一些数据结构,这使他能够存储特定于用户的数据,您可以抽象地调用该数据结构会话。”?服务器存储哪些具体的客户端信息? (2认同)

Luv*_*eet 10

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

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

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


ime*_*emi 10

Session是广泛的技术术语,可用于指使用内存缓存存储在服务器端或使用cookie,local storage或存储在客户端的状态session 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
Run Code Online (Sandbox Code Playgroud)