每个网络请求都发送浏览器cookie吗?

每个网络请求都会发送浏览器的cookie吗?

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

< b >更新 如果一个网页有50个元素,那就是50个请求。为什么它会为每个请求发送相同的cookie(s),它不是缓存或知道它已经有了它吗?< / p >

106653 次浏览

是的,只要请求的URL在cookie中定义的相同域和路径(以及所有其他限制——安全、httponly、未过期等)保持,那么cookie将为每个请求发送。

是的。每个请求都发送属于同一个域的cookie。它们不是缓存的,因为HTTP是无状态的,这意味着每个请求都必须足够让服务器知道如何处理它。假设你的图片只能被特定的用户访问;你必须在这50个请求中每一个都发送你的认证cookie,所以服务器知道这是你而不是其他人,或者是一个客人,在它得到的请求池中。

话虽如此,鉴于其他响应中提到的其他限制,例如HTTPS设置、路径或域,cookie可能不会被发送。特别是在这里,有一件重要的事情需要注意:cookie不会在域之间共享。这有助于减少对静态文件(例如您提到的图像和脚本)的HTTP调用的大小。
例子:你在www.stackoverflow.com有4个cookie;如果你向www.stackoverflow.com/images/logo.png发出请求,所有这4个cookie都会被发送。
然而,如果你请求stackoverflow.com/images/logo.png(注意子域的变化)或images.stackoverflow.com/logo.png,这4个cookie将不会出现——但可能与这些域相关的cookie会出现

你可以阅读更多关于cookie和图像请求,例如,在这个StackOverflow博客文章

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

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

事实上,服务器没有一个可靠的方法来识别哪个用户发送了一个给定的请求;一个web代理(IP地址)背后可能有1000个用户。如果不是每个请求都发送cookie,服务器将无法知道哪个用户正在请求任何资源。

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

三年过去了

浏览器不发送cookie还有另一个原因。你可以将crossOrigin属性添加到你的<script>标记中,并将值添加到"anonymous"中。这将防止cookie被发送到目标服务器。99.9%的情况下,javascript脚本是静态文件,你不会根据请求的cookie生成js代码。如果您有1KB的cookie,而您的页面上有200个资源,那么您的用户上传200KB,这在3G上可能需要一些时间,并且对结果页面没有任何影响。访问HTML属性:crossorigin作为参考。

我知道这是个老话题了。但我刚刚注意到,如果你在域名后面加一个点,大多数浏览器都不会发送cookie。例如,http://example.com.将不会接收为.example.com设置的cookie。另一方面,Apache将它们视为相同的主机。我发现这有助于使我所包含的外部资源的跨域跟踪变得更加困难,但您也可以出于性能原因使用它。注意,这将阻止https证书的验证。我使用浏览器截图和我自己的设备进行了一些测试。黑客几乎适用于所有浏览器,除了safari(移动和桌面),它将在请求中包含cookie。

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

例如,如果你的cookie的secure选项被设置为true,那么它必须通过安全的HTTPS连接传输。意味着当你看到该网站与HTTP协议,然后这些cookie不会被浏览器发送,因为安全标志是真的。

Cookie有一个“path”属性。如果“path=/”,答案是Yes。

简短的回答是肯定的。下面的行是来自JS文件

cookie曾经被用于一般的客户端存储。虽然当它们是在客户端上存储数据的唯一方式时,这是合法的,但现在建议使用现代存储api。cookie随每个请求一起发送,因此它们会降低性能(特别是对于移动数据连接)。