用于cookie的编码方案

Bha*_*tri 5 browser unicode cookies

RFC 6265 Sec 6.1指定每个cookie至少允许4096个字节。

现在,为了知道每个cookie允许的字符数,我需要知道用于cookie的字符编码,因为RFC指定了每个cookie的最大大小,以字节单位,而不是character

我如何知道用于存储Cookie的编码?

是由用于创建cookie的编程语言所使用的字符编码(例如PHP,JavaScript)还是由存储cookie的浏览器所使用的字符编码来确定的?

更新:

我进行了一些测试,看来FF,Chrome和Opera似乎正在使用UTF-8进行cookie存储,并且编码显然会影响您可以存储在cookie中的字符数。Cookie中允许的最大字符数将受到用于在客户端上存储Cookie的字符编码的影响。

怀疑浏览器使用UTF-8作为cookie的字符编码,因此我在这里使用了单字节UTF-8字符(1),两字节UTF-8字符(£),3字节UTF-8字符的测试(?)和一个4字节的UTF-8字符()。我已经粘贴了下面获得的结果。

每个cookie集都使用单字节cookie名称,并且提到的字符数不包括 cookie名称的单字节字符以及=用于分隔cookie名称和coookie值的字符。[]每个Unicode字符旁边的值表示UTF-8中的十六进制表示形式。

FF 31.0

Firefox放宽RFC限制一个字节,并为每个cookie限制4097字节。

  1. 1字节字符(1,[0x31])-4095个字符
  2. 2字节字符(£,[0xC2,0xA3])-2047个字符
  3. 3个字节的字符(?,[0xE7、0x95、0x80])-1365个字符
  4. 4字节字符(,[0xF0、0x9D,0x86、0x8F])-1023个字符

铬36.0.1985.143

  1. 1字节字符(1,[0x31])-4094个字符
  2. 2字节字符(£,[0xC2,0xA3])-2047个字符
  3. 3个字元(?,[0xE7,0x95,0x80])-1364个字元
  4. 4字节字符(,[0xF0、0x9D,0x86、0x8F])-1023个字符

歌剧24.0.1558.17

  1. 1字节字符(1,[0x31])-4094个字符
  2. 2字节字符(£,[0xC2,0xA3])-2047个字符
  3. 3个字元(?,[0xE7,0x95,0x80])-1364个字元
  4. 4字节字符(,[0xF0、0x9D,0x86、0x8F])-1023个字符

IE 8.0.6001.19518

IE也将RFC限制放宽到每个cookie 5117字节,但也强制每个域限制cookie的最大大小(在这种情况下,发现的限制为10234个字符)

  1. 1字节字符(1,[0x31])-5115个字符
  2. 2字节字符(£,[0xC2,0xA3])-5115个字符
  3. 3个字节的字符(?,[0xE7、0x95、0x80])-5115个字符
  4. 4字节字符(,[0xF0、0x9D,0x86、0x8F])-2557个字符

注意IE:

IE似乎正在使用ECMAScript的字符概念。ECMAScript将字符公开为16位无符号整数(字符编码可以为UTF-16或UCS-2,并留作实现选择)。为测试选择的4字节字符在UTF-16中使用两个16位代码单元。并且由于ECMAScript将16位整数作为字符进行计数,所以"".length === 2返回true。这导致被视为两个字符。

Coc*_*nop 7

似乎它更多地由程序员(在浏览器后面)决定,而不是由编程语言决定。通常 cookie 值是 URL 编码的,但没有要求。
查看完成您研究的这个答案(添加 Safari 特例)。这个也可能有帮助。


KT.*_*KT. 5

无论浏览器内部如何存储 cookie,它们最终都必须在Set-CookieCookiesHTTP 标头字段中传输。RFC 作者最可能想到的是这些字段的编码长度。至少在大多数 RFC 中都是如此,所以为什么不在这里假设它。因此,“cookie 的大小”取决于它在 HTTP 标头中的编码方式。

根据标准,请求头字段应该是

组成字段值的 OCTET,由 *TEXT 或标记、分隔符和带引号的字符串的组合组成

其中 *TEXT 依次为:

仅当根据 RFC 2047 规则进行编码时,才可以包含 ISO-8859-1 [22] 以外的字符集中的字符。

RFC2047定义了所谓的“MIME 编码”,据我读到,它有一些有趣的规则。也就是说,根据其规则,为了对外部字符集进行编码,您必须使用“quoted-printable”格式:=?UTF-8?Q?=48=65=6c=6c=6f?=或“Base64 格式:=?UTF-8?B?SGVsbG8=?=”。(请注意,这里的两个示例都对单词“Hello”进行编码。第一个使用 27 个字节,第二个使用 20 个字节,但这不包括 cookie 名称和属性)。

此外,根据 RFC2047,你的“编码字”长度可能不超过 76 个字符,因此,如果我理解正确的话,你的较长 cookie 值将必须编码为一堆 76 字节的片段,每个片段都以 mumbo=?UTF-8?Q?=开头-巨型。

我测试了如果我通过 Apache 使用 PHP 设置非 ASCII(俄语)cookie 会发生什么。生成的Set-Cookie标头没有字符集规范,使用 URL 编码并且长度超过 76 个字节(对于标准来说就这么多,对吧?):

CookieName=%D0%92+%D0...%B0%D0%B9; 过期=2014 年 9 月 11 日星期四 19:59:18 GMT;路径=/tmp/;域=.some.domain。

与 176 个字符的句子相对应的 cookie 值(带有属性)的总长度为 923 个字节。

总而言之,我认为您无法得到问题的严格答案,但这仍然是一个有趣的问题。