我刚刚开始学习使用 python 进行 Web 应用程序开发。我遇到了“cookies”和“会话”这两个术语。我理解 cookie,因为它们将一些信息存储在浏览器的键值对中。但是我对会话有点困惑,在会话中,我们也将数据存储在用户浏览器的 cookie 中。
例如 - 我使用 username='rasmus'
和 password='default'
登录。在这种情况下,数据将被发布到服务器,如果经过身份验证,该服务器应该检查并登录我。然而,在整个过程中,服务器还会生成一个会话 ID,该 ID 将存储在我浏览器的 cookie 中。现在服务器还将这个会话 ID 存储在它的文件系统或数据存储中。
但是仅基于会话 ID,它如何能够在我随后遍历该站点时知道我的用户名?它是否将数据作为字典存储在服务器上,其中键是会话 ID,username
、email
等详细信息是值?
我在这里变得很困惑。需要帮忙。
因为 HTTP 是无状态的,为了将请求与任何其他请求相关联,您需要一种在 HTTP 请求之间存储用户数据的方法。
Cookie 或 URL 参数(例如 http://example.com/myPage?asd=lol&boo=no )都是在 2 个或多个请求之间传输数据的合适方式。但是,如果您不希望该数据在客户端可读/可编辑,则它们并不好。
解决方案是存储该数据服务器端,给它一个“id”,并让客户端只知道(并在每个 http 请求时传回)该 id。好了,会话实施了。或者您可以将客户端用作方便的远程存储,但您会加密数据并在服务器端保留秘密。
当然还有其他方面需要考虑,比如你不希望人们劫持其他人的会话,你希望会话不是永远持续而是过期等等。
在您的具体示例中,用户 ID(可以是用户名或用户数据库中的另一个唯一 ID)在成功识别后存储在服务器端的会话数据中。然后,对于您从客户端获得的每个 HTTP 请求,会话 ID(由客户端提供)将指向包含经过身份验证的用户 ID 的正确会话数据(由服务器存储) - 这样您的代码就会知道它是哪个用户正在说话。
图片说明:
https://i.stack.imgur.com/mYLGr.png
类推简单
想象一下,你在一家银行,试图从你的账户中取出一些钱。但是天很黑;银行一片漆黑:没有光,你看不到你的手在你面前。你被另外 20 个人包围。它们看起来都一样。每个人都有相同的声音。每个人都是潜在的坏人。换句话说,HTTP 是无状态的。
这家银行是一种有趣的银行——为了争论,这里是事情的运作方式:
您排队(或在线)等待并与柜员交谈:您提出取款请求,然后您必须在沙发上稍等片刻,20分钟后您必须去实际取款出纳员。
但是,除了其他人之外,出纳员会如何告诉你呢?
出纳员看不到或轻易认出你,记住,因为灯全灭了。如果您的出纳员将您的 10,000 美元提款给了其他人 - 错误的人怎么办?!出纳员能够认出您是提款的人,这一点绝对至关重要,这样您才能获得您要求的资金(或资源)。
解决方案:
当您第一次出现在出纳员面前时,他或她会秘密告诉您一些事情:
“当你和我说话时,”出纳员说,“你应该首先表明自己是 GNASHEU329——这样我就知道是你了”。
没有其他人知道秘密密码。
我如何提取现金的示例:
所以我决定去放松 20 分钟,然后我去找柜员说“我想取款”
出纳员问我:“你是谁??!”
“是我,乔治班克斯先生!”
“证明给我看!”
然后我告诉他们我的密码:GNASHEU329
“当然是班克斯先生!”
这基本上就是会话的工作方式。它允许一个人在数百万人的海洋中被唯一识别。每次与出纳员打交道时,您都需要表明自己的身份。
如果您有任何问题或不清楚 - 请发表评论,我会尽力为您解决。以下内容并不严格,术语完全准确,但希望对您理解概念有所帮助。
GNASHEU329
是用户密码,它会生成一个在特定时间到期的身份验证令牌;然后班克斯先生可以使用身份验证令牌进行多次连续提款,而无需反复向出纳员提供密码?
“会话”是用来指代用户浏览网站的时间的术语。它表示从他们第一次到达网站页面到他们停止使用该网站的时间。在实践中,不可能知道用户何时完成了网站。在大多数服务器中,除非同一用户请求另一个页面,否则会自动结束会话的超时。
用户第一次连接时会创建某种会话 ID(其完成方式取决于 Web 服务器软件和您在网站上使用的身份验证/登录类型)。与 cookie 一样,这通常不会再通过 URL 发送,因为这是一个安全问题。相反,它与一堆其他东西一起存储,这些东西统称为会话。会话变量就像 cookie - 它们是与页面请求一起发送的名称-值对,并随页面从服务器返回 - 但它们的名称是在 Web 标准中定义的。
一些会话变量作为 HTTP headers 传递。它们在每个页面浏览的幕后来回传递,因此它们不会出现在浏览器中并告诉每个人一些可能是私人的东西。其中包括 USER_AGENT 或请求页面的浏览器类型、REFERRER 或链接到被请求页面的页面等。一些 Web 服务器软件添加自己的标题或传输特定于服务器软件的附加会话数据。但是标准的有很好的记录。
希望有帮助。
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
。究竟会发生什么?下次您提出任何请求时会发送吗?
HTTP是无状态连接协议,即服务器无法区分不同用户的不同连接。
因此出现了cookie,一旦客户端第一次连接到服务器,服务器就会生成一个新的会话ID,稍后将作为cookie值发送给客户端。从现在开始,这个会话 id 将识别该客户端连接,因为在每个 HTTP 请求中,它都会在 cookie 中看到适当的会话 id。
现在对于每个 session id,服务端都保存了一些数据结构,这使得他可以存储特定于用户的数据,这个数据结构你可以抽象地调用 session.
将 HTTP 想象成一个人(A),他有短期记忆损失,一旦那个人离开视线,就会忘记每个人。
现在,为了记住不同的人,A 为那个人拍了一张照片并保存下来。每个人的照片都有一个 ID 号。当那个人再次出现时,那个人告诉A它的ID号,A通过ID号找到他们的照片。瞧!!,A知道那个人是谁。
HTTP 也是如此。它正在遭受短期记忆损失。它使用 Sessions 记录您在使用网站时所做的一切,然后,当您再次访问时,它会借助 Cookies 识别您(Cookie 就像一个令牌)。图片是这里的Session,ID是这里的Cookie。
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
不定期副业成功案例分享