# Cookie

# Cookie 是什么?

cookie 是一些数据,用于存储 web 端的用户数据。它用于解决 “如何记录客户端的用户信息

当浏览器从服务器上请求 web 页面时,属于该页面的 cookie 会被添加到该请求中。服务端通过这种方式来获取用户的信息。

# Cookie 的特点

  • cookie 始终在同源的 http 请求中携带,会在浏览器和服务器间来回传递。
  • cookie 有路径的概念,可以把它限制在某个路径下(最好能子域可见就不要主域)
  • 一个 cookie 的大小一般在 4K 以内,具体看浏览器。
  • 不同浏览器对一个域名下 cookie 的数量限制不一样,像 ie6 限制最多 50 个,firefox3.6 限制 150 个

# Cookie 使用方法

Cookie 以名 / 值对的形式存储,如下所示:

username=Orange; expires=......; path=/

# 设置 Cookie

function setCookie(cname,cvalue,exdays)
{
  var d = new Date();
  d.setTime(d.getTime()+(exdays*24*60*60*1000));
  var expires = "expires="+d.toGMTString();
  document.cookie = cname + "=" + cvalue + "; " + expires;
}

# 读取指定的 Cookie

function getCookie(cname)
{
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for(var i=0; i<ca.length; i++) 
  {
    var c = ca[i].trim();
    if (c.indexOf(name)==0) return c.substring(name.length,c.length);
  }
  return "";
}

# Cookie 相关字段

# Expires

这个值用于设置 Cookie 的过期时间,通常是一个绝对时间。如果不指定,则表示是一个临时会话的 cookie。浏览器关闭时会失效

# Max-age

和 Expires 作用类似,但是他的值是一个相对时间(秒为单位)。并且他的优先级比 expires 更高。

当它的值为负数的时候表示是一个临时会话 cookie。

# Domain

Domain 指定 cookie 可以送达的域名。如果不指定,默认为当前文档访问地址的域名。

子域名一般可以使用指定为父域名的 cookie。比如 taobao.com 下的 cookie,a.taobao.com 可以使用。

# Path

Path 指定一个资源路径,请求的资源路径必须出现该路径才可以发送 cookie。

如指定为 /docs,则 /docs/a 可以使用,但 /test 不可以。

Domain 和 Path 共同指定了 Cookie 的作用域

# Http-only

设置 HTTPOnly 属性可以防止客户端脚本通过 document.cookie 等方式访问 Cookie,有助于避免 XSS 攻击。

# Secure

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。

# SameSite

它的值有三个:Strict,Lax,None.

在 Strict 下,会完全禁止第三方 cookie。只在当前网页和请求目标网页的 URL 完全一致时才可发送请求网页的 cookie

这个属性可以避免 csrf,因为以往 csrf 在访问某一个网站时,这个网站向另外一个网站发送的请求,默认会发送请求的那个网站的 cookie。

但是如果设置了 samesite 的 strict,必须当前网页和请求网页的 url 完全一致,才能发送请求网页的 cookie。

# LocalStorage 和 SessionStorage

# 相同点

  • 两者都属于浏览器端存储,前者为本地存储,后者为会话存储
window.localStorage // 直接访问 localStorage
window.sessionStorage
  • 两者的操作语法基本一致
localStorage.setItem("name","orange");
localStorage.getItem("name");
localStorage.removeItem("name");
localStorage.clear();
//SessionStorage 的操作语法一样。
  • 两者都遵循同源策略,跨域无法访问。
  • 两者各自拥有 5MB 的存储空间(实际这个大小只是建议,不同浏览器的限制不一样,chrome 下确实是 5M 左右,但像 Safari 中本地存储只有 2551K,会话存储却超过 10M),并且只能保存字符串类型的数据。

# 不同点

  • 本地存储本身不会失效,除非手动删除。会话存储仅在关闭浏览器窗口之前有效(仅在会话页面失效时失效,即刷新页面和回退、恢复等时不会失效)
  • 有效范围不同。不跨域情况下本地存储可以跨页签生效,而会话存储只在当前页签有效。

其实还有一个前端数据库 IndexDB,不过现在的我暂时用不上,先不去看,等要用上的时候再去学习总结。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

orange 微信支付

微信支付

orange 支付宝

支付宝

orange 贝宝

贝宝