中场休息
让我们先从比喻回到网络世界里,HTTP 是无状态的,所以每一个 Request 都是不相关的,就像是对小明来说每一位客人都是新的客人一样,他根本不知道谁是谁。
既然你没办法把他们关联,就代表状态这件事情也不存在。
把左边换成顾客,右边换成小明也依然成立。多一个得是我多打了,但我懒得修。
那怎么办呢?在故事里我们用纸条来解决这件事情,小明会在结账时写下纸条并递给客人,客人下次只要再带着纸条过来,小明就知道发生什么事了。
小纸条功不可没
小明最大的问题就是他自己没办法记忆「状态」,因此需要倚靠一个机制来帮他管理「状态」,而这个机制我们就叫做 Session。
原本对小明来说,每一个客人都是新的客人,彼此之间毫无关联,所以也没有任何状态可言。
但有了纸条以后,两个在小明眼中完全不同的客人被关联了起来,小明就可以知道:「原来这个新的客人是以前那个来买木材的客人!」
所以 Session 是什么?就是一种让 Request 变成 Stateful 的机制。以小明的例子来说,Session 就是一种让客人之间能互相关联起来的机制。
小明靠纸条来实作 Session 机制,那在网络世界中可以靠什么呢?举一个最简单的例子,网址!
让我们假设有个购物网站的网址是:market.tw,当你把苹果加入购物车的时候,你其实是送一个 Request 给服务器,然后服务器会把你导到 market.tw?
item1=apple,接着你再把火山硅肺病加入购物车,网址就会变成:market.tw?item1=apple&item2=pneumonoultramicroscopicsilicovolcanoconiosis
最后你按下结账,服务器就靠着你地址栏上的信息来判断你的状态是什么,在这个例子中就等同于看你的购物车里面有什么。
简单来说呢,地址栏上的信息就是小明故事中的纸条,是储存状态的地方。而上述例子 Client 与 Server 透过地址栏上的状态来实作 Session 机制。
好,中场休息差不多到这边要结束了。这一段是想先拉回网络的部分,从原本故事中的比喻切回真实世界网络的运作模式,以及先让大家理解 Session 到底是个什么东西。
在接下来的故事里面,小明会碰到更多更多的问题,他能迎刃而解吗?让我们继续看下去。
到底谁会随身携带纸条?
前面已经有提过了,尽管小明靠着这个纸条的机制留住了一些常客,但是新客人呢?有多少人会愿意为了再来这间店而特地留下具有状态的纸条?
基本上没有,因为这样子太麻烦了!
有天小明在快要入眠时,忽有一庞然大物拔山倒树而来,盖一灵感也。他想到了一个绝妙的 idea:「不会有人随身携带纸条,但总会随身携带手机吧!」
于是流程就变成这样子:
-
客人来店里消费,小明结账时请他拿出手机,并在手机里面留了一些信息
-
客人第二次来店里,小明看看手机里有没有之前自己留下的信息
先不用管到底小明把信息放在手机的哪里,这不是重点;重点是手机里的信息取代了以前的纸条,客人不用刻意再带一个没有用的纸条了,只需要把本来就会随身携带的手机拿出来就好,跟以前相比方便许多。
好,接下来我们终于要讲到标题的第二个东西了:Cookie。Cookie 是什么?Cookie 就是故事里面存在手机的信息。
想要知道真正使用 Cookie 的流程,你只要把上面的客人用「浏览器」来取代,小明用「服务器」来取代,就是答案了:
-
浏览器发送一个 Request 给 Server,Server 叫浏览器设置 Cookie,浏览器便把这些数据存在 Cookie 里面。
-
浏览器带着 Cookie 一起发 Request 给 Server,Server 根据 Cookie 的内容决定状态。
这次没有买火山硅肺病了
虽然在现实生活中不是每个人都会随身携带手机,但是每个浏览器都会把 Cookie 一并带上去,也会按照 Server 的指令来储存 Cookie。
你可以把 Cookie 称作是一个机制,Server 可以利用 Set-Cookie 这个语法让浏览器储存一些内容,而这些内容会在浏览器发送 Request 时一并送上来。
而浏览器里储存的那些内容也叫做 Cookie,就是我们故事中所提的小纸条或者是存在手机里的信息。
前面有提过 Session 机制可以只靠地址栏操作,跟 Cookie 可以一点关系都没有。
但在实际应用上,Session 之所以常常跟 Cookie 绑在一起,就是因为靠 Cookie 来操作 Session 机制的话非常方便。
或者应该这样说,Cookie 本来就是为了操作 Session 而生的。藉由标准化的规范,制定了一个专门用来让浏览器与 Server 交换数据的机制。
如果用故事来比喻,就好比政府制定说每个人随身一定要携带手机,然后手机里面一定要存小明留下来的状态。
这边再来做个简单的总结:
Session 是什么?就是一种让 Request 变成 Stateful 的机制。以小明的例子来说,Session 就是一种让客人之间能互相关联起来的机制。在故事里面我们用了纸条跟手机里的信息来比喻,有多种方式可以达成 Session。
在网络世界中,也有很多种方式可以来操作 Session,前面介绍过第一种是地址栏,第二种就是靠 Cookie。而 Cookie 就是存在浏览器里的一些信息。
讲到这边,差不多就把 Session 与 Cookie 的定义与介绍讲完了,但故事还没完呢,我们还有最后一个问题要来解决。