Схема кодирования, используемая для файлов cookie

RFC 6265 Sec 6.1 позволяет разрешить по меньшей мере 4096 байт на файл cookie.

Теперь, чтобы узнать количество символов, разрешенных для каждого файла cookie, мне нужно знать кодировку символов, используемую для файлов cookie, поскольку RFC указывает максимальный размер для каждого файла cookie в терминах байты, а не символы.

Как узнать, какая кодировка используется для хранения файлов cookie?

Определяется ли это кодировкой символов, используемой языком программирования, используемым для создания файлов cookie (например, PHP, JavaScript) или кодировкой символов, используемой браузером, хранящим файлы cookie?

Обновление:

Я провел несколько тестов, и кажется, что FF, Chrome и Opera, похоже, используют UTF-8 для хранилища файлов cookie, а кодировка явно влияет на число символов strong > вы можете хранить в cookie. Максимальное количество символов, разрешенных в cookie, будет зависеть от кодировки символов, используемой для хранения файлов cookie на клиенте.

Подозревая, что браузер использует UTF-8 в качестве кодировки символов для файлов cookie, я использовал тесты здесь с однобайтовым UTF-8 символ (1), двухбайтовый символ UTF-8 (£), 3-байтовый символ UTF-8 () и 4-байтовый символ UTF-8 (𝆏). Я вставил результаты, полученные ниже.

В каждом наборе cookie используется однобайтовое имя файла cookie, а число символов не включает однобайтовый символ для имени файла cookie и символ =, используемый для разделения имени файла cookie и значение coookie. Значение в [] рядом с каждым символом Юникода обозначает его шестнадцатеричное представление в UTF-8.

FF 31.0

Firefox ослабляет ограничение RFC байтом и устанавливает ограничение на 4097 байт на файл cookie.

  • 1-байтовый символ (1, [0x31]) - 4095 символов
  • 2-байтовый символ (£, [0xC2, 0xA3]) - 2047 символов
  • 3-байтовый символ (, [0xE7, 0x95, 0x80]) - 1365 символов
  • 4-байтовый символ (𝆏, [0xF0, 0x9D, 0x86, 0x8F]) - 1023 символа

Chrome 36.0.1985.143

  • 1-байтовый символ (1, [0x31]) - 4094 символа
  • 2-байтовый символ (£, [0xC2, 0xA3]) - 2047 символов
  • 3-байтовый символ (, [0xE7, 0x95, 0x80]) - 1364 символа
  • 4-байтовый символ (𝆏, [0xF0, 0x9D, 0x86, 0x8F]) - 1023 символа

Opera 24.0.1558.17

  • 1-байтовый символ (1, [0x31]) - 4094 символа
  • 2-байтовый символ (£, [0xC2, 0xA3]) - 2047 символов
  • 3-байтовый символ (, [0xE7, 0x95, 0x80]) - 1364 символа
  • 4-байтовый символ (𝆏, [0xF0, 0x9D, 0x86, 0x8F]) - 1023 символа

IE 8.0.6001.19518

IE слишком расслабляет ограничение RFC до 5117 байт на файл cookie, но также устанавливает максимальный размер файлов cookie для домена (в этом случае найденный предел составлял 10234 символа)

  • 1-байтовый символ (1, [0x31]) - 5115 символов
  • 2-байтовый символ (£, [0xC2, 0xA3]) - 5115 символов
  • 3-байтовый символ (, [0xE7, 0x95, 0x80]) - 5115 символов
  • 4-байтовый символ (𝆏, [0xF0, 0x9D, 0x86, 0x8F]) - 2557 символов

Примечание по IE:

IE, похоже, использует понятие символов ECMAScript. ECMAScript предоставляет символы как 16-разрядные целые числа без знака (кодировка символов может быть UTF-16 или UCS-2 и оставлена ​​как выбор реализации). 4-байтовый символ, выбранный для тестов, использует два 16-разрядных кодовых блока в UTF-16. И поскольку ECMAScript считает 16-разрядное целое в качестве символа, "𝆏".length === 2 возвращает true. Это приведет к тому, что 𝆏 будет считаться двумя символами.

Ответ 1

Кажется, он определен больше программистом (за браузером), чем языком программирования. Обычно значения cookie кодируются по URL-адресу, но нет необходимости. Посмотрите этот ответ, который завершит ваше исследование (добавив специальный случай Safari). Этот может помочь.

Ответ 2

Независимо от того, как файлы cookie хранятся внутри браузера, они в конечном итоге должны быть перенесены в поля заголовка Set-Cookie и Cookies HTTP Header. Это закодированная длина этих полей, которые, вероятно, имеют в виду авторы RFC. По крайней мере, в большинстве RFC, что было бы так, так почему бы не предположить это здесь. Следовательно, "размер файла cookie" зависит от способа его кодирования в HTTP-заголовке.

Согласно стандарт, поля заголовка запроса должны быть

OCTET, составляющие значение поля и состоящие из * TEXT или комбинаций токенов, разделителей и кавычки

где * TEXT, в свою очередь:

МОЖЕТ содержать символы из наборов символов, отличных от ISO-    8859-1 [22] только при кодировании в соответствии с правилами RFC 2047.

RFC2047 определяет то, что известно как "MIME-кодирование", и, как я его прочитал, имеет некоторые смешные правила. А именно, согласно его правилам, чтобы кодировать иностранную кодировку, вам придется либо использовать формат с кавычками: =?UTF-8?Q?=48=65=6c=6c=6f?=, либо "формат Base64: =?UTF-8?B?SGVsbG8=?=". (Обратите внимание, что оба примера здесь кодируют слово "Привет". Первый использует 27 байтов, второй использует 20, однако это не включает имя и атрибуты файла cookie.)

Кроме того, согласно RFC2047, у вас могут не быть "закодированные слова" длиной более 76 символов, поэтому, если я правильно понимаю вещи, ваши более длинные значения cookie должны быть закодированы как куча 76-байтных фигур, каждая часть начинается с =?UTF-8?Q?= mumbo-jumbo.

Я тестировал, что произойдет, если я установил cookie не-ASCII (русский язык), используя PHP через Apache. В результате заголовок Set-Cookie не имел спецификации кодировки, использовал URL-кодировку и был длиннее 76 байтов (столько для стандартов, верно?):

CookieName =% D0% 92 +% D0...% B0% D0% B9; expires = Thu, 11-Sep-2014 19:59:18 GMT; Путь =/TMP/; домен =.some.domain.

Общая длина значения cookie (с атрибутами), соответствующая 176-символьному предложению в других случаях, составляет 923 байта.

Подводя итог, я не думаю, что вы можете получить строгий ответ на свой вопрос, но это забавный вопрос. Тем не менее.