Cookie详解

99 阅读3分钟

什么是Cookie?

Cookie是浏览器将服务端返回的数据保存在本地的一小块数据(一般小于4kb)。一般用于存储用户身份信息。当浏览器向服务端请求数据时,会自动将cookie携带在请求头上。

为什么需要引入cookie?

HTTP协议是无状态的 一个用户第二次请求和一个新用户第一次请求 服务端是识别不出来的,cookie是为了让服务端记住客户端而被设计的。

Cookie属性详解

设置过期时间 ( Expires & Max-Age)

设置cookie有效期。Expires 和 Max-Age 都存在,Max-Age 优先级更高。

  • Expires:设置 Cookie 的过期时间。如果不设置,Cookie 会在浏览器关闭时自动失效,称为会话 Cookie(Session Cookie)。Expires 使用的是具体的日期和时间(例如:Sat, 31 Dec 2022 23:59:59 GMT)。
// 30s 后浏览器 cookie 自动清空 
res.cookie('token','dsafdsfd453542scdsfd',{expires:new Date(Date.now() + 30*1000)})
  • Max-Age:设置 Cookie 在多少秒后过期。与 Expires 相比,Max-Age 是相对于当前时间的持续时间,更加灵活。max-Age > 0, 浏览器会将其持久化,即写到对应的 Cookie 文件中。当 max-Age < 0,则表示该 Cookie 只是一个会话性 Cookie。当 max-Age = 0 时,则会立即删除这个 Cookie。

Domain & Path

Path 与 Domain 相铺相成,Domain 决定 Cookie是否该被写入,而 Path 决定具体请求哪个路径时会被携带。

  • Domain:指定了 Cookie 发送的主机名, 只能设置范围小于等于自己的域名范围。假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。

  • 请求主机为www.baidu.com ,写入域为 .baidu.com 、www.baidu.com ✅

  • 请求主机为a.baidu.com ,写入域为 b.baidu.comc.a.baidu.com ❌

  • path:指定一个 URL 路径,只有当路径匹配时,才会向服务器发送 Cookie。例如设置“/”这此域下所有路径都可以携带cookie。

Secure

  • 如果被标记为Secure的话,只能通过https协议加密过的请求发送给服务端。这样可以防止CSRF跨站请求伪造攻击。
   document.cookie ='token=dsafdsfd453542scdsfd; secure';

HttpOnly

  • 如果被标记为HttpOnly的话,就不能够通过js中的document.cookie进行访问,可以防止跨站脚本攻击(XSS)。
   document.cookie ='token=dsafdsfd453542scdsfd; httpOnly';

SameSite

SameSite 属性可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF),它有三个可选值 None、strict、Lax。

首先了解下什么是跨站请求?比如说有 A、B两个网站,其中A站请求会产生 Cookie,且后续访问请求需携带回 Cookie(身份认证),如果在B网站通过链接的形式访问A站资源这个就叫跨站。这种情况访问成功与否会根据 Cookie 设置的 sameSite 而定

  • someSize:None: 浏览器在同站请求、跨站请求下都会发送 Cookies
  • someSize:Strict: 浏览器只会在相同站点下发送 Cookies
  • someSize:Lax: 与 strict 类似,不同的是它可以从外站通过链接导航到该站。

image.png

如何解决跨域携带cookie?

服务端

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: [特定域名] // 不可以是*

客户端

XMLHttpRequest发请求需要设置withCredentials=true,fetch 发请求需要设置 credentials = include