seegongsik
网络

什么是会话和 Cookie

前面说过,HTTP 不记得以前的请求,所以每次请求都把我们当成第一次见面的客人。可是在网店登录一次,登录状态就能保持很长时间。每次都会忘的服务器,怎么能一直认出我呢?秘密就在一张小小的通行证上。

01

健忘的服务器,本该失效的登录

HTTP 服务器处理完一个请求,就把我们忘得干干净净。所以下一个请求来了,它又把我们当成第一次见面的客人。
这里就有个怪事。明明只登录了一次,为什么换了好几个页面,登录状态还在?要是服务器真的每次都忘,那每打开一个页面,都得重新输入用户名和密码才对。

我健忘的服务器登录失效了
按按钮去访问服务器

点一下访问按钮。健忘的服务器每次都会忘,所以每次访问登录都会失效,得重新登录。

你也看到了,这样太不方便了。每开一个页面就得登录一次,谁都会很快累垮。
可是也不能让服务器记住每位客人的长相。请求上没有脸,客人又多得数不清。所以要用一个巧办法:服务器不去记,而是塞给每位客人一张小票。

02

服务器发一张小通行证

客人第一次来时,服务器会在响应里附上一张小票。这张票叫 Cookie,由浏览器收下保存。票上写着一个号码,比如“您是 7 号客人”。
想想游乐园入口给你戴上的手环就好懂了。真正的号码是一长串随机字符,别人猜不出来。服务器只要把这个号码和客人的信息配对记好,就不必靠长相去记无数客人。

现在客人手里有了一张写着号码的通行证。服务器把这个号码和这位客人连起来,记在自己的名单上。购物车里放了什么、有没有登录,这些信息也记在同一行。
关键在于,通行证是客人自己带着走的。不是服务器什么都记,而是客人管好自己的号码。那么,这张通行证该在什么时候拿出来给人看呢?

03

每次请求都出示通行证

浏览器把收到的通行证收好,每次向同一个网站发请求,都会自动一起递上去,就像在说“我是 7 号客人”。用浏览器的人什么都不用做。
这就像在每张请求单的一角写上号码,所以服务器只看请求,就能一下子知道是谁发的。通行证上还写着有效期,过了期,浏览器就不再出示它了。

我服务器
第 1 次请求
通行证 7 号
第 2 次请求
通行证 7 号
第 3 次请求
通行证 7 号
按访问按钮,把请求和通行证一起发出

点一下访问按钮。客人每次都把通行证号码和请求一起递上去。

现在客人每次请求都会附上同一个号码。从服务器这边看,每来一个请求,就跟着来一个号码。
服务器还是记不住客人,可号码跟着请求一起来,也就没问题了。那么,服务器拿到号码后做什么呢?只要和自己记下的名单对一对就行。

04

“啊,是那个人!”

通行证号码一到,服务器就翻开记下的名单,找一找“7 号是谁来着”。在名单上找到 7 号,就认出来了:“啊,是那个人!”购物车和登录状态都原样留在那一行。
像这样跨越多次请求,持续记住是同一位客人,就叫会话。有了会话,换页面登录状态也不会丢。按下退出登录,服务器就从名单上删掉那一行,通行证也就没用了。

到达的通行证
服务器名单
3 号客人
7 号客人
12 号客人
点一下到达的通行证号码,在名单里找它

点一下送到的通行证号码。服务器在名单上找到它,认出“啊,是那个人!”,让登录继续有效。

本来是个健忘的服务器,现在却能一眼认出我们。诀窍不在于服务器记住了什么,而在于客人带着通行证。服务器只要拿号码和名单对一对,客人再多也能轻松应付。
不过有一点要小心:只要号码对得上,谁都能以那位客人的身份通过。要是有人在半路偷看或偷走了别人的通行证号码,会怎么样呢?

05

小结

用一句话概括:HTTP 不记得以前的请求,每次都把我们当成第一次见面的客人。于是服务器给新来的客人一张写着号码的小通行证,也就是 Cookie。
浏览器每次请求都带上这张通行证,服务器把号码和名单对上,就认出“啊,是那个人!”。像这样持续记住是同一位客人,就是会话。记的事交给客人的通行证,服务器只管对号码。

1. HTTP 健忘,每次都当第一次来的客人
2. 服务器发通行证(Cookie)
3. 每次来访都出示通行证
4. 靠号码认出 = 会话
按按钮,依次回顾要点

依次点要点回顾一下。(健忘是问题 → 发通行证(Cookie) → 每次访问都出示 → 啊,是那个人!(会话))

现在你知道服务器是怎么重新认出我们的了。不过,服务器核对的只有通行证号码,拿着号码的人是不是真的是你,它并不知道。
所以号码要是在半路被别人看到,就麻烦了。下一课讲 HTTPS:给来往的数据上锁,让人没法在半路偷看。至于用密码确认是不是本人,会在安全领域详细讲。

一句话总结HTTP 不记得以前的请求,所以每次请求都把我们当成第一次见面的客人。放着不管,每打开一个页面,登录都该失效一次。解决这个问题的就是 Cookie 和会话。第一次来时,服务器交给你一张写着号码的小通行证(Cookie),之后浏览器每次请求都带上它。服务器把通行证上的号码和名单对上,认出“啊,是那个人!”。像这样持续记住是同一位客人,就是会话,有了它就不用每次重新登录。不过服务器看的只是号码,所以保护好这个号码很重要。
← 网络
如果有帮助,请支持我们