HTTP 协议
要弄明白 cookie 和 session,就得先了解一下 HTTP 协议。HTTP 是一种无状态的协议,请求响应后,断开 TCP 链接,下一次连接与上一次无关。无状态就意味着每个请求之间不会直接地相互影响,对于每个请求,同样的请求参数就会得到同样的结果 为了识别不同的请求是否来自同一客户,引用 HTTP 会话机制,而维持这个会话则主要靠 session 和 cookie。简单来说,cookie 机制采用的是在客户端保持状态的方案,而 session 机制采用的是在服务器保持状态的方案
cookie
由于 HTTP 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了,而这个通行证就是 cookie cookie 实际上是一小段的文本信息,存储在客户端,web 服务器通过传送 HTTP 包头中的 set-Cookie 把一个 cookie 发送到用户的浏览器中,内任凭主要包括:名字,值,过期时间,路径和域,路径和域一起构成 cookie 的作用范围。 如果不设置过期时间,则表示这个 cookie 的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了,这种生命期为浏览器会话期的 cookie 被称为会话 cookie。会话 cookie 一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的;如果设置了过期时间,浏览器就会把 cookie 保存在硬盘上,关闭后再次打开浏览器,这些 cookie 仍然有效直到超过设定的过期时间
session
session 机制是一种服务器端的机制,服务器使用一种类似于散列表的机构来保存信息,一般存储在文件、数据库或内存中。 当客户端第一次请求服务端的时候,服务端会检查客户端的请求头携带的 cookie 中,是否包含 sessionID,如果有的话则会检索这个 sessionID 对应的 session 是否存在。如果不存在则会创建相应的会话信息,生成对应的 session,并将 session 返回给客户端,客户端接收到这个 seesionID,把它存储起来,下一次发送请求的时候,附带着这个 session 一起发送给服务端,服务端只要根据这个 sessionID,就知道是谁了,而这个 sessionID 就是这次会话生命周期的凭证,服务端可以给这个 sessionID 设置过期时间,一旦客户端丢失这个 sessionID 或者服务端认为这个 sessionID 失效了,那么这次会话结束了
登录状态的维持过程
- 首先用户在客户端浏览器发起登录请求
- 登录成功后,服务端会把用户信息保存在服务端,并返回一个唯一的 session 标识给客户端浏览器
- 客户端浏览器会把这个唯一的 session 标识保存起来,存在 cookie 中
- 以后再次访问 web 应用时,客户端浏览器会把这个唯一的 session 标识带上,这样服务端就能根据这个唯一标识找到用户信息