Мне трудно понять, что является стандартом (или есть ли он?) для кодирования/декодирования значений cookie независимо от серверных платформ.
Согласно RFC 2109:
ЗНАЧЕНИЕ непрозрачно для пользовательского агента и может быть чем угодно, что отправит исходный сервер, возможно, в выбранной сервером печатной кодировке ASCII. «Непрозрачный» означает, что содержимое представляет интерес и имеет отношение только к исходному серверу. На самом деле содержимое может быть доступно для чтения любому, кто просматривает заголовок Set-Cookie.
что звучит как «сервер - босс», и он решает, какая кодировка будет применяться. Это затрудняет установку файла cookie, скажем, из бэкэнда PHP, и чтение его из Python, Java или чего-то еще, без написания какой-либо ручной обработки кодирования/декодирования с обеих сторон.
Допустим, у нас есть значение, которое нужно закодировать. Русское /"печенье (*} значения"/
означает «значение файла cookie» с некоторыми дополнительными небуквенно-цифровыми символами.
Питон:
Почти каждый сервер WSGI делает то же самое и использует класс Python SimpleCookie, который кодирует в/декодирует из восьмеричные литералы, хотя многие говорят, что восьмеричные литералы устаревают в строгом режиме ECMA-262. Втф?
Итак, наше необработанное значение 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\270\321\217\"/"
Node.js:
Вообще не тестировал, но я просто предполагаю, что бэкэнд JavaScript сделает это с собственным encodeURIComponent и функции decodeURIComponent, которые используют шестнадцатеричный экранирование/неэкранирование?
PHP:
PHP применяет urlencode к значениям cookie, аналогично encodeURIComponent, но не совсем то же самое.
Таким образом, необработанное значение становится; %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%B5%D0%BD%D0%B8%D1%8F%22%2F
, который даже не заключен в двойные кавычки.
Однако; если переменная JavaScript value
имеет закодированное в PHP значение, указанное выше, decodeURIComponent(value)
дает /"печенье+(*}+значения"/
, см. символы «+» вместо пробелов..
Какова ситуация с Java, Ruby, Perl и .NET? Какой язык соответствует (или наиболее близок) к желаемому поведению. На самом деле, есть ли какой-либо стандарт для этого, определенный W3?