質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

1回答

1051閲覧

CodeIgniter2で重複したSet-Cookieが送られてしまう

tomoeine

総合スコア127

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2017/09/06 03:22

編集2017/09/06 03:24

###前提
CodeIgniter2で運用中のサービスです。
セッション機構として、CodeIgniterデフォルトのCookie利用の仕組みを使っています。

###発生している問題
レスポンスヘッダが長くなりすぎる(4KB超)ことでインフラ側に問題が発生しています。
PHPでデバッグしながら確認してみると、
セッションライブラリの初期化や、
$this->session->set_userdata の呼出タイミングで、
都度PHPのsetcookieが呼ばれているようで、セッションのSet-Cookie(内容もほとんど重複)が複数のSet-Cookie: としてヘッダーに含まれて送信されています。

###該当のソースコード
system/libraries/Session.php(CodeIgniterのデフォルト)

PHP

1 2 /** 3 * Write the session cookie 4 * 5 * @access public 6 * @return void 7 */ 8 function _set_cookie($cookie_data = NULL) 9 { 10 if (is_null($cookie_data)) 11 { 12 $cookie_data = $this->userdata; 13 } 14 15 // Serialize the userdata for the cookie 16 $cookie_data = $this->_serialize($cookie_data); 17 18 if ($this->sess_encrypt_cookie == TRUE) 19 { 20 $cookie_data = $this->CI->encrypt->encode($cookie_data); 21 } 22 23 $cookie_data .= hash_hmac('sha1', $cookie_data, $this->encryption_key); 24 25 $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); 26 27 // Set the cookie 28 setcookie( 29 $this->sess_cookie_name, 30 $cookie_data, 31 $expire, 32 $this->cookie_path, 33 $this->cookie_domain, 34 $this->cookie_secure 35 ); 36 }

この_set_cookie()が初期化やset_userdataの都度呼ばれています。

またconfig.php内のセッション関連の設定は以下の通りです。

PHP

1$config['sess_cookie_name'] = 'ci_session'; 2$config['sess_expiration'] = 7200; 3$config['sess_expire_on_close'] = TRUE; 4$config['sess_encrypt_cookie'] = TRUE; 5$config['sess_use_database'] = FALSE; 6$config['sess_table_name'] = 'ci_sessions'; 7$config['sess_match_ip'] = FALSE; 8$config['sess_match_useragent'] = TRUE; 9$config['sess_time_to_update'] = 300;

###試したこと
検証用コントローラを作ってシンプルなコードで呼び出しましたが、現象は変わりませんでした。
また、同様の報告を探しましたが見つかりませんでした。

###その他
運用中のサービスのため、セッション機構自体を大幅な変更(Cookie→DBにする、自前のセッションを利用する、等)は避けたいです。
RFC 6265でも「サーバは、同じ応答­内に同じ cookie-name の複数の Set-Cookie ヘッダを内包するべきでない」との記載があり、
上述の挙動がCIの仕様とも考えにくいので、何らか対策が可能ではと思うのですが、ご存知の方いらっしゃらないでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上述の挙動がCIの仕様とも考えにくいので

考えにくいことではありますが、デフォルトのCodeIgniter 2でCookie保存をしていると、書き換えるたびにSet-Cookie:が書き出される挙動となってしまうようです(ソースコードに当たって確認しました)。

  1. set_userdataが呼ばれる
  2. 変数へのデータ書き込み後に必ずsess_writeが走る
  3. sess_writeは、DB保存しない場合には必ず_set_cookieを呼び出す

なお、これも一因なのかはわかりませんが、CodeIgniter 3ではクッキー保存自体が廃止されています。

投稿2017/09/06 04:07

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomoeine

2017/09/07 00:06

回答ありがとうございます。 これが仕様なんですね・・・ Session.phpの_set_cookieをオーバーライドし、レスポンスヘッダを書き換える方向で検討中です。
tomoeine

2017/09/12 08:07

上述の通り、_set_cookieをオーバーライドする方法で対策しました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問