浏览器cookie机制

160 阅读3分钟

最近遇到了跨域统一认证的一些问题,其中对cookie的操作比较多,而有些属性都忘记了,所以记录一下。(当然,统一认证首推oAuth2.0)

name

  • 该条cookie的key值,如果相同域名(或ip)下设置了相同的名称,则会覆盖
  • 当在不同级别的域名下(二级域名、三级域名)设置了相同的名称,则会保留,这个时候发起的请求会携带多条改名称的信息

value

  • 该条cookie的值
  • 如果在httpOnly:true中设置过,则脚本不能设置该域下相同名称cookie
  • 如果在secure:true中设置过,但当前浏览器域名不是https,则不能设置

expires

  • 如果不传,cookie会调整为回话cookie,会一直保留到浏览器关闭(存放内存中)
  • 如果传入Date为当前时间前,则会删除,如果在之后,则会保留到Date时间点再删除(存放硬盘中)
  • 如果即设置了会话cookie,又设置了普通cookie,则会以后设置的为准

max-age

  • 同expires,但参数是数值,且优先级比expires高
  • 0:立即删除该cookie
  • 负数:该cookie是会话cookie
  • 正数:单位秒,在该时间后删除该cookie

domain

  • cookie生效的域名
  • 可以设置到父域名上,则父域名的子域名都可以获取到

path

  • cookie生效的资源路径(上下文)
  • 默认是/,如果你多个项目使用同一个域名,仅用上下文区分,但不想cookie相互污染影响带宽,就可以使用该属性

httpOnly

  • 类型boolean
  • 如果为true,禁止js访问该cookie,只会在浏览器层面传输

secure

  • 类型boolean
  • 如果为true,则该cookie只会在https中传输

sameSite

推荐阅读:阮一峰老师的Cookie 的 SameSite 属性

用于防御CSRF攻击

  • 值:'Strict'|'Lax'|'None'
  • None:谷歌浏览器中只有在secure为true才能设置,允许所有请求携带该cookie。比如允许a网址的form(post)提交到b网址时,或img(get)使用b网址的资源,携带b网址的该cookie
  • Lax:默认值,只允许第三方get请求携带该cookie。比如从a网站打开b网址的页面,b请求html等资源时会携带cookie
  • Strict:任何情况都不允许第三方携带cookie

sameParty

  • 类型boolean
  • 允许第三方cookie的协同示例

partition key

priority

  • 值:'Low'|'Medium'|'High'
  • 默认值Medium,当cookie存储数量或大小超过浏览器指定阈值时,会删除优先级低的
  • 目前在仅谷歌浏览器中实现了

以下是浏览器删除cookie的策略

  1. 从过期的 Cookie 中
  2. 从 Cookie 数超出预定义数量的域名中删除优先级为 Low 的 Cookie,并保留其最小保留值
  3. 从 Cookie 数超出预定义数量的域名中删除优先级为 Low 和 Medium 的 Cookie,同时需要保留优先级为 Low 以及优先级为 Medium 的 Cookie 至少保留量之和的 Low 与 Medium 的 Cookie
  4. 从 Cookie 超出预定义数量的域名中
  5. 从所有 Cookie 中