Http 如何处理多个同名cookie?

Http 如何处理多个同名cookie?,http,cookies,Http,Cookies,例如,我让一个应用程序发送以下HTTP头,将其设置为名为“a”的cookie: 如果我在服务器上访问/example,两个路径都是有效的,因此我有两个名为“a”的cookie!由于浏览器不发送任何路径信息,因此无法区分这两个cookie Cookie: a=2; a=1 这个案件应该如何处理?挑第一个?是否创建包含所有cookie值的列表?或者,这种情况应该被视为开发人员的错误吗?如果需要区分它们,则必须为它们指定不同的键值。我当然知道,有一些应用程序广泛使用多个会话ID来实现这一点,并且似乎

例如,我让一个应用程序发送以下HTTP头,将其设置为名为“a”的cookie:

如果我在服务器上访问
/example
,两个路径都是有效的,因此我有两个名为“a”的cookie!由于浏览器不发送任何路径信息,因此无法区分这两个cookie

Cookie: a=2; a=1

这个案件应该如何处理?挑第一个?是否创建包含所有cookie值的列表?或者,这种情况应该被视为开发人员的错误吗?

如果需要区分它们,则必须为它们指定不同的键值。

我当然知道,有一些应用程序广泛使用多个会话ID来实现这一点,并且似乎能够始终如一地工作。但是我不知道——也不打算知道——他们是否这样做,因为浏览器返回cookie的顺序是一致的,这取决于cookie的设置时间/设置路径,或者应用程序是否尝试将每个cookie与现有会话相匹配

我强烈建议避免这种做法

但是,如果您真的想知道浏览器(和应用程序)如何处理这种情况,为什么不构建一个测试平台并尝试一下呢。

来自:

如果多个同名cookie与给定的请求URI匹配,则浏览器会选择一个

路径越具体,优先级越高。但是,基于其他属性(包括域)的优先级未指定,并且可能因浏览器而异。这意味着,如果您对“.example.org”和“www.example.org”设置了相同名称的cookie,则无法确定将返回哪个cookie


编辑:2010年的这些信息似乎已经过时,浏览器现在似乎可以发送多个cookie作为回报,请参阅下面@Nate的答案以了解详细信息

为同一名称提供多个值没有什么错。。。如果你想要的话。您甚至可以在值中嵌入其他上下文

如果您不这样做,那么如果您想要两种上下文,那么当然可以使用不同的名称

另一种方法是发送具有相同路径(和域)的相同cookie名称,甚至从更具体的路径发送。这些设置cookie指令将覆盖该cookie的值


既然您知道了最重要的部分(它们是如何工作的),并且您可以通过几种不同的方式完成所需的工作,那么我对您的问题的回答是:这是一个开发人员问题。

关于SitePoint上文章的答案并不完全完整。请参阅(公平地说,该RFC是在2011年发布的,在该问题发布后,该RFC取代了2000年和1997年发布的RFC)

第2节第2小节规定:

用户代理应按以下顺序对cookie列表进行排序:

  • 路径较长的Cookie列在路径较短的Cookie之前
注意:并非所有用户代理都按此顺序对cookie列表排序,但是 订单反映了编写本文件时的常见做法, 从历史上看,存在(错误地)依赖的服务器 这道菜

第节中还有一块小宝石:

。。。服务器不应依赖于序列化顺序。在里面 特别是,如果Cookie头包含两个具有相同属性的Cookie 名称(例如,使用不同的路径或域属性设置的名称), 服务器不应依赖这些cookie在标头中的显示顺序

在您的示例请求cookie(cookie:a=2;a=1)中,请注意,具有路径/示例(a=2)的cookie集的路径比具有路径/(a=1)的cookie集的路径长,因此它会首先发送回您,这与规范的建议相匹配。因此,您可以选择第一个值的假设或多或少是正确的

不幸的是,在RFCs中使用的语言非常具体——这些词的使用应该也不应该在RFCs中引入歧义。这些说明了应该遵循的约定,但不要求符合规范。虽然我非常了解RFC,但我还没有做研究来了解真实世界的客户会做什么;作为HTTP客户端的一个或多个浏览器或其他软件可能不会首先在cookie:头中发送最长路径cookie(例如:/example)

如果您能够控制cookie的值,并且希望使您的解决方案万无一失,那么您最好:

  • 在某些路径中使用不同的cookie名称进行覆盖,例如:

    • 设置cookie:a-global=1;路径=/;版本=1
    • 设置cookie:a-example=2;Path=/示例;版本=1
  • 在cookie值本身中存储所需的路径:

    • 设置cookie:a=1&path=/;路径=/;版本=1
    • 设置cookie:a=2&path=/example;Path=/示例;版本=1

  • 这两种解决方法都需要服务器上的附加逻辑来选择所需的cookie值,方法是将请求的URL与可用cookie列表进行比较。不太漂亮。不幸的是,RFC没有预见性地要求较长的路径完全用较短的路径覆盖cookie(例如:在您的示例中,您将收到cookie:a=2)。

    如果您使用Java/Scala框架,播放:小心!如果一个请求包含多个同名cookie,Play将只向您的代码显示其中一个cookie。

    我会尽最大努力(阅读:尽我所能)避免重复cookie名称。大多数人从未遇到过这个问题——这是有原因的。网站只能读取自己的cookie。它无法读取其他网站/域的cookie。这种安全性由浏览器来保证。这可能是给初学者的提示(我有点困惑)服务器无法控制浏览器发送给它的内容。它仍然需要处理。那么如何删除多个相同的cookie呢?我已经苦思冥想了两天,重复的曲奇饼似乎坚不可摧
    Cookie: a=2; a=1