バックエンド プラットフォームに関係なく、Cookie の値をエンコード/デコードするための標準が何であるか (または何かありますか?) を理解するのが困難です。
RFC 2109によると:
VALUE はユーザー エージェントに対して不透明であり、サーバーが選択した印刷可能な ASCII エンコーディングで、オリジン サーバーが送信することを選択したものである可能性があります。「不透明」とは、コンテンツが重要であり、オリジン サーバーにのみ関連することを意味します。実際、コンテンツは、Set-Cookie ヘッダーを調べれば誰でも読み取ることができます。
これは「サーバーがボス」のように聞こえ、適用するエンコーディングを決定します。これにより、両側で手動のエンコード/デコード処理を記述せずに、たとえば PHP バックエンドから Cookie を設定し、Python や Java などから読み取ることが非常に困難になります。
値をエンコードする必要があるとしましょう。ロシア語/"печенье (*} значения"/
は、英数字以外の文字が追加された「Cookie 値」を意味します。
パイソン:
ほとんどすべての WSGI サーバーは同じことを行い、8 進リテラルはECMA-262 の厳密モードでは減価償却されていると多くの人が言っていますが、8 進リテラルをエンコード/デコードするPython のSimpleCookieクラスを使用します。え?
したがって、生の 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 バックエンドは、16 進数のエスケープ/エスケープ解除を使用するネイティブのencodeURIComponentおよびdecodeURIComponent関数でそれを行うと思いますか?
PHP:
PHP は、 encodeURIComponentに似ていますが、まったく同じではないurlencodeを 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%B5%D0%BD%D0%B8%D1%8F%22%2F
二重引用符で囲まれていません。
でも; JavaScriptvalue
変数が上記の PHP でエンコードされた値を持っている場合、decodeURIComponent(value)
が与えられ/"печенье+(*}+значения"/
ます。スペースの代わりに「+」文字を参照してください。
Java、Ruby、Perl、.NET の状況は? どの言語が望ましい動作に従っている (または最も近い) か。実際、W3によって定義されたこれに対する標準はありますか?