Cookie 是服务端委托浏览器存储在客户端的一些记录用户信息的数据,一般总大小不能超过 4K。
一、工作流程
1、当浏览器首次访问服务器时,服务器会创建一个独特的身份标识数据,格式是 key=value
放进 Set-cookie
字段里随响应报文返回给浏览器。
2、浏览器收到响应报文后会把 Cookie值
存储起来,下次再请求时会自动放进 Cookie
字段里发送给服务器。
3、当服务器接受到带有 Cookie
字段 的请求,就通过 Cookie
里的值识别出用户的身份,提供个性化的服务。
二、Cookie 主要用于以下三个方面
- 身份识别,实现有状态的会话事务(登录状态、购物车等)
- 个性化设置(用户自定义设置、主题等)
- 广告跟踪
缺点
- 由于会附加每个 HTTP 请求中, 会增加流量
- HTTP 请求中 Cookie 是明文传递, 除非是 HTTPS, 否则有安全问题
- Cookie 大小限制 4kb 左右, 对应复杂的存储需求远远不够
三、Cookie 分类:按存储位置不同可分为 会话期 Cookie
和 持久性 Cookie
- 会话期 Cookie:存储在内存,仅在浏览器运行期间有效,浏览器关闭后会自动删除。过期时间显示为
Session
或N/A
。 - 持久性 Cookie:存储在本地,可以指定过期时间
Expires
或有效期Max-Age
。
四、Cookie 的属性
- 有效期
Expires:过期时间,绝对时间点。
Max-Age:收到报文后多久的过期时间,单位是秒。设置为 0 时 立刻失效。
两者可以同时使用,但会优先 Max-Age 计算失效期。
- 作用域:让浏览器仅发送给特定的服务器和 url,避免被其它网站盗用。
Dnmain 和 Path 指定 Cookie 所属的域名和路径。
浏览器发送 Cookie 前会从 url 中提取出 host 和 path 部分来对比 Cookie 的属性,如果满足了条件,才会在请求头里发送 Cookie。
- 安全性
HttpOnly:Cookie 只能通过浏览器 HTTP 协议传输。也就杜绝了 document.cookie 获取 Cookie 的可能。
Secure:Cookie 仅能用 HTTPS 协议加密传输。
SameSite:可以防范 CSRF(跨站请求伪造)攻击。
SameSite=Strict:严格限定 Cookie 不能随跳转链接跨站发送。 SameSite=Lax: 禁止 POST 跨站发送,但允许 GET/HEAD 等安全方法。
五、怎样使用?利用 PHP 函数 setcookie
测试使用
参数 | 介绍 |
---|---|
name | Cookie 名称 |
value | Cookie 值,存储在本地 |
expire | 过期时间,使用 Unix 时间戳(PHP 内部作了转换) |
path | 服务器路径,默认值设置 Cookie 的当前目录 |
domain | 域名或子域名 |
secure | 设置 Cookie 是否仅通过 HTTPS 连接传给客户端 |
httponly | Cookie 是否仅通过 HTTP 协议访问。如设为 True, JavaScript 这些脚本无法访问,即有效减少 XSS 攻击 |
// PHP setcookie 设置 Cookie
// 开发者工具:Application->Storage->Cookie
// 能看到有条 name 为 Gnahz、value 为 Test-Cookie 和 1 小时后过期的 Cookie。
setcookie("Gnahz", "Test-Cookie", time()+3600);
// JavaScript XSS 攻击获取 Cookie
// 输出:Gnahz=Test-Cookie
document.cookie;
// 设置 httponly,让 Cookie 仅通过 HTTP 协议访问
// 输出:""
setcookie("Gnahz", "Test-Cookie", time()+3600, '', '', false, true);