当你在某个网站登录账号后,刷新页面或者过一会儿再打开,发现账号还是保持登录状态,不用重复输入用户名和密码。这种体验背后,很大概率是 HTTP 协议中的 Cookie 在起作用。
什么是 Cookie?
Cookie 是服务器发送给浏览器的一小段文本信息,浏览器会将其保存在本地。之后每次向同一服务器发起请求时,都会自动附带上这个信息。它的本质是 HTTP 协议的一种机制,用来在无状态的通信中维持用户状态。
HTTP 本身是无状态的,也就是说,服务器不会记住你之前做过什么。比如你第一次访问一个购物网站,把商品加入购物车;第二次刷新页面,服务器如果不做额外处理,就完全不知道你是谁,购物车自然也就空了。这时候 Cookie 就派上用场了。
Cookie 是怎么工作的?
当你第一次登录某个网站时,服务器验证你的账号密码正确后,会在响应头中加入 Set-Cookie 字段,告诉浏览器:“请记住这个用户的标识”。浏览器收到后,就把这段信息存下来。下次你再访问这个网站,浏览器就会自动在请求头里加上 Cookie,服务器一看就知道你是老用户,直接恢复你的登录状态。
举个例子,服务器返回的响应头可能包含:
Set-Cookie: session_id=abc123; Expires=Wed, 01 Jan 2025 00:00:00 GMT; Path=/
之后浏览器每次请求该网站时,都会带上:
Cookie: session_id=abc123
常见的使用场景
除了保持登录状态,Cookie 还常用于记录用户的偏好设置。比如你在一个新闻网站设置了字体大小或夜间模式,网站可以把这些选择存入 Cookie。下次你再来访问,页面会自动应用之前的设置,不需要重新调整。
广告推荐也依赖 Cookie。你在某电商网站看了几款手机,之后去别的网站浏览,结果看到的广告全是手机相关产品。这是因为你的浏览行为被记录在 Cookie 中,广告系统据此推送相关内容。
Cookie 的安全性问题
由于 Cookie 会随每个请求自动发送,如果里面包含敏感信息且未加密,可能会被第三方截取。因此现代网站通常不会在 Cookie 中直接存储密码这类数据,而是存一个随机生成的会话 ID,真正的用户信息保留在服务器端。
为了提升安全,可以设置 Cookie 的属性。例如加上 Secure 表示只在 HTTPS 下传输,HttpOnly 可防止 JavaScript 读取,避免被脚本盗取。
Set-Cookie: session_id=xyz987; Secure; HttpOnly; Path=/
Cookie 的生命周期
Cookie 可以是临时的,也可以长期存在。如果不设置过期时间,它就是会话 Cookie,关闭浏览器后自动清除。如果指定了 Expires 或 Max-Age,浏览器就会把它保存到指定时间,即使关机重启也不会丢失。
用户也可以手动清除 Cookie。比如在浏览器设置里点击“清除浏览数据”,勾选 Cookie 和站点数据,之后再去访问那些网站,就得重新登录了。