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

例如,我使用用户名='rasmus'和密码='default'登录。在这种情况下,数据将被发布到服务器,它应该检查和登录我,如果认证。然而,在整个过程中,服务器也会生成一个会话ID,它将存储在浏览器的cookie中。现在,服务器还将这个会话ID存储在其文件系统或数据存储中。

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

我有点困惑了。需要帮助。


当前回答

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

于是就有了cookie,当客户端第一次连接到服务器时,服务器会生成一个新的会话id,这个会话id随后会作为cookie值发送给客户端。从现在开始,这个会话id将标识该客户端连接,因为在每个HTTP请求中,它将在cookie中看到相应的会话id。

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

其他回答

“会话”指的是用户浏览网站的时间。这意味着从他们第一次到达网站的一个页面到他们停止使用网站之间的时间。实际上,不可能知道用户什么时候用完站点。在大多数服务器中,会有一个超时自动结束会话,除非同一用户请求另一个页面。

The first time a user connects some kind of session ID is created (how it's done depends on the web server software and the type of authentication/login you're using on the site). Like cookies, this usually doesn't get sent in the URL anymore because it's a security problem. Instead it's stored along with a bunch of other stuff that collectively is also referred to as the session. Session variables are like cookies - they're name-value pairs sent along with a request for a page, and returned with the page from the server - but their names are defined in a web standard.

Some session variables are passed as HTTP headers. They're passed back and forth behind the scenes of every page browse so they don't show up in the browser and tell everybody something that may be private. Among them are the USER_AGENT, or type of browser requesting the page, the REFERRER or the page that linked to the page being requested, etc. Some web server software adds their own headers or transfer additional session data specific to the server software. But the standard ones are pretty well documented.

希望这能有所帮助。

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

cookie或URL参数(例如http://example.com/myPage?asd=lol&boo=no)都是在两个或多个请求之间传输数据的合适方式。 然而,如果你不想让数据在客户端可读/可编辑,它们就不太好了。

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

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

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

会话是一个广泛的技术术语,它可以用来指存储在服务器端使用内存缓存或存储在客户端使用cookie、本地存储或会话存储的状态。

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

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

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

这就是为什么保护会话ID不被黑客拦截的原因,黑客会用它来识别自己是另一个用户。

通过阅读Cookie,您将获得session的概念:(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

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

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

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

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

于是就有了cookie,当客户端第一次连接到服务器时,服务器会生成一个新的会话id,这个会话id随后会作为cookie值发送给客户端。从现在开始,这个会话id将标识该客户端连接,因为在每个HTTP请求中,它将在cookie中看到相应的会话id。

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