什么是会话和 Cookie
前面说过,HTTP 不记得以前的请求,所以每次请求都把我们当成第一次见面的客人。可是在网店登录一次,登录状态就能保持很长时间。每次都会忘的服务器,怎么能一直认出我呢?秘密就在一张小小的通行证上。
健忘的服务器,本该失效的登录
HTTP 服务器处理完一个请求,就把我们忘得干干净净。所以下一个请求来了,它又把我们当成第一次见面的客人。
这里就有个怪事。明明只登录了一次,为什么换了好几个页面,登录状态还在?要是服务器真的每次都忘,那每打开一个页面,都得重新输入用户名和密码才对。
点一下访问按钮。健忘的服务器每次都会忘,所以每次访问登录都会失效,得重新登录。
你也看到了,这样太不方便了。每开一个页面就得登录一次,谁都会很快累垮。
可是也不能让服务器记住每位客人的长相。请求上没有脸,客人又多得数不清。所以要用一个巧办法:服务器不去记,而是塞给每位客人一张小票。
服务器发一张小通行证
客人第一次来时,服务器会在响应里附上一张小票。这张票叫 Cookie,由浏览器收下保存。票上写着一个号码,比如“您是 7 号客人”。
想想游乐园入口给你戴上的手环就好懂了。真正的号码是一长串随机字符,别人猜不出来。服务器只要把这个号码和客人的信息配对记好,就不必靠长相去记无数客人。
现在客人手里有了一张写着号码的通行证。服务器把这个号码和这位客人连起来,记在自己的名单上。购物车里放了什么、有没有登录,这些信息也记在同一行。
关键在于,通行证是客人自己带着走的。不是服务器什么都记,而是客人管好自己的号码。那么,这张通行证该在什么时候拿出来给人看呢?
每次请求都出示通行证
浏览器把收到的通行证收好,每次向同一个网站发请求,都会自动一起递上去,就像在说“我是 7 号客人”。用浏览器的人什么都不用做。
这就像在每张请求单的一角写上号码,所以服务器只看请求,就能一下子知道是谁发的。通行证上还写着有效期,过了期,浏览器就不再出示它了。
点一下访问按钮。客人每次都把通行证号码和请求一起递上去。
现在客人每次请求都会附上同一个号码。从服务器这边看,每来一个请求,就跟着来一个号码。
服务器还是记不住客人,可号码跟着请求一起来,也就没问题了。那么,服务器拿到号码后做什么呢?只要和自己记下的名单对一对就行。
“啊,是那个人!”
通行证号码一到,服务器就翻开记下的名单,找一找“7 号是谁来着”。在名单上找到 7 号,就认出来了:“啊,是那个人!”购物车和登录状态都原样留在那一行。
像这样跨越多次请求,持续记住是同一位客人,就叫会话。有了会话,换页面登录状态也不会丢。按下退出登录,服务器就从名单上删掉那一行,通行证也就没用了。
点一下送到的通行证号码。服务器在名单上找到它,认出“啊,是那个人!”,让登录继续有效。
本来是个健忘的服务器,现在却能一眼认出我们。诀窍不在于服务器记住了什么,而在于客人带着通行证。服务器只要拿号码和名单对一对,客人再多也能轻松应付。
不过有一点要小心:只要号码对得上,谁都能以那位客人的身份通过。要是有人在半路偷看或偷走了别人的通行证号码,会怎么样呢?
小结
用一句话概括:HTTP 不记得以前的请求,每次都把我们当成第一次见面的客人。于是服务器给新来的客人一张写着号码的小通行证,也就是 Cookie。
浏览器每次请求都带上这张通行证,服务器把号码和名单对上,就认出“啊,是那个人!”。像这样持续记住是同一位客人,就是会话。记的事交给客人的通行证,服务器只管对号码。
依次点要点回顾一下。(健忘是问题 → 发通行证(Cookie) → 每次访问都出示 → 啊,是那个人!(会话))
现在你知道服务器是怎么重新认出我们的了。不过,服务器核对的只有通行证号码,拿着号码的人是不是真的是你,它并不知道。
所以号码要是在半路被别人看到,就麻烦了。下一课讲 HTTPS:给来往的数据上锁,让人没法在半路偷看。至于用密码确认是不是本人,会在安全领域详细讲。