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