专栏首页子曰五溪可爱可恨的 Cookie

可爱可恨的 Cookie

Cookie 曾一度用于客户端数据的存储,由于历史原因这是那个年代唯一可以使用的存储手段,通常情况下 Cookie 都是由服务端向用户客户端发送的一小块数据,它会在同一个请求中被携带重新回到服务端,不可否认的是 Cookie 在一定的历史条件下为用户体验增进了极大的可能性,因为:

  • 会话管理(登录一次一段周期内不需要再次登录)
  • 个性化设置(比如皮肤主题)
  • 浏览器行为追踪(用于分析用户行为,精准的为你推荐你想要的)

但是,随着现代浏览器开始支持各种各样的存储方式,Cookie 也会随着历史进程而被淘汰。一个普通的 Cookie 被创建其实很简单,当服务器接收到请求时,可以在响应头里添加一个 Set-Cookie 字段,浏览器在收到响应时会保存这一份 Cookie ,之后对该服务的请求中,浏览器会自动的将此 Cookie 又发送给了服务端,这就完成了一次有意义的 Cookie 过程。

Set-Cookie: = <cookie名>=<cookie值>

Cookie 虽然看起来仅仅是一句字符串,麻雀虽小却五脏俱全,它有一系列的字段来描述,比如:过期时间,域,路径,适应站点 等等属性,这些属性完整的构成了一条有效的 Cookie。

会话期 Cookie 是一个最简单的 Cookie ,它会随着浏览器关闭而被自动删除。与会话期 Cookie 相对应的是一种可以被长久持有的 Cookie ,这种被长久持有的 Cookie 需要被指定 Expires 或 Max-Age。

由于 HttpOnly 标记的存在,前端的 document.cookie 只能处理有限的 Cookie,它可以创建一个 Cookie 也可以访问无 HttpOnly 标记的 Cookie,这种有限的处理方式可以有效的避免 XSS 攻击。

document.cookie

关于 Cookie 的 Domain 和 Path 则是定义了关于 Cookie 可以被哪些 Domain 或 Path 访问,举个例子如果该 Cookie 的 Domain 被设置为 icepy.me ,那么该 Cookie 也被包含在子域名中,如 developer.icepy.me。

比较遗憾的是前端的 document.cookie 这个简陋的 API 对于处理 Cookie 是极度不友好的,因此,多数情况下我们都会选择一个第三方库来完成 Cookie 的操作。如果你已经阅读到了这里,其实就能很明白在前端中操作 Cookie 的原理,如果我们要实现一个很简单的创建 Cookie,那么就要进行一些简单的处理,如:

value = encodeURIComponent(String(value));
key = encodeURIComponent(String(key));

let stringifiedAttributes = '';

for (let attributeName in attributes){
 if (!attributes[attributeName]){
   continue;
 }
 stringifiedAttributes += '; ' + attributeName;
 if (attributes[attributeName] === true){
   continue;
 }
 stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
}

return document.cookie = key + '=' + value + stringifiedAttributes;

众所周知的原因,目前互联网上被追踪的技术主要还在使用 Cookie ,这也是今天我想讲一讲的主题,关于追踪和隐私的事情,抛开 Web Storage API 不谈(因为这种情况下可以被理解为一种僵尸Cookie),多数情况下,每一个 Cookie 都会有一个与之关联的 Domain,如果 Cookie 的 Domain 与当前页面的域相同,我们称之为第一方 Cookie,如果 Cookie 的 Domain 与当前页面的域不同,那么我们将它称之为第三方 Cookie。多数情况下,我们在浏览网页时看见的广告,都可以归纳为第三方 Cookie,用来追踪一个潜在的广告客户。

如果是稍微有良心一些的服务提供者,可能会遵循 DNT 原则,也就是所谓的禁止追踪 Do-Not-Track,前端可以通过navigator.doNotTrack来访问用户的浏览器是否开启了 DNT,但这并不是一个强制性的技术实现,而是完全凭借服务提供商的业界良心是否遵循这一原则。

如果你将访问的页面使用的是 Web Storage API 来完成的追踪,那么这很遗憾,虽然大多数的浏览器默认就启动了屏蔽了第三方Cookie ,但是它很难被绕过,虽然 Firefox 43 开始支持,如果用户禁止了第三方 Cookie ,同样的第三方 iframes 对 Web Storage 的访问将被禁止,这种情况依然需要信任服务提供访问。

想想,这其实很糟糕;

隐私 真是一个可爱可恨的事情,除非有人能专门去做这样的事情。正好 https://mijisou.com 秘迹搜索是一个真正可以保护你个人隐私的网络搜索服务,它不会记录任何你的查询关键字,也从不存储你的个人信息,不传播你的任何信息,真正做到搜索不留痕,摆脱你不想要的定向广告的骚扰和可能的隐私泄露,它完美的符合了我的预期。

我们可以通过 Storage Inspector 手动的探索一下,如它所言,这确实是没有任何记录和追踪的搜索服务。

如果你已经被广告骚扰烦了,不妨来试一试;

本文分享自微信公众号 - 子曰五溪(fed-talk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go JSON

    如今在网络编程中JSON这种数据格式占据了较大的市场,如果不出意外,几乎新开发的数据交互,都会使用JSON这种轻量级的数据格式来处理数据交互。所以,怎么解析,转...

    icepy
  • 新人小韭菜上车-数字货币

    在写这篇分享时,很有必要说一说前因后果。真正开始听说比特币的时候还是2011年,是幸运也是不幸,曾经花了不到100块人民币入了5个。那个时候就抱着好玩的心态,接...

    icepy
  • 早读《Const Assertions in Literal Expressions in TypeScript》

    https://mariusschulz.com/blog/const-assertions-in-literal-expressions-in-typescr...

    icepy
  • Go Web 编程--如何确保Cookie数据的安全传输

    Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发...

    KevinYan
  • 【Web技术】238-全面了解Cookie

    浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的...

    pingan8787
  • 【Web技术】245-全面了解Cookie

    浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的...

    pingan8787
  • Android 中cookie的处理详解

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

    砸漏
  • Cookie

    Cookie 是服务器保存在浏览器的一小段文本信息。浏览器每次向服务器发出请求,就会自动附上这段信息。

    代码之风
  • cookie、session和application超详解说

    一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好久没用又给忘了,结果还得查资料。是...

    泰斗贤若如
  • 状态管理-Cookie

    qubianzhong

扫码关注云+社区

领取腾讯云代金券