1. Cookie
定义 HTTP Cookie 是服务器发送到浏览器并本地保存的小块数据,后续向同一服务器发起请求时会自动携带,用于识别请求是否来自同一浏览器(如保持登录状态、记录用户偏好)。
工作原理
- 首次访问:服务器在响应头中通过
Set-Cookie字段发送 Cookie 到浏览器。 - 本地存储:浏览器按域名保存 Cookie。
- 后续请求:浏览器自动在请求头的
Cookie字段中携带保存的信息。
分类
- 会话 Cookie:浏览器关闭后即失效。
- 持久 Cookie:带有明确过期时间,可跨浏览器会话存在;以二进制或 sqlite 等格式存储为浏览器相关文件。
安全性 由于 Cookie 是存储在客户端的,因此存在被篡改或窃取的风险。
用途
- 用户认证和会话管理 (最重要)
- 跟踪用户行为
- 缓存用户偏好等
- 比如在 Chrome 浏览器下,可以直接访问:chrome://settings/cookies
认识 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
时间格式必须遵守 RFC 1123 标准,具体格式样例:Tue, 01 Jan 2030 12:34:56GMT 或者 UTC(推荐)。
关于其他可选属性的解释
- expires=:设置 Cookie 的过期日期/时间。如果未指定此属性,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期。
- path=<some_path>:限制 Cookie 发送到服务器的哪些路径。默认为设置它的路径。
- domain=<domain_name>:指定哪些主机可以接受该 Cookie。默认为设置它的主机。
- secure:仅当使用 HTTPS 协议时才发送 Cookie。这有助于防止 Cookie 在不安全的 HTTP 连接中被截获。
- HttpOnly:标记 Cookie 为 HttpOnly,意味着该 Cookie 不能被客户端脚本(如 JavaScript)访问。这有助于防止跨站脚本攻击(XSS)。
注意事项
- 每个 Cookie 属性都以分号(;)和空格( )分隔。
- 名称和值之间使用等号(=)分隔。
- 如果 Cookie 的名称或值包含特殊字符(如空格、分号、逗号等),则需要进行 URL 编码。
Cookie 的生命周期 如果设置了 expires 属性,则 Cookie 将在指定的日期/时间后过期。如果没有设置 expires 属性,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期。
单独使用 Cookie,有什么问题?
- 我们写入的是测试数据,如果写入的是用户的私密数据呢?比如,用户名密码,浏览痕迹等。
- 本质问题在于这些用户私密数据在浏览器 (用户端) 保存,非常容易被人盗取,更重要的是,除了被盗取,还有就是用户私密数据也就泄漏了。


