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
.
Это приведет к тому, что 𝆏
будет считаться двумя символами.