- 发布时间
cookie
- 作者

- Name
- wenjuGao
- github
- @Github
使用
- 创建
cookie的创建动作可以从服务端发起返回给客户端,也可以从客户端发起提交给服务端
- 服务端发起返回给客户端服务端在响应头(response)中添加Set-Cookie告知客户端在其本地设置cookie(该部分操作,一般客户端在解析HTTP请求的响应是自主完成,无需开发者做额外的操作)
Set-Cookie: <cookie名>=<cookie值>;Expires=<过期时间> - 客户端发起提交给服务端注意:通过 javascript 创建的 Cookie 不能包含 HttpOnly 标志。(设置了HttpOnly的cookie,客户端通过javascript无法访问)
document.cookie = `${cookie名}=${cookie值};${cookie名1}=${cookie值1};`
属性
- name:cookie名
- value:cookie值
- Domain
- Cookie的作用域:允许携带Cookie的域名
- 不指定,默认为 origin,不包含子域名
- 指定,包含子域名
- Path
- Cookie的作用域:允许携带Cookie的地址
- Expires/Max-Age:生命周期
- 会话期 Cookie:浏览器关闭(关闭所有tab)之后它会被自动删除,不需要指定过期时间(Expires)或者有效期(Max-Age)。注意有些浏览器提供了会话恢复功,使删除的cookie被恢复。
- 持久性 Cookie:决于过期时间(Expires)或有效期(Max-Age)指定的一段时间
- size:大小(name和value一起是字符数量)
- HttpOnly(限制访问)
- 无法通过Document.cookie访问带有 HttpOnly 属性的cookie
- Secure(限制访问)
- 标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端
- SameSite
- 允许服务器要求某个 cookie 在跨站请求时不会被发送,参数不区分大小写
- None:客户端会在同站请求、跨站均发送 cookies
- Strict:只有访问服务端地址与客户端地址时发送 cookie
- Lax:与Strict一致,但是从外部站点导航至URL时不发送(图片加载、frames、 link等)
- priority
document.cookie = newCookie;
newCookie是一个键值对形式的字符串:
- name (必要) :要创建或覆盖的cookie的名字
- value (必要) :cookie的值
- end (必要) :最大年龄的秒数 (一年为31536e3, 永不过期的cookie为Infinity)
- path (可选) :如果没有定义,默认为当前文档位置的路径
- domain (可选) :如果没有定义,默认为当前文档位置的路径的域名部分,如果指定了一个域,那么子域也包含在内
- max-age (可选) =max-age-in-seconds 过期时间
- expires (可选) =date-in-GMTString-format 如果没有定义,cookie会在对话结束时过期
- secure (可选) (cookie只通过https协议传输)
带来的问题
- 传输负担
- 每次HTTP请求都会携带cookie增加了传输的负担
- 但是话又话又说回来,如果没有更好的方式,来取代cookie这种增加额外数据的形式来标记状态(客户端身份)的方法,cookie带来的传输性能负担也不能称之为问题
- 安全问题
- 会话劫持和 XSS
- 跨站请求伪造(CSRF)
- 中间人攻击(Man-in-the-middle attack,MitM)
- 会话固定攻击(session fixation attacks)