Cookie
由于 http 是无状态连接,有时候我们需要知道请求方的信息,而 Cookie 则是很好扮演了这个角色,它可以在请求头,随着请求一同被发送。我们可以在浏览器(以 Chrome 为例)中的检查/Application/Storage/Cookies里面可以看见当前网页的Cookie。
Cookie 浏览器相关字段如下:
-
Name:Cookie 的名称
-
Value:Cookie 的值
-
Domain:Cookie 的域
域名只能为一个,不能有多个。但是域名分带点以及不带点,不带点,那么只能在当前域名下获取 Cookie;带点,那么可以在这个子域下获取 Cookie。例如,domain 为 A.study.com,那么只有A.study.com能获取到这个 Cookie;domain 为 .study.com,那么只有 A.study.com 以及B.study.com 都能获取到这个 Cookie。
-
Path:路径
默认为/,你也可以设置为/login,那么/login可以获取到/login以及/下的 Cookie,而/只能获取到/下的 Cookie。
-
Expires/Max-age:Cookie的过期时间
默认为一次会话,关闭浏览器一会后就消失,也可以自己设置。
-
Size:Cookie 的大小
-
HttpOnly:JS脚本是否可以获取(默认可以获取,为false)
若设置为 true,JS 脚本将无法获取 Cookie,能有效的防止XSS攻击。
-
Secure:JS脚本是否可以获取(默认可以获取,为false)
若为 true,那么 Cookie 只能在HTTPS连接中传输;若为 false,HTTP、HTTPS连接都行。
-
SameSite:限制第三方cookie
有3个值:Strict/Lax/None。chrome51新增,chrome80+强制执行。
- Strict: 仅允许发送同站点请求的的cookie;
- Lax: 仅get请求跨站。
- None: 任意发送cookie,设置为None,需要同时设置Secure,意味着网站必须采用https,若同时支持http和https,可以将http用307跳转到https
-
priority:优先级
优先级,chrome的提案,定义了三种优先级,Low/Medium/High,当cookie数量超出时,低优先级的cookie会被优先清除
Cookie 与 webStorage 的区别
谈到 Cookie 我们不免得会想到,localStorage 以及 sessionStorage 呢,那么它们有什么区别呢?
Cookie | sessionStorage | localStorage | |
---|---|---|---|
有效期 | 默认会话(关闭浏览器后消失,也可设置时间) | 会话(关闭浏览器一会后消失) | 始终有效 |
作用域 | 同站(端口号和协议可以不同,后面会说明) | 当前页面 | 同源 |
大小 | 4kb 左右(各浏览器不同) | 5mb(各浏览器不同) | 5mb(各浏览器不同) |
兼容性 | 用户可禁用 | ie8+ | ie8+ |
有什么情况会必须使用 Cookie 呢?
Cookie的作用域十分巧妙,其为同站(域名相同就行),那么我们在实现单点登录的时候就可以使用 Cookie。现在我们有A.study.com、B.study.com 两个网站,我们可以设置登录 Cookie 的 domain
为.Study.com,那么我们在两个网站都可以获取到登录的 Cookie。如果是跨域单点登录呢?这个时候我们需要借助第三方 Cookie(有兴趣可以百度一下,这里不做延展了)。
但是,目前浏览器都开始逐步禁用第三方 Cookie 了,具体信息可以查看下我的这一个帖子:cookie认证失败
Cookie 设置常见疑问
- Cookie 同源下会进行覆盖,那么不同子域会覆盖吗?
不会,不同子域下不会进行覆盖,即使有两个同名的 Cookie
- domain 默认不带点吗?
domain 默认不带点