Cookies 与语言无关的cookie编码/解码标准

Cookies 与语言无关的cookie编码/解码标准,cookies,encoding,language-agnostic,decoding,web-standards,Cookies,Encoding,Language Agnostic,Decoding,Web Standards,无论后端平台如何,我都很难弄清楚编码/解码cookie值的标准是什么(或者有什么标准?) 根据: 该值对于用户代理是不透明的,可能是源服务器选择发送的任何内容,可能是服务器选择的可打印ASCII编码。“不透明”意味着内容仅与源服务器相关。事实上,任何检查Set Cookie头的人都可以读取该内容 这听起来像是“服务器就是老板”,它决定了将应用何种编码。这使得从PHP后端设置cookie并从Python或Java或其他任何地方读取cookie非常困难,而不需要在两侧编写任何手动编码/解码处理 假设

无论后端平台如何,我都很难弄清楚编码/解码cookie值的标准是什么(或者有什么标准?)

根据:

该值对于用户代理是不透明的,可能是源服务器选择发送的任何内容,可能是服务器选择的可打印ASCII编码。“不透明”意味着内容仅与源服务器相关。事实上,任何检查Set Cookie头的人都可以读取该内容

这听起来像是“服务器就是老板”,它决定了将应用何种编码。这使得从PHP后端设置cookie并从Python或Java或其他任何地方读取cookie非常困难,而不需要在两侧编写任何手动编码/解码处理

假设我们有一个值需要编码。俄语
/“cookie value”(曲奇值)的意思是“cookie value”(曲奇值),其中包含一些额外的非字母数字字符

Python:

几乎每个WSGI服务器都做同样的事情,并且使用Python的类进行编码/解码,尽管很多人说在ECMA-262中,strict mode.Wtf

因此,我们的原始cookie值变为
“/\”\320\277\320\265\321\207\320\265\320\275\321\214\320\265(*}\320\267\320\275\320\260\321\207\320\265\320\275\320\321\217\“/”

Node.js:

还没有测试过,但我只是猜测JavaScript后端会使用本机和使用转义/取消转义的函数来完成吗

PHP:

PHP应用于类似但不完全相同的cookie值

因此原始值变成;
%2F%22%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D1%8C%D0%B5+%28%2A%7D+%D0%B7%D0%BD%D0%B0%D1%87%D0%D0%D0%B8%D1%f%22%2F
,甚至没有用双引号括起来

但是,如果JavaScript
value
变量具有上面的PHP编码值,
decodeURIComponent(value)
给出
/“Пччччз”/
,请参见“+”字符而不是空格


Java、Ruby、Perl和.NET中的情况如何?以下哪种语言(或最接近的语言)实际上,W3对此有什么标准吗?

我想你这里有点混淆了。服务器的编码对客户端来说并不重要,也不应该。这就是RFC 2109试图在这里说的

http中Cookie的概念与现实生活中的类似:在支付俱乐部入场费后,你的手腕上会有一个墨水印。这允许你不必再次付款就可以离开和重新进入俱乐部。你所要做的就是向保镖展示你的手腕。在这个现实生活中的例子中,你不在乎它是什么样子,甚至可能是invisi在正常情况下,保镖是不可抗拒的——重要的是保镖能认出这东西。如果你想洗掉它,你将失去不必再次付款就可以重新进入俱乐部的特权

在HTTP中也发生了同样的事情。服务器使用浏览器设置cookie。当浏览器返回到服务器(读取:下一个HTTP请求)时,它会向服务器显示cookie。服务器识别cookie,并相应地采取行动。这样的cookie可以是像“WasHereBefore”这样简单的东西再次强调,浏览器理解它是什么并不重要。如果你删除了你的cookie,服务器就会表现得好像它以前从未见过你一样,就像你洗掉墨迹时俱乐部的保镖一样

如今,许多cookie只存储一条重要信息:会话标识符。其他所有信息都存储在服务器端并与该会话标识符关联。该系统的优点是,实际数据永远不会离开服务器,因此可以信任。存储在客户端的所有信息都可以篡改和删除不可信


编辑:在再次阅读您的评论和问题之后,我想我终于了解了您的情况,以及为什么您对cookie的实际编码感兴趣,而不仅仅是将其留给您的编程语言:如果您在同一台服务器上有两个不同的软件环境(例如:Perl和PHP),您可能需要解码由另一种语言设置的cookie。在上面的示例中,PHP必须解码Perl cookie,反之亦然

关于如何将数据存储在cookie中没有标准。该标准只说明浏览器将完全按照收到的cookie发送回。所使用的编码方案是您的编程语言认为合适的

回到现实生活中的例子,你现在有两个保镖,一个说英语,另一个说俄语。这两个保镖必须在一种墨水印章上达成一致。这很可能涉及至少一个保镖学习另一个的语言

由于浏览器行为是标准化的,您可以在服务器上使用的所有其他语言中模仿一种语言的编码方案,也可以在使用的所有语言中创建自己的标准化编码方案。您可能必须使用较低级别的例程,例如PHP的
header()
而不是更高级别的例程,如
start\u session()
来实现这一点


顺便说一句:同样,服务器端编程语言决定如何存储服务器端会话数据。您不能通过使用PHP的
$\u session
数组访问Perl的
CGI::session

无论cookie对客户端是不透明的,它仍然需要符合HTTP规范。指定所有HTTPADER应该是ASCII(ISO-8859-1)。扩展它以支持其他字符集,但我不知道它的支持范围有多广。

我更喜欢将其编码为UTF8,并使用base64编码进行包装。它速度快、无处不在,并且不会在两端损坏数据

您需要确保一个明确的