原文地址

cookie的基本概念

cookie是存储在浏览器的一段数据,因为http协定是无状态的,为了辨认用户信息,服务端会把session存储到cookie上,后续的申请会在申请头携带cookie发送给服务端,个别不超过4kb。通常,它用于告知服务端两个申请是否来自同一浏览器,如放弃用户的登录状态。

<!-- truncate -->

<div className="google-adsense" data-slot="4036845214" />

cookie应用场景

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

cookie的定义

Set-Cookie: name=value[; expires=date][; max-age=secondes][; domain=domain][; path=path][; secure][; HttpOnly][; SameSite=Lax|Strict]

name: cookie的键,不辨别大小写

value: cookie的值,必须URL编码

Expires: cookie的过期工夫,值是GTM格局的,例如:Sat, 11 Dec 2021 13:06:06 GMT,默认状况下,浏览器会话完结就会删除cookie。不过也能够手动设置删除工夫

Max-Age: cookie的有效期,单位s 例如 token=123456; max-age=3600,示意cookie有效期为3600s

Domain: 指定域,例如 domain=blog.1024nav.com 则只会在 blog.1024nav.com 域下无效

Path: 指定门路匹配,不匹配则不会设置cookie,例如 path=/blog 则只会在 /blog 门路下无效

Secure: 只能被 HTTPS 协定加密过的申请发送给服务端,因而能够预防中间人攻打

HttpOnly: cookie只在http传输,客户端无奈通过js document.cookie 获取到

SameSite: Set-Cookie: key=value; SameSite=Strict,容许服务器要求某个 cookie 在跨站申请时不会被发送,从而能够阻止跨站申请伪造攻打

当初新版浏览器,例如Chorme或Firefox,如果网站不上HTTPS,就无奈应用Cookie的 Secure 标记

<div className="google-adsense" data-slot="6621456589" />

cookie前缀

cookie能够应用自定义前缀,只有在cookie设置 Secure 指令,就能够蕴含 __Secure- 或者 __Host- 前缀,而且 Path 必须为整站 "/"

一个残缺的cookie例子

Set-Cookie: id=u8dd; Expires=Mon, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly

nodejs设置Cookie的办法

response.setHeader('Set-Cookie', ['name=1024nav.com', 'Token=kjjijwe1231dsad']);

客户端操作cookie

通过 document.cookie 属性可创立新的 cookie,也可通过该属性拜访非 HttpOnly 标记的 cookie

<div className="google-adsense" data-slot="5116803225" />

cookie平安

因为客户端可能间接通过js来操作cookie,这样无疑很容易被不良少年利用,但并不代表不能用,为了进步 cookie 的平安,能够通过以下解决办法

  • 设置 HttpOnly,例如NodeJs的设置办法如下
response.setHeader('Set-Cookie', 'foo=bar; HttpOnly');
  • 给 cookie 设置超期工夫,设置 SameSite 值为 StrictLax
  • 降级站点为 HTTPS