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

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

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

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

8844閲覧

cakePHP ページ遷移後にcookieが消える

kazoogon

総合スコア281

Cookie

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2018/11/17 19:39

編集2018/11/18 16:25

今していること

cakePHP3.6を使用し、ログイン認証後に "auth"というkeyのcookieを設置する

$this->response = $this->response ->withHeader("X-FRAME-OPTIONS", "SAMEORIGIN") ->withCookie('auth', [ 'value' => "hoge", 'path' => '/', 'secure' => false, 'httpOnly' => true, 'expire' => strtotime('+1 month'), ]) ->withLocation('http://localhost:4200');

困っていること

コード内に記載しましたが、cookie設置後にlocalhost:4200に遷移
→遷移先ではchromeのdevelop tool, application内にcookieが表示されない
→browser上の戻るボタンでlogin pageに戻ると、cookieがdevelop tool上で表示されている(言い換えればcookie自体は生成されている)

今まで試したこと

調べてみますと、大体の解決策がpathを '/'にする。でしたがその対策では効果がありませんでした。(コード内には既に記載済)
よろしくお願いします。

追記

$this->response = $this->response ->withHeader("X-FRAME-OPTIONS", "SAMEORIGIN") ->withCookie('auth', [ 'value' => "hoge", 'path' => '/', 'domain' => 'localhost:4200', 'secure' => false, 'httpOnly' => true, 'expire' => strtotime('+1 month'), ]) ->withLocation('http://localhost:4200');

「ちなみにdomainの設定をするとcookie自体生成されなくなります」
この文とコードを忘れておりました。
ちなみにdomain部分は '/' こうしてもcookie自体生成されません。

追記②

参考URLを元にconfig/app.phpに追記
→しかし挙動に変化なし

