cookieの値の読み込みに対する注意事項

ColdFusionでブラウザから渡されてきたCookieの値を取得する際は、内部エンジンで動作しているTomcatの設定に依存します。デフォルトの状態では、以前のColdFusionのバージョンとの互換性を保つため、LegacyCookieProcessorというTomcat 8がデフォルトとしていた旧モードで動いています。このモードについての詳細は、下記のサイトが非常に参考になります。

https://meetup-jp.toast.com/2429

LegacyCookieProcessorというモードでは、Cookieにセットする値は、インターネット技術の標準化をまとめたRFC2965に沿って、特殊文字やスペース、HTTP1.1の仕様で定める区切りを使用しないことを要求されています。

例えば、Cookieにセットする値を aaa@aaa.com とした場合、「@」はHTTP1.1の仕様で区切りとして使用される文字のため、@以下の文字が切り捨てられる(消去される)動作となります。そのため、そのような値をCookieの値としてセットしたい場合は、「特殊文字をエンコードする」か「それらを含む文字を二重引用符で囲む」必要があります。

  • <cfcookie>タグでaaa@aaa.comをセットした場合は、前者のエンコードを使用して、自動的に@が%40にURLエンコードされてから値にセットします。
    • <cfcookie name="a" value="aaa@aaa.com" expires="1" >
      → Set-Cookie: A=aaa%40aaa%2Ecom; Expires=Thu, 31-Mar-2022 04:27:23 GMT; Path=/
  • <cfheader>を使用して、二重引用符で@を含む文字を囲む方法も可能です
    • <cfheader name="Set-Cookie" value='A="aaa@aaa.com"; Max-Age=86400; Path=/'>
      →Set-Cookie: A="aaa@aaa.com"; Max-Age=86400; Path=/

URLエンコードされたCookieの値は、ColdFusionでCookie変数として読み込まれる際に自動的にデコードされます。ですので、Cookieの作成も呼び出しもColdFusionだけで完結しているのであれば、URLエンコードは意識せずに利用することができます。



ところが、ColdFusion以外のソフトウェアによって、URLエンコードも二重引用符も含まないCookieが生成されていた場合は、現行の動作では@以下の文字が切り捨てられてしまいます。これを回避するには、以下の2つの方法のどちらかを検討してください。

  1. 問題となる値を含むCookieを、CGI変数のHTTP_Cookieの値から取得する。
    • ブラウザから送信されたCookieは、CGI変数のHTTP_Cookieに「;区切りのリスト」として保持しています。CGI変数から問題となるCookieの値を取得して処理に利用します。
      • ColdFusionで値がエンコードされている場合は、値をURLDecode関数を使ってデコードする必要があります。
      • CGI.HTTP_Cookieの;区切りのリストの値を、以下のユーザー定義関数で構造体に変換するなども活用できると思われます
        https://cflib.org/udf/ListToStruct
         
  2. Tomcat側で新しい技術仕様(RFC6265)をベースとしたCookie処理に変更する
    • ColdFusion 2018や2021に含まれているTomcatでは、より新しい技術仕様(RFC6265)に沿ったCookieの処理に切り替えることができます。ただし、変更に伴い、機能の一部で制限やエラーが生じますので、該当する機能を使用されていないかを確認して、使用の有無の判断を行ってください。
      【変更方法】
      1. ColdFusion 2021 / 2018 を停止します
      2. [cf_root]/インスタンス(cfusion等)/runtime/conf/context.xmlをメモ帳等テキストエディタ等で開き、下記をコメントアウトしま

        <!-- Default cookie processor class in 8.5.x is Rfc6265CookieProcessor
        Changing it to LegacyCookieProcessor as previous versions of Tomcat have
        been using it. New implementation is breaking cookie implementation --->
        <CookieProcessor
        className="org.apache.tomcat.util.http.LegacyCookieProcessor" />


        <!-- Default cookie processor class in 8.5.x is Rfc6265CookieProcessor
        Changing it to LegacyCookieProcessor as previous versions of Tomcat have
        been using it. New implementation is breaking cookie implementation
        <CookieProcessor
        className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
        -->
      3. ColdFusion 2021 / 2018 を起動します
         
    • 【注意】
      Cookie処理を新しい技術仕様(RFC6265)に変更すると以下の影響があります

       
      1. @を含む文字列を二重引用符で囲む必要は無くなった代わりに、値に制御文字やスペース、二重引用符、カンマ、セミコロン、¥(backslash)を使用することができません。
        • これらの値を使用したい場合は、値をセットする時点でエンコードされている必要があります
      2. ドメイン属性を使用したCookieの記述方法が変更され、従来のドットから始める表記ではエラーが発生します
        • <cfapplcation setDomainCookies="yes">や、Application.cfcでthis.setDomainCookies=trueを指定して、ドメインレベルのセッションCookieを使用すると、エラーが発生します
        • <cfcookie>タグでdomainを指定している場合、<cfheader>でSet-Cookieでドメインレベルを指定している場合、先頭のドットを削除しないとエラーとなります

 


 


記事公開日:2022年03月30日
最終更新日:2022年03月31日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.