【问题标题】:Multiple Set-cookie headers in HTTPHTTP 中的多个 Set-cookie 标头
【发布时间】:2016-02-02 06:24:11
【问题描述】:

我正在编写一个充当非常基本的 HTTP 客户端的小类。作为我正在从事的项目的一部分,我正在让它知道 cookie。但是,我不清楚当我的客户端收到多个具有相同键但设置了不同值的“Set-Cookie”标头时会发生什么。

例如,

Set-Cookie: PHPSESSID=abc; path=/
Set-Cookie: PHPSESSID=def; path=/
Set-Cookie: PHPSESSID=ghi; path=/

其中哪一项应该是 PHPSESSID 的值?当您在同一页面上调用 session_start() 和 session_regenerate_id() 时,通常会发生这种情况。每个都将设置自己的标题。所有浏览器似乎都可以这样做,但我似乎无法让我的客户选择正确的。

有什么想法吗?!

【问题讨论】:

    标签: http browser http-headers


    【解决方案1】:

    RFC 6265 section 4.1.2 状态:

    如果用户代理收到具有相同 cookie 名称的新 cookie,
    域值和路径值作为它已经存储的 cookie,
    现有的 cookie 被驱逐并替换为新的 cookie。
    请注意,服务器可以通过向用户代理发送 a
    来删除 cookie 具有过去值的 Expires 属性的新 cookie。

    所以我会按给定的顺序处理标题,如果有重复,我会覆盖它们。因此,在您的情况下,您将只有一个 PHPSESSID=ghi。

    【讨论】:

      【解决方案2】:

      RFC 6265 状态:

      服务器不应在具有相同 cookie 名称的同一响应中包含多个 Set-Cookie 标头字段。

      因此,如果您的服务使用相同的密钥发送多个 Set-Cookie 标头,我会非常担心。特别是因为我看到用户代理和代理的行为出乎意料 - 有时取第一个标头的值,有时重新排列标头。

      作为客户端,典型的用户代理行为似乎是取最后一个标头的值。 RFC 通过以下声明暗示了这种行为:

      如果用户代理接收到一个新的 cookie,其 cookie 名称、域值和路径值与其已存储的 cookie 相同,则现有 cookie 将被逐出并替换为新 cookie。

      【讨论】:

      • 并不是说不应该发送多个 set-cookie 标头。它表示具有相同 cookie 名称的多个标头。
      • 已修复,以防从 OP 的上下文中不清楚。
      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2018-01-20
      相关资源
      最近更新 更多