是否每个Web请求都发送浏览器的cookie?
我不是在说网页浏览量,而是在请求图像,.js
文件等。
更新 如果一个网页有50个元素,即50个请求。为什么会为每个请求发送SAME cookie,为什么不缓存或知道它已经拥有它?
是否每个Web请求都发送浏览器的cookie?
我不是在说网页浏览量,而是在请求图像,.js
文件等。
更新 如果一个网页有50个元素,即50个请求。为什么会为每个请求发送SAME cookie,为什么不缓存或知道它已经拥有它?
Answers:
是的,只要所请求的URL在cookie中定义的相同域和路径内(以及所有其他限制-安全,仅http,未过期等)成立,则将为每个请求发送cookie。
正如其他人所说,如果满足Cookie的主机,路径等限制,它将被发送50次。
但是您还问为什么:因为cookie是HTTP功能,而HTTP是无状态的。HTTP被设计为无需服务器在请求之间存储任何状态的情况下即可工作。
实际上,服务器没有可靠的方式来识别哪个用户正在发送给定的请求。一个Web代理后面可能有上千个用户(因此还有IP地址)。如果未向每个请求发送cookie,则服务器将无法知道哪个用户正在请求任何资源。
最终,浏览器不知道服务器是否需要cookie,它只是知道服务器指示它向foo.com发送对任何请求的cookie,所以这样做了。有时图像需要它们(例如,按用户动态生成的图像),有时则不需要,但浏览器无法分辨。
是。每个请求都会发送属于同一域的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和图像的更多信息。
不。不是每个请求都发送cookie。这取决于cookie配置和客户端-服务器连接。
例如,如果您的cookie secure
选项设置为,true
则必须通过安全的HTTPS连接进行传输。意味着当您看到具有HTTP协议的网站时,由于安全标志为true,因此浏览器将不会发送这些cookie。
3年过去了
浏览器不会发送cookie的另一个原因。您可以将crossOrigin
属性添加到<script>
代码中,将值添加到中"anonymous"
。这样可以防止将cookie发送到目标服务器。99.9%的时间,您的javascript是静态文件,并且您不会基于请求的cookie生成该js代码。如果您有1KB的Cookie,并且页面上有200个资源,则您的用户正在上传200KB,这可能会花费3G时间,并且对结果页面的影响为零。访问HTML属性:crossorigin以供参考。
我知道这是一个旧线程。但是我刚刚注意到,如果添加尾随点,大多数浏览器都不会为该域发送Cookie。例如,http://example.com.
不会收到为设置的Cookie .example.com
。另一方面,Apache将它们视为同一主机。我发现这对使跨域跟踪对包括的外部资源更加困难很有用,但是出于性能原因,您也可以使用它。请注意,这会破坏https
证书的验证。我已经使用browsershots和我自己的设备进行了一些测试。除野生动物园(移动和台式机)外,该hack几乎可在所有浏览器上使用,该野生动物园将在请求中包含Cookie。
简短的回答是。以下几行来自JS文档
Cookies曾经用于一般的客户端存储。虽然这是合法的,因为它们是在客户端上存储数据的唯一方法,但现在建议使用现代存储API。Cookie随每个请求一起发送,因此它们可能会降低性能(尤其是对于移动数据连接而言)。