Cookie 和 Referer

一、Cookie

1、SecureHttpOnly 标记

  • Secure :标记为 SecureCookie,只应通过被HTTPS协议加密过的请求发送给服务端

  • HttpOnly :标记为 HttpOnlyCookieJavaScript 无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端,避免跨域脚本 XSS

2、SameSite Cookies

SameSite Cookie允许服务器要求某个cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击CSRF。但目前SameSite Cookie还处于实验阶段,并不是所有浏览器都支持。

3、跟localStorage、sessionStorage 相比

特性 Cookie localStorage sessionStorage
生命期 可设置失效时间,默认为session cookiesession cookie无法保证会话结束后,一定会被删除 除非被清除,否则永久保存 仅在当前会话下有效,关闭会话(标签页)后被清除;如果标签页由其他页面打开,当前的sessionStorage会根据前一个页面的sessionStorage数据进行初始化
大小 4K左右 一般为5MB 一般为5MB
通信 每次都会携带在HTTP头中 仅在客户端中保存,不参与和服务器的通信 仅在客户端中保存,不参与和服务器的通信
作用域 通过domain、path来确定 通过协议、主机名、端口来确定 通过协议、主机名、端口、标签来确定。不同标签页面,sessionStorage数据无法共享

注:cookie通过【name,doamin,path】来确定其唯一性,倘若三个属性都一样方为同一个cookie


4、读写cookie

1
2
3
4
5
6
// 读取所有可从此位置访问的Cookie
let allCookies = document.cookie;

// 一次只能对一个cookie进行设置或更新
// newCookie是一个键值对形式的字符串
document.cookie = newCookie;

注:以下可选的cookie属性值可以跟在键值对后,用来具体化对cookie的设定/更新使用分号以作分隔。在浏览器控制台中,document.cookie值,对应当前资源的可见cookie值。

  • ;path=path 如果没有定义,默认为当前文档位置的路径
  • ;domain=domain 如果没有定义,默认为当前文档位置的路径的域名部分
  • ;max-age=max-age-in-seconds
  • ;expires=date-in-GMTString-format 如果没有定义,cookie会在对话结束时过期
  • ;secure 只通过https协议传输


5、cookie匹配规则

浏览器在加载静态资源或者发出ajax请求时,会根据url中的域名与路径,对每个cookie的domain属性path属性进行验证,存在多个同名cookie时,按一定排序都带上。

请求http://news.example.com/news/hot时, 带上的cookie要满足:

  • domain属性news.example.com,及其上级域名
  • path属性/news/hot,及其上级路径


6、cookie排序原则

  • 具有更长path的cookie更靠前
  • 如果path长度相等,更早创建的cookie更靠前


二、Referer

Referer 表示请求页面是通过此来源页面里的链接进入的,在以下两种情况下,Referer 不会被发送:

  • 来源页面采用的协议为表示本地文件的 “file” 或者 “data” URI
  • 当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)

注:

  • 在浏览器中,Referer 属性只读不写。但可以通过代理服务进行修改
  • 如果需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转