Cookie 的工作原理
cookie是浏览器设计的一个用来持久化一些简单数据的机制,不同浏览器支持不同数目和大小的cookie,一个cookie实际是一个小的文本文件。
浏览器允许每个域名所包含的cookie数
-
Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。
-
Firefox每个域名cookie限制为50个。
-
Opera每个域名cookie限制为30个。
-
Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生
浏览器的cookie大小限制
-
Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。
-
Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。
-
Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。
cookie这样工作
- server 发送cookie数据给浏览器,完成set-cookie操作,实际上cookie既可以通过服务端设置,也可以通过客户端设置


第一方cookie 和 第三方cookie
第一方cookie就是直接来自你正在访问的站点,比如我访问www.xxxx.com,那么这个主域下面的cookie都是第一方cookie
第三方cookie是指非访问站点所生产的cookie,可能在访问的过程中加载了第三方的跟踪代码,资源,由第三方站点生产的cookie,比如你访问今日头条,在上面看到淘宝的广告,那么淘宝就有可能你访问的时候添加cookie,这个就是第三方广告Cookie。 第三方Cookie能用于跨域跟踪,通常用在第三方广告的转化跟踪。
Chrome这次改动是什么?
1 chrome浏览器将会在今年晚些的版本中,在默认情况下阻止网站的cookies跨域传输。开发者必须通过手动设置cookie的 samesite 属性,决定是否允许此cookie跨域传输。
2 chrome浏览器将能够提供有关哪些站点正在设置这些cookie的明确信息,以便用户可以对其数据的使用方式做出明智的选择。
3 最终将跨站点cookie传输只能在HTTPS域名起作用。
4 chrome浏览器会采取措施限制各网站获取浏览器的除cookie信息之外的信息。这些信息是由UA,referer请求头等信息组成的。也包含了大量的用户独特信息。chrome形象地称之为“浏览器指纹“
google chrome从v80版本之后将默认使用SameSite属性,如果开发人员明确想允许其Cookie跨网站使用,则必须手动设置cookie的SameSite。仅在单个域上运行的Cookie不会受到影响。
Samesite属性: 这个属性可以让你规定你的cookie是否只能是第一方cookie,防止或允许第三方站点使用
SameSite属性包含三个可能的取值
- None:允许第三方使用cookie
- Lax:允许发送安全 HTTP 请求类型( GET , HEAD , OPTIONS , TRACE )第三方链接的 cookies,必须是 TOP-LEVEL 即可引起地址栏变化的跳转方式,其他跳转不会带上cookie;发送不安全 HTTP 方法( POST , PUT , DELETE )类型的http 请求被视为不安全的的请求,禁止携带第三方链接的cookies
- Strict:只能作为第一方cookie
使用举例:
Set-Cookie: key=value; HttpOnly; SameSite=Strict
为什么这么改?
减少CSRF,xss攻击
前端工程师需要做什么
默认不允许跨网站使用cookie,如果明确想允许其Cookie跨网站使用,则必须手动设置cookie的SameSite为None
Reference Knowledge: 网络攻击CSRF & XSS
Cross-site request forgery (CSRF)
CSRF原理
攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

CSRF防御
-
(1)验证 HTTP Referer 字段: 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址
-
(2)在请求地址中添加 token 并验证:可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
-
(3)在 HTTP 头中自定义属性并验证
XSS
XSS原理
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。 原理和防范看此篇