认识Cookie

429 阅读3分钟

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/…