Cookie
- 定义与功能:Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户的购物车信息等。
- 工作方式:当用户第一次访问网站时,服务器在HTTP响应报头中通过Set-Cookie字段为客户端设置Cookie,客户端在后续对该服务器的请求中,会在HTTP请求报头中以Cookie字段将Cookie的值发送给服务器。
- 分类:会话 Cookie(Session Cookie):在浏览器关闭时失效;持久 Cookie(Persistent Cookie):带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。如果 cookie 是一个持久性的 cookie,那么它其实就是浏览器相关的,特定目录下的一个文件。但直接查看这些文件可能会看到乱码或无法读取的内容,因为 cookie 文件通常以二进制或 sqlite 格式存储。一般我们查看,直接在浏览器对应的选项中直接查看即可。
设置 cookie
HTTP 存在一个报头选项:
Set-Cookie
,
可以用来进行给浏览器设置
Cookie 值。在 HTTP 响应报头中添加,客户端(如浏览器)获取并自行设置并保存 Cookie。
基本格式
Set-Cookie: <name>=<value>
其中 <name> 是 Cookie 的名称,<value> 是 Cookie 的值。
例如:
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC;
path=/; domain=.example.com; secure; HttpOnly
- expires=<date>:设置 Cookie 的过期日期/时间。如果未指定此属性,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期。有关获得UTC时间的函数如下:
string GetMonthName(int month)
{
vector<string> months = {"Jan", "Feb", "Mar",
"Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
return months[month];
}
string GetWeekDayName(int day)
{
vector<string> weekdays = {"Sun", "Mon", "Tue",
"Wed", "Thu", "Fri", "Sat"};
return weekdays[day];
}
string ExpireTime(int t) // 秒级别的未来 UTC 时间
{
time_t timeout = time(nullptr) + t;
// 这里不能用 localtime,因为 localtime 是默认带了时区的.
// gmtime 获取的就是 UTC 统一时间 char timebuffer[1024];
// 时间格式如: expires=Thu, 18 Dec 2024 12:00:00 UTC
struct tm *tm = gmtime(&timeout);
char timebuffer[1024];
snprintf(timebuffer, sizeof(timebuffer),
"%s, %02d %s %d %02d:%02d:%02d UTC",
GetWeekDayName(tm->tm_wday).c_str(),
tm->tm_mday,
GetMonthName(tm->tm_mon).c_str(),
tm->tm_year + 1900,
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
return timebuffer;
}
- path=<some_path>:限制 Cookie 发送到服务器的哪些路径。默认为设置它的路径。
- domain=<domain_name>:指定哪些主机可以接受该 Cookie。默认为设置它的主机。
- secure:仅当使用 HTTPS 协议时才发送 Cookie。这有助于防止 Cookie 在不安全的 HTTP 连接中被截获。
- HttpOnly:标记 Cookie 为 HttpOnly,意味着该 Cookie 不能被客户端脚本(如 JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。
如果 cookie 写入的是用户的私密数据,比如,用户名密码,浏览痕迹等。其问题在于这些用户私密数据在浏览器(用户端
)
保存,非常容易被人盗取,更重要的是,除了被盗取,还有就是用户私密数据也就泄漏了,于是就引入了session。
Session
- 定义与功能:Session是一种服务器端的机制,用于在服务器上保存用户的会话信息,如登录状态、用户偏好等。通过Session,服务器可以在多个请求之间识别和跟踪用户。
- 工作方式:当客户端第一次请求服务器时,服务器会创建一个Session,并生成一个唯一的Session ID,通过Set-Cookie字段将Session ID发送给客户端。客户端在后续的请求中,会将Session ID发送给服务器,服务器根据Session ID找到对应的会话信息。
- 存储方式:Session数据通常存储在服务器的内存中,也可以存储在数据库或文件系统中。
- 生命周期:Session的生命周期可以通过设置过期时间来控制,当用户长时间没有活动时,服务器可以自动删除会话以节省资源。
与
Cookie
相似,由于
Session ID
是在客户端和服务器之间传递的,因此也存在被窃取的风险。但是一般虽然 Cookie
被盗取了,但是用户只泄漏了一个
Session ID
,私密信息暂时没有被泄露的风险,Session ID 便于服务端进行客户端有效性的管理,比如异地登录。
Cookie与Session的关系
- Cookie和Session通常是结合使用的,Cookie用于在客户端存储Session ID,以便在后续请求中发送给服务器,服务器通过Session ID找到对应的Session数据。
- Cookie是在客户端存储的小数据块,而Session是在服务器端存储的用户会话信息。
- Cookie可以用于存储一些简单的用户信息,如用户偏好、购物车数量等,而Session可以存储更复杂的用户状态和信息,如登录状态、用户权限等。
应用场景
- 用户登录与认证:当用户登录成功后,服务器可以创建一个Session,并通过Cookie将Session ID发送给客户端,以便在后续请求中识别用户身份。
- 购物车功能:服务器可以通过Session或Cookie来存储用户购物车中的商品信息,以便在用户浏览不同页面时保持购物车状态。
- 个性化设置:服务器可以通过Cookie存储用户的个性化设置,如主题、语言等,以便在用户下次访问时提供个性化的体验。