Cookieのkey名にコロン(:)は使ってはいけない(RFC6265)
要約
- クライアントサイドで保持するCookieには
:
は使ってはいけない(たとえフロントエンドでうまく動いていたとしても)- [RFC5234] に示されているSyntax以外は使わない方がいい(当たり前)
背景
- クライアントサイド側でCookieを使用して何らかの状態を管理している
- Cloudfrontにて特定のKeyを持つCookieのみホワイトリストに入れようとした
内容
AWS Cloudfrontのキャッシュポリシー設定時のコンソールにて、例えば clientNft:WalletAddress
などというCookie keyを許可しようとすると以下のエラーに引っ掛かる
The parameter Cookies is invalid. clientNft:WalletAddress contains illegal characters.
↓
フロントエンド側(Next.js)は問題なく動いてそうな雰囲気…
ふと思い立ってCookie関連の仕様が記載されている、RFC6255 2.2 Syntax Notationを見てみると以下の内容
この仕様では、[RFC5234]の拡張バッカスナウアフォーム(ABNF)表記を使用しています。
[RFC5234]、付録B.1で定義されているように、次のコアルールが参照として含まれています:ALPHA(文字)、CR(キャリッジリターン)、CRLF(CR LF)、CTL(コントロール)、DIGIT(10進数の0-9) 、DQUOTE(二重引用符)、HEXDIG(16進数の0-9 / AF / af)、LF(改行)、NUL(ヌルオクテット)、OCTET(NULを除く任意の8ビットデータシーケンス)、SP(スペース)、HTAB (水平タブ)、CHAR(任意の[USASCII]文字)、VCHAR(任意の表示可能な[USASCII]文字)、およびWSP(空白)。
The OWS (optional whitespace) rule is used where zero or more linear whitespace characters MAY appear:
OWS(オプションの空白)ルールは、0個以上の線形空白文字が表示される場合に使用されます。
OWS = *( [ obs-fold ] WSP ) ; "optional" whitespace obs-fold = CRLF
OWSは、生成されないか、単一のSPキャラクターとして生成される必要があります(SHOULD)。
つまり、うっかり :
を含めたCookie keyを設定していたため、通らなくなっていた模様。
結論
- クライアントサイドで保持するCookieには
:
は使ってはならない- CookieKey には [RFC5234] にて定義されたSyntaxのみ利用可能(当たり前)
Discussion