深入理解会话技术:Cookie 到底是怎么工作的?
你有没有想过,为什么我们在一个网站登录之后,刷新页面、跳转到其他页面,甚至隔几分钟再回来,系统依然“认识”我们?明明 HTTP 协议是无状态的,每一次请求都像是陌生人第一次敲门,那网站是怎么记住“你是你”的?
答案的关键之一,就是我们今天要聊的——Cookie。
为什么需要 Cookie?
HTTP 协议本身是“无状态”的。这意味着,当你向服务器发送一个请求,服务器处理完并返回响应后,它就“忘记”了这次交互。下一次你再发请求,服务器不会自动知道这和上一次是同一个用户。
但在现实应用中,这显然不够用。比如:
- 用户登录后需要保持登录状态;
- 购物车要记住你加了哪些商品;
- 网站要记住你选择的语言或主题偏好。
为了解决这个问题,Web 开发引入了会话(Session)机制,而 Cookie 是实现会话最基础、最广泛使用的技术之一。
Cookie 是什么?
简单来说,Cookie 是服务器发送给浏览器的一小段数据(通常不超过 4KB)。浏览器会把它保存下来,并在之后访问同一个网站时,自动把这个数据再发回给服务器。
你可以把 Cookie 想象成一张“会员卡”:第一次去咖啡店,店员给你一张卡(Set-Cookie);下次你再来,把卡出示一下(Cookie),店员就知道你是老顾客,可能还给你积分或折扣。
Cookie 是怎么工作的?
整个过程分为两步:
第一步:服务器设置 Cookie
当你首次访问某个网站(比如登录成功后),服务器会在 HTTP 响应头中加入一行:
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
浏览器收到后,就会把 sessionId=abc123 这个键值对存起来,并关联到这个域名。
第二步:浏览器自动发送 Cookie
之后你再访问该网站的任何页面(只要路径和域名匹配),浏览器就会在请求头里自动加上:
Cookie: sessionId=abc123
服务器通过读取这个值,就能知道“哦,这是之前登录过的用户”,从而恢复你的会话状态。
Cookie 有哪些重要属性?
Cookie 不只是简单的键值对,它还可以带很多“附加说明”,控制它的行为:
- Domain:指定哪些域名可以使用这个 Cookie。比如设为
.example.com,那么www.example.com和shop.example.com都能用。 - Path:限制 Cookie 只在特定路径下发送。比如
Path=/admin,那只有访问/admin/xxx时才会带上。 - Expires / Max-Age:设置过期时间。不设置的话,就是“会话 Cookie”,浏览器一关就没了;设置了就是“持久 Cookie”,即使关浏览器也会保留。
- Secure:只在 HTTPS 连接下传输,防止被窃听。
- HttpOnly:禁止 JavaScript 读取 Cookie,有效防御 XSS 攻击。
- SameSite:控制跨站请求是否携带 Cookie,是防范 CSRF 攻击的重要手段(可选
Strict、Lax或None)。
在 Java Web 中怎么用 Cookie?
在 Java Servlet 中操作 Cookie 非常简单。
创建并发送 Cookie:
Cookie cookie = new Cookie("theme", "dark");
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(30 * 60); // 30分钟
response.addCookie(cookie);
读取 Cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("theme".equals(c.getName())) {
String theme = c.getValue(); // 得到 "dark"
}
}
}
删除 Cookie: 只需把过期时间设为 0:
Cookie cookie = new Cookie("theme", "");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
Cookie 有哪些安全风险?
虽然 Cookie 很有用,但用不好也会带来安全隐患:
-
XSS(跨站脚本攻击)
如果攻击者能注入恶意脚本,就可能通过document.cookie窃取你的 Cookie。
对策:设置HttpOnly=true,让 JS 无法读取。 -
CSRF(跨站请求伪造)
攻击者诱导你在已登录状态下访问恶意网站,利用浏览器自动带 Cookie 的特性,偷偷以你的身份发请求(比如转账)。
对策:设置SameSite=Lax,并配合 CSRF Token 验证。 -
中间人攻击
在 HTTP 明文传输中,Cookie 可能被截获。
对策:全站启用 HTTPS,并设置Secure=true。
Cookie 的局限性
- 大小限制:单个 Cookie 最多 4KB,一个域名下通常最多 50 个。
- 性能开销:每次请求都会携带 Cookie,增加网络负载。
- 隐私争议:第三方 Cookie 常被用于用户追踪,如今主流浏览器(如 Safari、Chrome)已开始限制或逐步淘汰它。
- 不适合存敏感数据:即使加密,也不建议在 Cookie 里存密码、身份证号等。
Cookie、Session 和 LocalStorage 有什么区别?
很多初学者容易混淆这三者。简单对比:
- Cookie:由浏览器自动随请求发送,适合存小量标识信息(如 sessionId),可设过期时间。
- Session:数据存在服务器端,安全性高,通常用 Cookie 存 sessionId 来关联。
- LocalStorage:纯前端存储,容量大(5–10MB),但 JS 可随意读写,不适合存敏感信息。
最佳实践是:用 Cookie(带 HttpOnly + Secure)存 sessionId,用服务端 Session 存用户身份信息,用 LocalStorage 存主题、缓存等非敏感配置。
总结
Cookie 是 Web 会话机制的基石。它虽小,却承载着用户身份、偏好、状态等关键信息。理解它的工作原理和安全边界,是每个 Web 开发者的必修课。
正确使用 Cookie,不仅能提升用户体验,还能筑牢安全防线。下次当你看到浏览器开发者工具里的 Cookie 列表时,或许就能会心一笑:原来,网站“记得我”,是因为这张小小的“数字名片”。
作者:一名热爱 Web 技术的后端工程师
发布于:2025 年 11 月 5 日
标签:Web 开发、HTTP、Cookie、会话管理、网络安全

7446

被折叠的 条评论
为什么被折叠?



