说到session那我们不可避免要提及cookie,因为session是基于cookie实现的。该如何理解这两个概念呢?
想象我们进入了一间特别的餐厅,餐厅老板会给每位来餐厅的顾客发一张小卡片,上面可以记录你是谁,喜欢吃什么东西。当你每次来访问餐厅时,老板都能知道你喜欢吃什么样的食物,从而快速给你准备餐点,但你每次离开餐厅时卡片会留在餐厅,而且卡片上的信息对其他顾客也是可见的。这张卡片便是cookie,这间餐厅便是你的浏览器,老板可以理解为服务器。顾客(用户)在咖啡馆(浏览器)向老板(服务器)提交订单(请求),老板确认后提供饮品(响应)。这便是客户端(用户)与服务器之间的信息交换过程。 但这种方式显然不太安全,因为你的个人信息都将存储在浏览器上,这明显是缺乏安全保障的。(当然我们也可以选择不保存cookie,但出于多次登录的方便考虑我们一般都不会选择删除cookie)
那么为了又方便又安全地进行多次登录,我们就引出了session这个概念,session实际上相当于老板的一个密码本,当你向老板提交订单时,老板会将你的个人信息记录在本子上,然后将你的个人信息加密为一小串随机字符写在卡片上交给你,当你下次来餐厅时,给老板看到你的卡片,老板便能在密码本上对应找出你的信息并为你准备餐点。这样明显解决了cookie不安全的痛点,存在服务器上的数据将更安全地被保护。让我们再来回顾一下改进后的访问过程,以登录访问掘金社区为例,我在一次请求中携带我的用户名以及密码访问掘金的服务器,掘金服务器在数据库里验证我的信息无误后,将在服务器创建一个session id和其他参数(这个session id大概率是一串随机生成的字符串),接着通过set-cookie返回session id与其他参数给浏览器。以后我们每次通过浏览器访问服务器都会用cookie携带这个session id到服务器,即使黑客入侵从浏览器拿到我们的session id也很难破译我们的个人信息,这样在保障安全的同时又能方便我们登录。最后,当cookie有效期失效,浏览器便删除这个cookie,此时会话结束,下次再登录时,我们便需要重新输入用户名与密码。