# HTTP Cookie

HTTP本质是无状态的,使用Cookies可以创建有状态的会话。不过这样说可能会让你产生一些误解,首先无状态并不是不好,有优点,但也会导致一些问题。而 Cookie 的存在也不是为了解决通讯协议无状态的问题,只是为了解决客户端与服务端会话状态的问题,这个状态是指后端服务的状态而非通讯协议的状态。

Cookie(复数形态Cookies),类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据。

作为一段一般不超过 4KB 的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成,这些涉及的属性我们会在后面会介绍。

# Cookie的组成

  1. Name/Value 用 JavaScript 操作 Cookie 的时候注意对 Value 进行编码处理。
  2. Expires 用于设置 Cookie 的过期时间,一般是一个绝对时间
  3. Max-Age 用于设置在 Cookie 失效之前需要经过的秒数。 假如 Expires 和 Max-Age 都存在,Max-Age 优先级更高。
  4. Domain 指定了 Cookie 可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。像淘宝首页设置的 Domain 就是 .taobao.com,这样无论是 a.taobao.com 还是 b.taobao.com 都可以使用 Cookie。在这里注意的是,不能跨域设置 Cookie
  5. Path 指定了一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部。比如设置 Path=/docs/docs/Web/ 下的资源会带 Cookie 首部,/test 则不会携带 Cookie 首部。Domain 和 Path 标识共同定义了 Cookie 的作用域:即 Cookie 应该发送给哪些 URL。
  6. Secure:标记为 Secure 的 Cookie 只应通过被HTTPS协议加密过的请求发送给服务端。使用 HTTPS 安全协议,可以保护 Cookie 在浏览器和 Web 服务器间的传输过程中不被窃取和篡改。
  7. HTTPOnly 设置 HTTPOnly 属性可以防止客户端脚本通过 document.cookie 等方式访问 Cookie,有助于避免 XSS 攻击。
  8. SameSite: SameSite 属性可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。

SameSite 可以有下面三种值:

  1. Strict 仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
  2. Lax 允许部分第三方请求携带 Cookie
  3. None 无论是否跨站都会发送 Cookie

之前默认是 None 的,Chrome80 后默认是 Lax。

服务器使用Set-Cookie 响应头部向用户代理(一般是浏览器)发送 Cookie信息。

Set-Cookie: <cookie名>=<cookie值>

现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的Cookie信息通过 Cookie 请求头部再发送给服务器。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

客户端如何设置cookie: document.cookie="a=1" 删除document.cookie="a=1;max-age=0"; 如果不指定max-age或者expires, 表示cookie的有效期为当次会话,浏览器关闭后, cookie会被自动删除。

通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。

DANGER

一般的面试可能就会问一些Cookie的组成部分等内容,用于做什么用的等内容。最好可以展开token和session来回答。 总之你得知道这是什么,可以用来做什么即可, 细节内容可以通过文档来解决。

上次更新: 1/22/2025, 9:39:13 AM