'Session' => [ 'defaults' => 'php', //以下ini部分を追記 'ini' => [ 'session.cookie_path' => '/', 'session.cookie_domain' => '.localhost:4200' ] ],

追記③

本番環境について(上記はlocalhostを使用するぐらいなので、開発環境です)
・LoginページのみcakePHPのviewを使用する(securityを考慮し、cakePHPのformを使用するため)
・login以外のページはangularを使用し同じサーバ内に設置、cakePHPをjsonデータを返すAPIとしか使用していない

となるとポート番号が違うだけなので、path => '/' と設置すれば良いだけかと思いますが、間違いないですかね。。?

追記④

「cookie "CAKEPHP" について」
参考までですが、よくみるとcakePHPで自動で生成される、keyがCAKEPHPのcookieも、localhost:4200にredirect後には送信されていなかった
→config/app.phpの'Session'にてdomainの設定をしてみる
→しかしoptionにdomainの項目はない

上記質問と直接は関係ありませんが、ここから何か分かるかもしれないという意図で追記しておきます

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

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

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

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

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

m.ts10806

2018/11/17 22:17

localhost:4200に遷移する前、つまりCookieを保存したときに実行されるURLはどうなっていますか?
guest

回答2

0

ベストアンサー

クッキーはドメインごとに管理されます。基本的に、Set-Cookieした際のドメインとは別のドメインにはクッキーは送信されません。すなわち、

  • www.example.com でセットされたクッキーは www.example.jp には送信されない
  • 送信するように設定することもできない

例外は以下のようなケースです

www.example.com でセットしたクッキーを sub.example.com にも送信するようにする

  • domain属性を example.com に設定することで可能

localhost:4200 をdomainとしてセットした例です。素のPHPですが…以下のスクリプトを localhost:4200 で実行しました。

<?php setcookie('AAA', 'BBB', 0, '/', 'localhost:4200'); setcookie('CCC', 'DDD', 0, '/', 'localhost'); header('Content-Type: text/plain; charset=utf-8'); var_dump($_COOKIE);

結果は以下の通りで、localhost:4200を設定したほうはセットされず、localhostのみをセットするとcookiがセットされます。

イメージ説明

Firefoxの開発ツールによる表示

イメージ説明

投稿2018/11/18 00:19

編集2018/11/18 14:22
ockeghem

総合スコア11701

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

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

ockeghem

2018/11/18 02:28

わたしの回答で、「例外は」と書いたことを実現するためです
kazoogon

2018/11/18 07:51

'domain' => 'localhost:4200', を記載するとcookie自体生成されなくなりますね。。
退会済みユーザー

退会済みユーザー

2018/11/18 08:17

生成はされると思いますよ。 ただ、送信されないのであって
kazoogon

2018/11/18 08:36

asahina1979さん回答ありがとうございます。 前はlogin pageからlocalhostに自動遷移 → 戻るボタンでloginページ上ではcookieの確認ができた。 なのですが、domain設定をするとそれ自体確認できないので、cookieが生成もされていないのかと思いました。
退会済みユーザー

退会済みユーザー

2018/11/18 08:43

ブラウザ(WEBサイト)から確認できるクッキーは送信されてきたクッキーだけですので localhhost の クッキーをください。 domain=localhhost → 送信 domain=localhhost:4200 → 後方一致しないから送信しない これも回答の例外の動きを理解してれば気づく
ockeghem

2018/11/18 09:39

> 'domain' => 'localhost:4200', を記載するとcookie自体生成されなくなりますね。。 これを実行するためには、アプリケーションがlocalhost:4200 上で動いている必要があります。そうでないと、Cookieがブラウザに受け入れられません。この点は大丈夫ですか?
kazoogon

2018/11/18 09:56

>アプリケーションがlocalhost:4200 上で動いている必要があります これは問題ありません
ockeghem

2018/11/18 10:10

ごめんなさい。実機で確認したところ、ドメイン指定時にポート番号は指定できないようです。単に'localhost'としないと、ブラウザからサーバーにcookieが送信されないようです。ただ、domain=localhostと指定する意味はないので、domain指定を省略したほうが無難かと思います。
ockeghem

2018/11/18 10:10

>アプリケーションがlocalhost:4200 上で動いている必要があります ここでいうアプリケーションは、cookieをセットするアプリケーションですが、大丈夫ですか?
kazoogon

2018/11/18 10:24

> 実機で確認したところ、ドメイン指定時にポート番号は指定できないようです この根拠を良ければ教えていただきたいです、気になるところです > domain指定を省略したほうが無難かと思います となると他domainにcookieを送れない、ということですかね?? > ここでいうアプリケーションは、cookieをセットするアプリケーション はい、問題ございません。
ockeghem

2018/11/18 12:09

さしあたりこの質問に回答します >> domain指定を省略したほうが無難かと思います > となると他domainにcookieを送れない、ということですかね?? はい、これはcookieのセキュリティ上の制約です。勝手に第三者のサイトにcookieを遅れると危険だからです
kazoogon

2018/11/18 13:06

ockeghemさん 話は少しずれますが、本番環境についての追記をしておきました。確認していただけたら幸いです。 (またある機能のみをframe work のviewで実装したことある方は、どうしていたか気になるところですね)
kazoogon

2018/11/18 14:47

ockeghemさん 実装までしていただきありがたいです。 > 以下のスクリプトを localhost:4200 で実行しました。 こちらはlocalhost:3000や外部サーバなどからスクリプトしてもlocalhost:4200にはcookieを渡せますかね?? 素のPHPでこちらも試してみましたが、できませんね。。。
kazoogon

2018/11/18 16:26

またcakePHPのデフォルトで作成されるcookie "CAKEPHP"についても追記しておきました。 参考までですが、何か分かるかもしれないので記載しておきます
退会済みユーザー

退会済みユーザー

2018/11/18 22:26

ちなみに http://localhost:4200// は プロトコル:http ドメイン:localhost ポート:4200 ホストネーム(サーバーネーム):localhost:4200 のようになる
ockeghem

2018/11/19 12:37

> こちらはlocalhost:3000や外部サーバなどからスクリプトしてもlocalhost:4200にはcookieを渡せますかね?? > 素のPHPでこちらも試してみましたが、できませんね。。。 いえ、localhost:3000からlocalhost:4200には渡せますよ。domain指定は必要ありません。一応Ubuntu18.04上のFirefoxとGoogle Chromeで確認しました
guest

0

同サーバー内であってもドメインが違えばCookie共有はデフォルトのやり方ではできません。
もちろん共有不可ではないので「Cookie 別ドメイン」 などで検索し、ご自身の状況に合った情報を見つけて試してみてください。
ポート未指定だとデフォルトが使用され(Apacheならたぶん80)、ポート違えば別ドメイン扱いです。ポートも含めてドメインと捉えてもらえればと。

投稿2018/11/17 22:34

編集2018/11/17 23:34
m.ts10806

総合スコア80850

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

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

kazoogon

2018/11/18 08:08

'domain' => 'localhost:4200', を記載するとcookie自体生成されなくなりますね。。
退会済みユーザー

退会済みユーザー

2018/11/18 22:32

ポート関係なくドメインでクッキーを送信してたからプロトコル別で送信する「セキュア属性」が追加されたはずなんだが
m.ts10806

2018/11/19 11:51

CakePHPの仕様を考慮したうえでの回答ではないので、 加味したうえで反映してもらう必要がありそうですね。 たぶん結構この問題は思ったより根が深そうです。(そもそもの構成を見直したほうが早いかも)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問