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

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

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

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


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

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

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

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

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

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

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

在您的特定示例中,用户id(可以是用户名或用户数据库中的另一个唯一id)在成功识别后存储在服务器端的会话数据中。然后,对于您从客户端获得的每个HTTP请求,会话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.

希望这能有所帮助。

图片讲解:

你可以把会话想象成图书馆的身份证。每次你去图书馆的时候,你都要给他们看你的身份证,你的身份证是那个图书馆签发的。

简单类比解释

想象一下,你在一家银行,试图从你的账户中取出一些钱。但是天很黑;银行一片漆黑,没有灯光。你被另外20个人包围着。他们看起来都一样。每个人的声音都是一样的。每个人都是潜在的坏人。换句话说,HTTP是无状态的。

这家银行是一种有趣的银行类型——为了便于讨论,以下是事情的运作方式:

你跟你的出纳员说,要求取钱,然后 你必须在沙发上等一会儿,20分钟后 你从出纳员那里取钱。

但是出纳员如何把你和其他人区分开来呢?

记住,出纳员看不见你,也认不出你,因为灯都灭了。

如果你的出纳员把你的1万美元提现给了别人——一个错误的人怎么办?让柜员认出你是取款的人是至关重要的,这样你就能拿到你想要的钱(或资源)。

解决方案:

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

“当你和我说话的时候,”出纳员说,“你应该首先表明自己是GNASHEU329,这样我就知道是你了。”

没有人知道这个秘密密码。

我提取现金的例子:

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

柜员问我:“你是谁??!”

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

“证明!”

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

“当然可以,班克斯先生!”

这基本上就是会话的工作方式。它可以让一个人在数百万人的海洋中被唯一地识别出来。每次和出纳员打交道时,你都需要说明自己的身份。

Sessions和cookie的区别

会话:在上面的例子中,您可以将会话看作临时密码。一旦银行(即服务器)看到密码-他们将能够识别你是谁,你想要什么等等。

Cookie:你可以把Cookie简单地想象成一张纸~~身份证~~上面印着信息。每次你去银行的时候,你都要出示你在那个发卡行的身份证。

你可以在那张卡上存储任何东西,比如:

姓名/年龄/性别/婚姻状况 密码

银行可以把信息写到你的身份证上,你也可以。但这可能很危险:

下面是我的ID card / cookie:

name: Ben Koshy
sex: male
bank balance: $1.99.

这糟透了。但如果我想偷偷摸摸,我可以编辑我的身份证:

bank balance: $1 billion bucks.

万岁!我可以凭空印更多的钱,比耶伦和鲍威尔加起来还多,然后用来买快克可卡因等。

这带来了安全风险:正是因为这个原因,服务器“加密”了cookie上的信息,所以如果你篡改了它,银行就会知道——他们可以在你的身份证上写各种信息,下次你试图来银行时把你锁在外面。杰罗姆·鲍威尔试图改变银行余额,而且非常狡猾,这是银行对他的身份证所做的:

 Name: Jerome Powell
 Status: ID Card tampered - changed bank balance by fraudulent printing.
 Trust: Do not trust. 
 Judgment: Escort from building. 
 Outcome: guilty of theft / fraud.

以上不是严格意义上的,其术语完全准确,大意是用类比来解释概念。

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

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

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

会话是一个广泛的技术术语,它可以用来指存储在服务器端使用内存缓存或存储在客户端使用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