Linux 下 HTTP 会话机制实战:Cookie 与 Session 原理及 C++ 实现
HTTP 协议本身是无状态的,这意味着服务器无法天然识别连续请求是否来自同一用户。为了解决这一问题,Web 开发中引入了 Cookie 和 Session 机制。本文将深入解析两者的工作原理、安全特性,并结合 C++ 模拟的 HTTP 服务器进行实战验证。
一、Cookie 机制详解
1. 核心原理
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。当浏览器再次向同一服务器发起请求时,会自动携带该数据。
- 服务端设置:在 HTTP 响应头中添加
Set-Cookie字段。 - 客户端存储:浏览器根据域名保存 Cookie(内存或文件)。
- 自动发送:后续请求在 HTTP 请求头中自动携带
Cookie字段。
2. 分类与属性
Cookie 主要分为两类:
- 会话 Cookie (Session Cookie):浏览器关闭即失效,存储在内存中。
- 持久 Cookie (Persistent Cookie):带有明确的过期时间 (
expires),跨会话存在,通常以二进制或 SQLite 格式存储在文件中。
关键属性包括:
name=value:名称与值,特殊字符需 URL 编码。expires:过期时间(UTC/GMT),决定持久性。path:作用路径,仅访问指定路径时才发送。domain:允许接收 Cookie 的域名。secure:仅通过 HTTPS 传输。HttpOnly:禁止 JavaScript 访问,防止 XSS 攻击。
3. 安全性风险
单纯依赖 Cookie 存在显著隐患。若将敏感信息(如密码)直接存入 Cookie,一旦被抓包或篡改,用户凭证即刻泄露。因此,实际应用中通常结合 Session 使用。
4. C++ 模拟实现
基于之前实现的 HTTP 服务器,我们添加 Cookie 功能。核心逻辑在于构建 Set-Cookie 响应头,并在解析请求时提取 Cookie 信息。
构建 Cookie 示例:
void set_cookie_username(string username) {
string cookie;
// 设置过期时间为当前时间 +300 秒
cookie = "Set-Cookie: username=" + username + "; expires=" + expires_time(300) + "; path=/;";
_cookies.emplace_back(cookie);
}
登录验证逻辑:
// 优先检查 Cookie 中是否已包含有效密码
if(re.() == ) {
res.();
again;
}
(pw == ) {
res.(username);
res.(pw);
res.();
} {
res.();
}


