Session 是由于 HTTP 协议无状态,但服务端需要区别用户而衍生出的概念,表示“会话”的意思。其中 Session 保存在服务端,每个用户对应一个 Session。服务端保存 Session 的方式有很多:内存、数据库,文件等。在分布式场景下,还需要考虑 Session 在各服务端间的共享,此时一般通过单独的缓存服务器如 Memcached、Redis 来保存 Session。
然而光有 Session 是往往不够的,服务端还需要根据浏览器请求找到对应的 Session,这时就需要 Cookie 登场了。Cookie 是真实存在的属性,保存在浏览器端,随 HTTP 协议传到服务端。客户端在第一次访问服务端时,服务端通过 HTTP 协议告诉浏览器需要保存 Session ID 在 Cookie 中,以后该浏览器的所有请求都可以通过 Session ID 获取到对应的 Session,也就可以区别用户了。
也就是说,Session 基于 Cookie 实现,Cookie 保存在客户端、Session 保存在服务端。Session 用于在服务端区分不同客户端,每个客户端对应一个 Session,也就是会话。然而有时客户端会禁用 Cookie,此时一般通过 URL 重定向实现 Session,在每次 HTTP 交互中,在 URL 后面附加诸如 sid = xxxxx 的参数,通过该参数获取对应 Session 会话。