Cookie

234 阅读4分钟

浏览器本地存储

分类

  • Cookie
  • localstorage
  • sessionStorage
  • indexDB

Cookie

产生背景: HTTP 协议是一个 无状态协议,客户端向服务端发送请求,服务端返回,事情就结束了;但是下次发请求如何让服务端知道客户端是谁了?

这种情况下就产生了 Cookie;

存储地方: 一般是在浏览器, 本地文件夹~/Library/Application Support/Google/Chrome/Default; Mac 电脑

存放在本地的好处就是,即使你关闭了,也会存在;

Cookie 设置

流程:

  • 客户端发送 HTTP 请求道服务器
  • 当服务器收到 HTTP 请求时,在响应头里面添加一个 Set-Cookie 字段
  • 浏览器收到响应后保存下 Cookie
  • 之后对该服务器每一次请求中都通过 Cookie 字段将 Cookie 信息发送给服务器。

Cookie 属性

  • Name/Value

名字 和值

  • Expires

1、 概念: 用于设置 Cookie 的过期时间

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

2、 a、会话性cookie: 一般值是 session,值在客户端的内存中,浏览器关闭时就失效;注意: 有的浏览器提供了会话功能,关闭了浏览器就删除了,Web 浏览器可能会使用会话还原,这会使大多数会话 Cookie 保持永久状态,会话期有也会被保存下来;

​ b、持久性 cookie:会保存在用户的硬盘中,直到过期或者清除,是指在特定日期(Expires)特定时间长度(Max-Age)外过期

注意: 设定的日期和时间只和浏览器有关,与服务器没有关系

  • Max-Age

用于设置在 Cookie 失效之前需要经过的秒数

Set-Cookie: id=a3fWa; Max-Age=604800;

Max-Age 可以是正数、负数、0;

正数:浏览器会持久化,即写到对应的 Cookie 中

负数:表示该 cookie 是一个会话性 cookie

0: 会立即删除这个 cookie;

注意 : 当 Expires 和 Max-Age 同时存在时,Max-Age 的优先级更高

  • Domain

Domain 指定了 Cookie 可以送达的主机名,如果没有指达,那么默认值为当前文档访问地址中的主机部分

比如:像淘宝首页设置的 Domain 就是 .taobao.com,这样无论是 a.taobao.com 还是 b.taobao.com 都可以使用 Cookie;

在这里注意的是,不能跨域设置 Cookie,比如阿里域名下的页面把 Domain 设置成百度是无效的:

Set-Cookie: qwerty=219ffwef9w0f; Domain=baidu.com; Path=/; Expires=Wed, 30 Aug 2020 00:00:00 GMT

  • Path

指定一个 URL 路径,这个路径必须出现在要请求资源的路径中才可以发送 Cookie 首部; 比如设置 Path = /docs,/docs/Web/ 下的资源会带 Cookie 首部; /test 则不会带 Cookie 首部

Domain 和 Path 标识共同定义了 Cookie 的作用域: 即Cookie 应该发送给那些 URL;

  • Secure 属性

标记为 Secure 的 cookie ,只应通过被HTTPS 协议加密过的请求发送给服务端; 使用 HTTPs安全协议,可以保护 Cookie 在浏览器和 Web服务器间的传输过程不被窃取和篡改;

  • HTTPOnly

设置 HTTPOnly 属性设置为 false ;可以防止客户端脚本通过 document.cookie 等方式进行访问 Cookie, 有助于避免 Xss 攻击;不允许 js 操作

  • SameSite

SameSite :2 月份发布的 Chrome80 版本中默认屏蔽了第三方的 Cookie;

可以理解成: 是否可以允许跨站,第三方,携带 cookie

1、作用

SameSite属性可以让 cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)

2、属性值

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

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

注意 : 1、HTTP 接口不支持 SameSite=none; 如果你想加 SameSite=none 属性,那么该 Cookie 就必须同时加上 Secure 属性,表示只有在 HTTPS 协议下该 Cookie 才会被发送;

​ 2、需要 UA 检测,部分浏览器不能加 SameSite=none;IOS 12 的 Safari 以及老版本的一些 Chrome 会把 SameSite=none 识别成 SameSite=Strict,所以服务端必须在下发 Set-Cookie 响应头时进行 User-Agent 检测,对这些浏览器不下发 SameSite=none 属性

Cookie 作用

常用于以下三个方面:

  • 会话状态管理(入登录状态、购物车、游戏分数等);
  • 个性化设置(用户自定义设置,主题)
  • 浏览器行为跟踪(跟踪分析用户行为)

Cookie 缺点

  • 大小 4kb ;
  • 安全性: cookie 被拦截了,可能取得所有的 session 信息,即使加密也没有用;然后被篡改
  • 增加请求: cookie 会被附加在每个 HTTP 请求中,无形增加了流量;
  • 客户端 可以禁止接收 Cookie ;