🍪

Cookieのkey名にコロン(:)は使ってはいけない(RFC6265)

2024/05/17に公開

要約

  • クライアントサイドで保持するCookieには : は使ってはいけない(たとえフロントエンドでうまく動いていたとしても)
    • [RFC5234] に示されているSyntax以外は使わない方がいい(当たり前)

背景

  • クライアントサイド側でCookieを使用して何らかの状態を管理している
  • Cloudfrontにて特定のKeyを持つCookieのみホワイトリストに入れようとした

内容

AWS Cloudfrontのキャッシュポリシー設定時のコンソールにて、例えば clientNft:WalletAddress などというCookie keyを許可しようとすると以下のエラーに引っ掛かる

The parameter Cookies is invalid. clientNft:WalletAddress contains illegal characters.

Cloudfront error

フロントエンド側(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