HTTP cookie,简称cookie,又称数码存根、“网站/浏览+魔饼/魔片”等,是浏览网站时由网络伺服器创建并由网页浏览器存放在用户电脑或其他装置的小文本文件。
Cookie使Web伺服器能在用户的装置存储状态资讯(如添加到在线商店购物车中的商品)或跟踪用户的浏览活动(如点击特定按钮、登录或记录历史)[1]。
历史
“cookie”一词由网络浏览器程序员卢·蒙特利创造,源自“magic cookie”(1979年就已经出现,当时指UNIX程序收发的数据包)[2][3]。“magic cookie”这词本身来自幸运饼[4]。
卢·蒙特利在1994年6月[5]想到这点子时正在网景工作,公司则正在为MCI开发电子商务应用程式。文顿·瑟夫和约翰·克伦辛代表MCI与网景讨论技术,表示不希望总是由其伺服器保存事务状态,而要求网景将状态存储在用户电脑。Cookies便是网景提出的解决方案[6][7]。
同年,蒙特利与约翰·詹南德雷亚一起编写了最初的网景cookie规范。1994年10月13日发布的网景导航者0.9beta版开始支持cookie[8]。它公开的首次使用目的是检查网景网站的访问者是否已经访问过该网站。蒙特利于1995年申请了cookie技术的专利,1998年获批(US 5774670)。1995年10月发布的第2版Internet Explorer也宣布支持cookie[9]。
当时,cookie并未为公众所知,虽然默认用户接受cookie,网站并不会通知用户其存在。1996年2月12日,英国《金融时报》发表文章介绍cookie,使其为大众所知[10]。其潜在的隐私问题也引起讨论,1996年和1997年的美国联邦贸易委员会两次就cookie举行听证会[11]。
互联网工程任务组专门成立了工作小组规范cookie的用法。布莱恩·贝伦多夫和大卫·克里斯托分别提出两套有关HTTP事务状态的替代方案。但由克里斯托本人和蒙特利领导的小组很快决定还是使用网景规范。1996年2月,工作组将第三方cookie确定为严重隐私威胁。该小组制定的规范RFC 2109最终于1997年2月发布,要求第三方cookie要么根本不允许,要么至少默认不启用。[12]
网景的cookie头字段为Set-Cookie,
RFC 2965添加了Set-Cookie2
头字段,即“RFC 2965 cookie”[13][14],但Set-Cookie2
很少使用,终于2011年4月的RFC 6265中弃用[15],已经没有现代浏览器可以识别Set-Cookie2
头字段[16]。
结构
- 名;
- 值;
- 各种属性。
一块cookie可能有Domain、Path、Expires、Max-Age、Secure、HttpOnly等多种属性,如
HTTP/1.0 200 OK
Set-Cookie: LSID=DQAAAK…Eaem_vYg; Path=/accounts; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly
Set-Cookie: HSID=AYQEVn…DKrdst; Domain=.foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; HttpOnly
Set-Cookie: SSID=Ap4P…GTEq; Domain=foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly
…
Domain
和Path
属性定义了cookie的范围。它们告诉浏览器cookie属于什么网站。Cookies只能设置在当前资源的顶级域及其子域上。
如果伺服器未指定cookie的Domain
和Path
,则它们默认为所请求资源的域和路径[20]。
Expires
属性定义了浏览器应删除cookie的时间,格式为Wdy, DD Mon YYYY HH:MM:SS GMT
或Wdy, DD Mon YY HH:MM:SS GMT
(YY大于或等于0并且小于等于69)。[21]
此外也可用Max-Age
将cookie的过期时间设置为某一段时间之后(相对于浏览器接收cookie的时间而言)。但Internet Explorer等浏览器可能不支持Max-Age
[22][23]。
Secure
属性旨在将cookie加密,使浏览器仅通过安全/加密连接使用cookie。
HttpOnly
要求浏览器不要通过HTTP(和HTTPS)以外的渠道使用cookie。这意味着无法通过客户端脚本语言(尤其是JavaScript)访问cookie,因此无法通过跨站点脚本攻击轻易窃取。[24]
分类
持久cookie只在其创建者设置的特定日期后过期,期间一直有效。
用途
虽然最初引入cookie是为了让用户在浏览网站时记录要购买的物品[6][7]。但现在用户购物车的内容通常存储在伺服器的数据库中,而不再是客户端的cookie中。
当前会话cookie的常见用途是登录。当用户访问网站的登录页面时,Web伺服器通常会向客户端发送一个包含唯一会话标识符的cookie。当用户成功登录时,伺服器会记住该特定会话标识符已经过身份验证,并授予用户访问其服务的权限。
许多网站用cookie存储用户偏好等设置,向用户显示喜好内容。
跟踪cookie用于跟踪记录用户的网络浏览习惯,如用户的购物习惯。
浏览器设置
大多数现代浏览器都支持cookie并允许用户禁用它们,以下是常见选项:[27]
- 完全启用或禁用cookie,以便它们始终被接受或始终被阻止;
- 使用cookie管理器查看和有选择地删除cookie;
- 彻底清除cookie等所有私人数据。
安全和隐私
网页可能第三方服务,使用网页很可能会遇到第三方cookie(访问网页外其他伺服器的cookie)。RFC 2109和RFC 2965要求浏览器保护用户隐私,默认不允许在伺服器间共享cookie,但RFC 6265放宽。大多数浏览器只要第三方网站有合理的隐私政策申明,就默认允许第三方cookie。[32]
广告是第三方cookie常见的使用场景,广告公司借此跟踪用户。网站应当告知用户有第三方cookie存在,不向消费者披露第三方cookie使用情况的网站运营商可能面临法律风险,一般网站都会在隐私或cookie政策说明其使用的第三方cookie。[33]
很多网站用cookie作为用户的唯一标识符,但如果网站使用cookie作为会话标识符,攻击者就可以窃取受害者的全套cookie来冒充其请求。
参考文献
外部链接
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.