【问题标题】:How client know which cookies should be send to the server客户端如何知道应该将哪些 cookie 发送到服务器
【发布时间】:2018-09-17 08:32:12
【问题描述】:

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

【问题讨论】:

    标签: http cookies request response


    【解决方案1】:

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

    安全 cookie 与不安全 cookie

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

    会话 cookie 与持久性 cookie

    • 会话 cookie - 只要浏览器会话打开,这些 cookie 就会一直存在。这意味着一旦您清除缓存或关闭浏览器,它们就会丢失。

    • 持久性 cookie - 即使浏览器关闭并再次打开,这些也会持续存在,除非您将浏览器设置为在退出时清除 cookie,在这种情况下它们的行为就像会话 cookie。

    第一方 cookie 与第三方 cookie

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

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

    要阅读有关 cors 的更多信息:

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

    【讨论】:

    • 我仍然不明白浏览器是如何知道应该发送什么 cookie 的:/ 当浏览器想要访问某个域/服务器时,他会发送带有 cookie 的 http 请求和服务器响应标头,不是吗?
    • cookies保存在浏览器中,浏览器在某处为每个域维护一个cookie文件。一旦向该域发出请求,cookie 文件的全部内容就会作为 cookie 发送到服务器。这些 cookie 可能是由服务器或通过 javascript 调用生成的。 cookie 不一定是由服务器先前的响应创建的。
    • 啊,所以可以有 JavaScript 制作的 cookie,在这种情况下,服务器没有设置 cookie 响应?
    • 是的,cookie 也可以由 JavaScript 设置,但它们也可能是由先前的调用发出的,例如大多数会话 id 是在登录时发出的,但它们总是在每次请求时重新发送,即使之前的请求没有发出它们。
    【解决方案2】:

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

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

    在 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请求头中的一行发送,即@987654333 @。

    服务器看到 cookie 并确切知道是哪个客户端发出了这个请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多