客户端如何知道应将哪些 cookie 发送到服务器



当我转到HTTPS服务器时,我可以在开发人员工具(或Fiddler)中看到客户端发送到服务器的请求cookie。但是客户端如何知道,如果服务器没有发送响应cookie,应该发送哪些cookie。至少我在开发人员工具或 Fiddler 中看不到任何响应 cookie。

首先,每个域在饼干罐/饼干存储中都有自己的cookie。每当浏览器向服务器发出请求时,该域或子域的存储中的所有cookie都将发送到服务器。

安全饼干与不安全饼干

安全 cookie 将仅在通过 SSL(https 协议)建立的连接上发送。普通的 cookie 将在 http 和 https 协议上发送。

会话饼干与持久性饼干

  • 会话 Cookie - 只要浏览器会话处于打开状态,这些 Cookie 就会持续存在。这意味着一旦您清除缓存或关闭浏览器,它们就会丢失。

  • 持久性 Cookie - 即使您已将浏览器设置为在退出时清除 Cookie,否则这些 Cookie 也会持续存在,在这种情况下,它们的行为就像会话 Cookie 一样。

第一方饼干与第三方饼干

  • 第一方 Cookie - 由当前作为主文档打开的域生成 - 这意味着它们与您浏览器中显示的域具有相同的域。
  • 第三方 Cookie - 由不同的域生成,然后当前由浏览器打开(在地址栏中),但在 iframe 或各种资源调用(如 CSS、脚本、媒体(图像、视频或其他嵌入式媒体)中管理)

CORS - 通过 xhttp ajax 调用进行跨域调用 - 当您通过 xhttp(ajax 调用)创建域请求来自另一个域的资源时,会出现这种情况。在这种情况下,浏览器会进行预检检查,以查看接收域是否接受来自源域的查询(将源标头发送到域以检查跨域策略)。服务器必须使用有效的选项标头进行响应,并且服务器可能允许 cookie 数据的缩写身份数据。如果远程域已正确应答"访问控制-允许源"标头,该标头允许您的域或"*",则允许您通过此请求发送cookie。这些行为就像正常呼叫一样。

要了解有关 cors 的更多信息:

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

直接回答这个问题:客户端发回它拥有的该域路径的所有cookie 数据。

如果您在任何 HTTP 响应中没有看到任何Set-Cookie标头,则可能是因为在您开始查看Dev Tools 或 Fiddler 之前,cookie 已由服务器发出并存储在您的计算机上。它可能在几天、几周甚至几个月前

。在 Firefox 中,如果您导航到about:preferences#privacy并单击管理数据,您可以查看哪些域已经在您的计算机上发布并存储了 Cookie。Firefox 开发工具中的"存储"选项卡可以显示所有 Cookie 的详细信息。Cookie 的到期时间由服务器使用Set-Cookie标头中的ExpiresMax-Age指令确定。

Cookie 最初是如何出现在客户端计算机上的:

  1. 客户端向服务器发出其第一个HTTP请求,例如GET www.example.com

  2. 服务器创建一个cookie并将其发送回HTTP响应,例如响应标头包含一行:Set-Cookie: sessionID=1234567; path=/; Max-Age=31536000

  3. 客户端接收 HTTP 响应并将 cookie 存储在域www.example.com的"jar"中。

服务器如何使用 Cookie 来识别客户端

在随后对域www.example.com的HTTP请求中,客户端发回jar中与路径或子路径匹配的所有cookie。例如,客户端希望发出请求GET www.example.com/about,看到URL是域www.example.com/的子路径,因此它将cookie作为HTTP请求头中的一行发送,即Cookie: sessionID=1234567.

服务器可以看到 cookie 并确切地知道哪个客户端发出了此请求。

最新更新