Допускаются ли в HTTP-запросе несколько заголовков cookie?

94

Обычно браузер группирует файлы cookie в один Cookieзаголовок, например:

Cookie: a=1; b=2

Стандарт позволяет отправлять их как отдельные заголовки, например:

Cookie: a=1
Cookie: b=2

Или они всегда должны быть на одной линии?

Бенджамин
источник

Ответы:

129

Зашел на эту страницу, пока искал подробности по теме. Цитата из HTTP State Management Mechanism, RFC 6265 должен сделать вещи яснее:

5.4. Заголовок cookie

Когда пользовательский агент генерирует HTTP-запрос, пользовательский агент НЕ ДОЛЖЕН присоединять более одного поля заголовка Cookie.

Похоже , что использование нескольких Cookieзаголовков является , по сути, запрещено!

Джеймс Чонг
источник
8
Эти безумные новомодные RFC. :)
Kylar
12
Обратите внимание, что сервер может отвечать несколькими Set-Cookieзаголовками: tools.ietf.org/html/rfc6265#page-7
Майкл Харен,
2
Почему отрицательный голос, как OP конкретно спросил с точки зрения HTTP-запроса, а не HTTP-ответа. @JeffDavenport
Джеймс Чонг
2
Для тех, кто пришел сюда из Google, например Джеффа, OP показывает, что у вас может быть несколько переменных, разделив их знаком ";" (место не нужно)
Альберт Хендрикс
2
@HawkeyeParker - может не значит правильного . Я бы сказал, что Set-Cookie:a=b;c=d;это более правильно, чем Set-Cookie:a=b; Set-Cookie:c=d;если бы значения устанавливались одним сервером. В спецификации говорится, что сервер не должен складывать несколько полей заголовка Set-Cookie в одно поле , но он может добавить несколько полей заголовка Set-Cookie в один ответ . В реальном мире это означает, что когда прокси-сервер передает ответ, если этот прокси устанавливает файлы cookie, он должен использовать отдельный заголовок Set-Cookie.
Golphy
24

теперь это разрешено в HTTP / 2 ( RFC 7540 ), который определяет:

    8.1.2.5.  Compressing the Cookie Header Field

   The Cookie header field [COOKIE] uses a semi-colon (";") to delimit
   cookie-pairs (or "crumbs").  This header field doesn't follow the
   list construction rules in HTTP (see [RFC7230], Section 3.2.2), which
   prevents cookie-pairs from being separated into different name-value
   pairs.  This can significantly reduce compression efficiency as
   individual cookie-pairs are updated.

   To allow for better compression efficiency, the Cookie header field
   MAY be split into separate header fields, each with one or more
   cookie-pairs.  If there are multiple Cookie header fields after
   decompression, these MUST be concatenated into a single octet string
   using the two-octet delimiter of 0x3B, 0x20 (the ASCII string "; ")
   before being passed into a non-HTTP/2 context, such as an HTTP/1.1
   connection, or a generic HTTP server application.

   Therefore, the following two lists of Cookie header fields are
   semantically equivalent.

     cookie: a=b; c=d; e=f

     cookie: a=b
     cookie: c=d
     cookie: e=f
Wusatosi
источник