[解決済み】Cookieに使用できる文字は何ですか?
質問
クッキーの名前と値の両方に使用できる文字は何ですか?URLと同じですか、それとも何か共通のサブセットですか?
なぜかというと、最近、クッキーに
-
ブラウザ固有の問題なのか、それとも私のコードに欠陥があるのか、ちょっと疑問に思っています。
解決方法は?
<ブロッククオートこれは早い話が
と思われるかもしれませんが、実は全然そんなことないんです!
<ブロッククオートCookie名と値の両方に使用できる文字は何ですか?
古代のNetscapeによると
cookie_spec
を使用すると、全体の
NAME=VALUE
の文字列があります。
セミコロン、カンマ、空白を除いた一連の文字。
そこで
-
は動作するはずで、私が持っているブラウザーでは問題ないようですが、どこで問題があるのでしょうか?
上記の意味合いから
-
=
を含めることは合法ですが、曖昧になる可能性があります。ブラウザは常に名前と値を最初の=
記号を文字列の中に入れることができるので、実際には=
記号を VALUE に含めることはできますが、NAME には含められません。
Netscapeは仕様を書くのが下手なので、言及されていませんが、ブラウザでは一貫してサポートされているようです。
-
NAMEまたはVALUEのいずれかが空文字列である可能性があります。
-
がない場合は
=
記号が全くない場合、ブラウザはそれを空文字列の名前を持つクッキーとして扱います、つまりSet-Cookie: foo
と同じです。Set-Cookie: =foo
. -
ブラウザが空の名前のクッキーを出力するとき、等号は省略されます。そのため
Set-Cookie: =bar
はCookie: 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を消費するコードはほとんどどんなものにも遭遇する準備ができているはずです。
関連
-
[解決済み] クッキーでAPIを取得する
-
[解決済み] Cypress のテスト間で Cookie / localStorage セッションを保持する。
-
[解決済み] ローカルストレージとCookieの比較
-
[解決済み] localStorage、sessionStorage、session、cookieの違いは何ですか?
-
[解決済み] ブラウザのCookieドメインはどのように機能するのですか?
-
[解決済み] HTTPクッキーはポート指定ですか?
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】Cookieに使用できる文字は何ですか?
-
[解決済み】ドメインを明示したローカルホスト上のクッキー
-
[解決済み] クロスオリジンリクエストにCookieを設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] クッキーでAPIを取得する
-
[解決済み] Cypress のテスト間で Cookie / localStorage セッションを保持する。
-
[解決済み] Firefox DevToolsでCookieを編集・削除する方法は?
-
[解決済み】Cookieに使用できる文字は何ですか?
-
[解決済み】すべてのWebリクエストは、ブラウザのクッキーを送信しますか?
-
[解決済み】JavaScriptでクッキーを名前で読み取るための最短関数は何ですか?
-
[解決済み] 第三者の「トラッキングクッキー」はどのように機能するのですか?
-
[解決済み] Cookieのドメインにあるドットプレフィックスとはどういう意味ですか?