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

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

ただいまの
回答率

89.22%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,026

kazoogon

score 274

今していること

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の項目はない

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/11/18 07:17

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

    キャンセル

  • kazoogon

    2018/11/18 07:30 編集

    http://12.34.56.78/login(ここには記載できないので、仮の数字) のような外部のサーバです

    キャンセル

回答 2

checkベストアンサー

+1

クッキーはドメインごとに管理されます。基本的に、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/19 01:26

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

    キャンセル

  • 2018/11/19 07:26

    ちなみに

    http://localhost:4200//

    プロトコル:http
    ドメイン:localhost
    ポート:4200
    ホストネーム(サーバーネーム):localhost:4200

    のようになる

    キャンセル

  • 2018/11/19 21:37

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

    キャンセル

-1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/18 17:08

    'domain' => 'localhost:4200', を記載するとcookie自体生成されなくなりますね。。

    キャンセル

  • 2018/11/19 07:32

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

    キャンセル

  • 2018/11/19 20:51

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

    キャンセル

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

  • ただいまの回答率 89.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる