是否每个Web请求都发送浏览器cookie?


197

是否每个Web请求都发送浏览器的cookie?

我不是在说网页浏览量,而是在请求图像,.js文件等。

更新 如果一个网页有50个元素,即50个请求。为什么会为每个请求发送SAME cookie,为什么不缓存或知道它已经拥有它?


8
在这种情况下,我认为不可能进行缓存-我们所说的是浏览器向服务器发送数据,而不是相反。由于多种原因,您不能肯定地说用户发送一个请求后服务器“已经拥有”。可能有很多服务器无法互相通信;服务器可能不希望(或没有空间)完全记住以前的请求-HTTP应该是无状态的;每个请求都应独立于其余请求。因此,必须随每个请求一起发送cookie(如身份验证凭据)。
伊恩·克莱兰(Ean Clelland)2009年

我在更新我的答案时提到了为什么缓存对cookie没有意义:stackoverflow.com/a/1336178/102960
igorsantos07

Answers:


198

是的,只要所请求的URL在cookie中定义的相同域和路径内(以及所有其他限制-安全,仅http,未过期等)成立,则将为每个请求发送cookie。


103
顺便说一下,这就是为什么诸如Google Page Speed或Yahoo的YSlow之类的页面速度工具建议从单独的,无cookie的域中提供静态内容的原因。
ceejayoz

我在更新后的答案中提到了从一个单独的域提供内容的问题:stackoverflow.com/a/1336178/102960
igorsantos07 '18

当存在从站点1到站点2的HTTP重定向时,浏览器是否发送站点2 Cookies?
Zeigeist,

92

正如其他人所说,如果满足Cookie的主机,路径等限制,它将被发送50次。

但是您还问为什么:因为cookie是HTTP功能,而HTTP是无状态的。HTTP被设计为无需服务器在请求之间存储任何状态的情况下即可工作。

实际上,服务器没有可靠的方式来识别哪个用户正在发送给定的请求。一个Web代理后面可能有上千个用户(因此还有IP地址)。如果未向每个请求发送cookie,则服务器将无法知道哪个用户正在请求任何资源。

最终,浏览器不知道服务器是否需要cookie,它只是知道服务器指示它向foo.com发送对任何请求的cookie,所以这样做了。有时图像需要它们(例如,按用户动态生成的图像)​​,有时则不需要,但浏览器无法分辨。


1
使用多路复用方案的HTTP 1.1是否正确?即,请求被捆绑到单个TCP连接中。当然,每个请求都会收到并附带Cookie的副本。但是如果担心的是大量传输重复,HTTP 1.1可以进行优化。尽管我不知道它是否真的...
克里斯·诺2009年

1
然后问题变成“浏览器打算将cookie附加到哪些请求?” 服务器使用cookie设置策略,以决定应将cookie发送回哪个域和哪个URL路径,但是随后忘记了。您需要一种方法来指定连接中的某些请求具有cookie,而其他请求则没有。除非在每个请求中都明确包含它们,否则在HTTP / 1.1中绝对不存在。老实说,一种更好的(兼容标准的)减少带宽的解决方案将是客户端gzip内容编码,但尚无人支持。
伊恩·克莱兰(Ean Clelland)2009年

1
@Ian Clelland:客户端必须发送第一条消息,因此它不知道服务器将为Accept-Encoding发送什么(如果服务器发送该字段,则HTTP / 1.1§14.3表示其请求标头)。问题是,即使在同一台服务器上,它也可能随URL的不同而变化,并且会随着时间的推移而变化,因此使其正常工作是不平凡的。
derobert

1
@Chris:不,Keepalive只是节省了TCP连接设置/拆卸的开销,仅此而已。仍然为每个请求发送完整的标头。但是,管道传输(发送多个请求而不等待响应)可以极大地帮助您。HTTP / 1.1§8.1提供了详细信息。
德罗伯特

21

是。每个请求都会发送属于同一域的cookie。它们不会被缓存,因为HTTP是无状态的,这意味着每个请求必须足以使服务器确定如何处理它。假设您拥有只能由某些用户访问的图像;您必须随50个请求中的每个请求一起发送身份验证cookie,以便服务器知道它是您自己,而不是其他人(或来宾)。

话虽如此,但鉴于其他响应中提到的其他限制(例如HTTPS设置,路径或域),可能不会发送cookie。特别要注意的是,在域之间不共享cookie。这有助于减少对静态文件(例如您提到的图像和脚本)的HTTP调用的大小。
例如:你有4种饼干的www.stackoverflow.com; 如果您向发送请求www.stackoverflow.com/images/logo.png,则将发送所有这4个Cookie。
但是,如果您请求stackoverflow.com/images/logo.png(请注意子域更改)或images.stackoverflow.com/logo.png,则不会显示这4个Cookie,但可能会显示与这些域相关的cookie。

例如,您可以在此StackOverflow博客文章中了解有关请求Cookie和图像的更多信息。


10

不。不是每个请求都发送cookie。这取决于cookie配置和客户端-服务器连接。

例如,如果您的cookie secure选项设置为,true则必须通过安全的HTTPS连接进行传输。意味着当您看到具有HTTP协议的网站时,由于安全标志为true,因此浏览器将不会发送这些cookie。


7

Cookie具有“路径”属性。如果“ path = /”,答案为是。


是的,您可以组织您的网站/应用程序结构,以便所有需要cookie的URL都是wthin /app/或类似的名称-它可以保留可移植性,而无需单独的子域来消除多余的开销。或者,您也可以放弃目前无用的Google Analytics(分析)。我已经看过Cookie标头很长时间了,不知道祖母是否在编织它们。
杰克

7

3年过去了

浏览器不会发送cookie的另一个原因。您可以将crossOrigin属性添加到<script>代码中,将值添加到中"anonymous"。这样可以防止将cookie发送到目标服务器。99.9%的时间,您的javascript是静态文件,并且您不会基于请求的cookie生成该js代码。如果您有1KB的Cookie,并且页面上有200个资源,则您的用户正在上传200KB,这可能会花费3G时间,并且对结果页面的影响为零。访问HTML属性:crossorigin以供参考。


请解释。
杰克

4
@Jake,您可以将crossOrigin属性添加到您的<script>标记中,并将值添加为“ anonymous”。这样可以防止将cookie发送到目标服务器。99.9%的时间,您的javascript是静态文件,并且您不会基于请求的cookie生成该js代码。如果您有1KB的Cookie,并且页面上有200个资源,则您的用户正在上传200KB,这可能需要3G的时间,并且对结果页面的影响为零。请访问developer.mozilla.org/en-US/docs/Web/HTML/…以获取参考。
吉尔姆(Gilm)'17年

4

我知道这是一个旧线程。但是我刚刚注意到,如果添加尾随点,大多数浏览器都不会为该域发送Cookie。例如,http://example.com.不会收到为设置的Cookie .example.com。另一方面,Apache将它们视为同一主机。我发现这对使跨域跟踪对包括的外部资源更加困难很有用,但是出于性能原因,您也可以使用它。请注意,这会破坏https证书的验证。我已经使用browsershots和我自己的设备进行了一些测试。除野生动物园(移动和台式机)外,该hack几乎可在所有浏览器上使用,该野生动物园将在请求中包含Cookie。


如何“使包含的外部资源更难以跨域跟踪”?您是在谈论Farcebook Like之类的小部件吗?我们知道它们会跟踪意外登录的用户吗?
杰克

是。这将使它变得更加困难,因为大多数浏览器不会一起发送cookie。因此,例如,如果您包含google.com中的内容,并且您已登录google,则google无法链接这两个请求。这不能保证很严格,某些浏览器仍然会发送cookie,并且可靠的方法和使用较少的方法来识别仍然有效的用户(例如IP地址)。最大的缺点是您不能使用HTTPS,这使它今天变得毫无用处。
Gellweiler '17

0

简短的回答是。以下几行来自JS文档

Cookies曾经用于一般的客户端存储。虽然这是合法的,因为它们是在客户端上存储数据的唯一方法,但现在建议使用现代存储API。Cookie随每个请求一起发送,因此它们可能会降低性能(尤其是对于移动数据连接而言)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.