1. ホーム
  2. cookies

[解決済み】Cookieに使用できる文字は何ですか?

2022-03-27 06:32:38

質問

クッキーの名前と値の両方に使用できる文字は何ですか?URLと同じですか、それとも何か共通のサブセットですか?

なぜかというと、最近、クッキーに - ブラウザ固有の問題なのか、それとも私のコードに欠陥があるのか、ちょっと疑問に思っています。

解決方法は?

<ブロッククオート

これは早い話が

と思われるかもしれませんが、実は全然そんなことないんです!

<ブロッククオート

Cookie名と値の両方に使用できる文字は何ですか?

古代のNetscapeによると cookie_spec を使用すると、全体の NAME=VALUE の文字列があります。

セミコロン、カンマ、空白を除いた一連の文字。

そこで - は動作するはずで、私が持っているブラウザーでは問題ないようですが、どこで問題があるのでしょうか?

上記の意味合いから

  • = を含めることは合法ですが、曖昧になる可能性があります。ブラウザは常に名前と値を最初の = 記号を文字列の中に入れることができるので、実際には = 記号を VALUE に含めることはできますが、NAME には含められません。

Netscapeは仕様を書くのが下手なので、言及されていませんが、ブラウザでは一貫してサポートされているようです。

  • NAMEまたはVALUEのいずれかが空文字列である可能性があります。

  • がない場合は = 記号が全くない場合、ブラウザはそれを空文字列の名前を持つクッキーとして扱います、つまり Set-Cookie: foo と同じです。 Set-Cookie: =foo .

  • ブラウザが空の名前のクッキーを出力するとき、等号は省略されます。そのため Set-Cookie: =barCookie: bar .

  • 名前と値の間のカンマとスペースは実際に機能するようですが、等号の周りのスペースは切り捨てられます

  • 制御文字 ( \x00 から \x1F プラス \x7F は使用できません。

言及されておらず、ブラウザが全く一貫していないのは、非ASCII(ユニコード)文字です。

  • OperaとGoogle Chromeでは、CookieヘッダはUTF-8でエンコードされます。
  • IEでは、マシンのデフォルトのコードページが使用されます(ロケールに固有であり、決してUTF-8ではありません)。
  • Firefox (および他の Mozilla ベースのブラウザ) は、各 UTF-16 コードポイントの下位バイトを独自に使用します (したがって ISO-8859-1 は OK ですが、それ以外はマングルされます)。
  • SafariはASCII以外の文字を含むCookieの送信を単純に拒否しています。

ですから、実際にはクッキーに非ASCII文字を使用することは一切できません。Unicodeや制御コード、その他の任意のバイト列を使いたい場合、cookie_specはあなた自身が選んだアドホックなエンコーディングスキームを使うよう要求し、URLエンコーディング(JavaScriptの encodeURIComponent が妥当な選択である。

という点では 実際 標準では、Cookie の動作を成文化する試みがいくつか行われていますが、実際の世界を反映したものは今のところありません。

  • RFC 2109 は、オリジナルのNetscapeのcookie_specを体系化し、修正する試みでした。この規格では、より多くの特殊文字が禁止されています。 RFC 2616 トークン( - 今も そこで許可されている)、値のみが他の文字と引用符で囲まれた文字列で指定されることがあります。この制限、引用文字列とエスケープの特別な処理、この仕様の新機能を実装したブラウザはありません。

  • RFC 2965 は、2109を整理し、「バージョン2クッキー」スキームの下でより多くの機能を追加した、別の試みでした。これも誰も実装しませんでした。この仕様は、以前のバージョンと同じトークンと引用文字列の制限を持ち、同じようにナンセンスなものです。

  • RFC 6265 は、歴史的な混乱を一掃するための HTML5 時代の試みです。少なくとも、ブラウザがサポートする適切なサブセットであり、(以前の quoted-string のように)機能するはずなのに機能しない構文を導入することはありません。

6265では、クッキー名はまだRFC2616で指定されています。 token ということは、英数字プラスから選ぶことができます。

!#$%&'*+-.^_`|~

クッキーの値では、(ブラウザによってフィルタリングされた)制御文字と(実装が一貫していない)非ASCII文字を正式に禁止しています。さらに、以前のRFCを実際に実装した愚かな人たちとの互換性を保つために、バックスラッシュと引用符も禁止しており、引用符で値全体を囲むことも禁止しています(ただしこの場合、引用符はエンコーディング方式ではなく、まだ値の一部とみなされます)。そのため、英数字プラスが残されました。

!#$%&'()*+-./:<=>?@[]^_`{|}~

現実の世界では、私たちはまだオリジナルで最悪のNetscapeのcookie_specを使っているので、cookieを消費するコードはほとんどどんなものにも遭遇する準備ができているはずです。