cookie
cookie 中一些常用属性
1. 使用场景
由服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。
如果只是为了存储数据,建议使用新的浏览器 API,如使用 Web storage API (本地存储和会话存储)或 IndexedDB 。
Cookie 主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
2. 创建 Cookie
当服务器收到 HTTP 请求时,服务器可以在响应头里面添加一个 Set-Cookie
选项。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: valid_cookie=choco; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Set-Cookie: secure_cookie=strawberry; Secure; HttpOnly;
Set-Cookie: scope_cookie=strawberry; Domain=mozilla.org; Path=/docs;
浏览器收到响应后通常会保存下 Cookie
,之后对该服务器每一次请求中都通过 Cookie
请求头部将 Cookie
信息发送给服务器。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
3. 属性
Cookie 的生命周期
相关属性
过期时间(Expires) 有效期(Max-Age)当 Cookie 的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
限制访问 Cookie
Secure标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端
HttpOnlyJavaScript Document.cookie API 无法访问带有 HttpOnly 属性的 cookie;此类 Cookie 仅作用于服务器。
Cookie 的作用域
Domain 和 Path 标识定义了 Cookie 的作用域:即允许 Cookie 应该发送给哪些 URL。
DomainDomain 指定了哪些主机可以接受 Cookie。
如果不指定,默认为 origin,不包含子域名。
如果指定了 Domain,则一般包含子域名。
因此,指定 Domain 比省略它的限制要少。
例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。
PathPath 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 "/" 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs,则以下地址都会匹配:
- /docs
- /docs/Web/
- /docs/Web/HTTP
SameSite Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送
SameSite 可以有下面三种值:
- None。浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
- Strict。浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
- Lax。与 Strict 类似,但用户从外部站点导航至 URL 时(例如通过链接)除外。
导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。详见下表。
请求类型 | 示例 | 正常情况 | Lax |
---|---|---|---|
链接 | <a href="..."></a> | 发送 Cookie | 发送 Cookie |
预加载 | <link rel="prerender" href="..."/> | 发送 Cookie | 发送 Cookie |
GET 表单 | <form method="GET" action="..."> | 发送 Cookie | 发送 Cookie |
POST 表单 | <form method="POST" action="..."> | 发送 Cookie | 不发送 |
iframe | <iframe src="..."></iframe> | 发送 Cookie | 不发送 |
AJAX | $.get("...") | 发送 Cookie | 不发送 |
Image | <img src="..."> | 发送 Cookie | 不发送 |