一句话定义:会话(Session)是服务器为你这次访问保存的一份状态档案;Cookie 是浏览器替你保管、并在之后每次请求里自动出示的那张取件凭证。
它解决什么问题:HTTP(HyperText Transfer Protocol)本身不保留状态:同一个浏览器连着发两个请求,服务器在协议层面分不清它们是否来自同一个人。于是有了一个约定:第一次访问时,服务器在响应头里用 Set-Cookie 下发一小段文本,通常是一个随机生成的 Session ID,或者叫会话标识;浏览器把它存进对应域名的本地存储。此后每次向这个域名发请求,浏览器都会自动加上 Cookie 请求头,把这段文本原样带回去。服务器拿着这个 ID 去自己的存储里查:「哦,是刚才那位。」
关键就在这里:记住你的其实不是服务器,而是你的浏览器。服务器只认那张凭证,不认人。凭证丢了(清 Cookie、换个浏览器、开无痕窗口),你就变回陌生人,得重新登录。
打个比方:去游泳馆,前台给你一个手环,衣服和手机存在 3 号柜子里。手环本身不装任何东西,它只是一串编号;真正的东西在前台那边。你每次回去取东西,靠的是亮一下手环。手环就是 Cookie,柜子就是服务端会话存储,编号对应 Session ID。
几个容易混的邻居:
| 名词 | 存在哪 | 特点 |
|---|---|---|
| Cookie | 浏览器 | 容量很小,每次同域请求自动携带,是传输凭证的载体 |
| Session | 服务器 | 状态本体,靠 Session ID 索引,容量随业务需要 |
| AI 词典:Token">Token(如 JWT) | 浏览器 | 内容自包含、服务端不必查库,靠签名校验,属于无状态方案 |
| LocalStorage | 浏览器 | 容量大,但不会随请求自动发送,需要前端手动放进请求头 |
对实际工作的意义:
1. Cookie 里只该放一个没意义的随机 ID。它每次请求都在明文往返,用户自己也能看见、能修改,所以别把聊天记录、身份信息直接写进去。
2. 多台服务器部署时,会话不能只存在某台机器的内存里,否则用户第二次请求被分到别的机器上,就会“失忆”。要么放进共享存储,要么干脆改用无状态 Token。
3. 同一域名下的 Cookie 是所有标签页共享的,所以一个标签页登录,另一个也就登录了。反过来,退出登录时,服务端会话和浏览器 Cookie 最好一起清掉。
4. 做 AI 对话产品时,多轮上下文一般存在服务端的会话或数据库里,Cookie 只负责携带那个 ID。也就是说,浏览器交出去的从来不是对话内容,而是一张写着编号的取件单。
一句话收尾:理解会话与 Cookie,本质上就是理解:一个不保留状态的协议,怎么靠一张反复出示的凭证,假装自己一直记得你。
