Cookie是什么?
cookie是服务器保存在浏览器的一小段(最大大概为4KB)文本信息,浏览器每次访问服务器都会带上这个cookie。
为什么要cookie
在我们上网冲浪时,一般都是HTTP协议,但是HTTP协议是无状态的,无状态有什么影响吗?简单的说我不知道你到底登录了没有,或者过期了没有,也不知道这个请求和上一个请求是不是同一个浏览器发出的,所以有了cookie。
cookie能够让HTTP带上一些状态信息,如是否登录等等。
cookie的主要用于:
1、会话状态管理(登录,购物车等等)
2、个性化设置(用户个人网页皮肤)
3、浏览器行为跟踪
创建cookie
cookie既能通过服务端来创建,也能通过客户端来创建。
服务端创建
服务器通过
set-Cookie:foo=bar
上面的代码会在浏览器保存一个键为foo,值为bar的cookie。可以放多个set-Cookie
// 在浏览器保存三个cookie
set-Cookie: foo=bar
set-Cookie: test=ok
set-Cookie: try=no
还可以设置cookie的其他属性值
set-Cookie: foo=bar; Max-age= 31536000; Secure; HttpOnly; Domain=test.com; path=/
客户端创建
Cookie功能是可以被关闭的
// 是否打开浏览器的Cookie功能,默认打开
window.navigator.cookieEnabled
那么脚本如何创建Cookie呢
document.cookie = "bar=foo; Domain=test.com"
Cookie的属性
1、Domain和Path
Domain和path主要限制了Cookie的空间范围,39米的大刀也砍不到40米外的我。
Domain指的是域,默认是一级域名,简单说是www.后面的那个域名,例如一个Cookie里,Domain=test.com,那么在访问test.com/或者a.test.com/或者b.test.com时都会带上Cookie
Path指的是路径,默认是/根路径,在域名符合的条件下,例如/login,那么在test.com/login就会带上Cookie,在test.com/register我死也不带上Cookie。
2、Expires和Max-Age
这两货主要限制了Cookie的时间,上天给它一个期限,到期必升天。
Expires 属性代表一个具体的时间,跟本地系统的时间有关,所以不太准确。用的是UTC格式,可以用Date.prototype.toUTCString()转换一下.
Max-Age 表示一个时间,单位为秒,如 60 * 60 * 24 * 365 一年,那么这个Cookie一年之后就会过期.
Secure 和 HttpOnly
Secure表示浏览器只有在HTTPS下,才发送这个Cookie到服务器中。不是HTTPS协议,浏览器会忽略Secure属性
HttpOnly指定该Cookie无法通过脚本获取,只有浏览器发起符合条件的Http请求时,才会把它带上。
SameSite
SameSite Cookie允许服务器要求某个Cookie在跨站情况下不发送过去。可以阻止CSRF跨站攻击。
SameSite的取值:
1、none,跟以前一样,跨站还是同站,都发送cookie。
2、Strict,浏览器将只在访问相同站点时发送 cookie。就是禁止所有跨站发送cookie。
3、Lax,与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。新版浏览器中,为默认选项
例如: (1)a链接,<a href="xx">
(2)预加载 <link rel="preload" href="xx">
(3)Get表单
这些会发送跨站Cookie
参考链接
javascript.ruanyifeng.com/bom/cookie.…
developer.mozilla.org/zh-CN/docs/…