hero_picture

サブドメイン間のセッションを共有する

2013/08/02

hogehoge.com でログインした場合に user.hogehoge.com でもログインした状態にしたい事があったので。

fuelphpサブドメイン間でセッションを共有すればいけるのではないかと思ったのですが

結構苦労したので備忘録です。

下記のブログを参考にしました。

サブドメインでセッションを共有する方法:逆襲のニート

http://gooddays1.blog37.fc2.com/blog-entry-984.html

こちらに紹介されている通り、別サイトでセッションを共有するには以下の条件が必要です

サブドメインである事

・別サーバーの場合はセッションをDBに保存するなどセッション情報が共有できる事

fuelPHPでの設定

さて、実際にfuelphpで設定する方法です。

例として hogehoge.com user.hogehoge.com でセッションを共有すると仮定します。

以下のconfigファイルの一部を修正します。

fuel/app/config/config.php のクッキー項目のdomainを編集

[code]

cookie‘ => array(

// Number of seconds before the cookie expires

// ‘expiration’ => 0,

// Restrict the path that the cookie is available to

// ‘path’ => ‘/’,

// Restrict the domain that the cookie is available to

// ‘domain’ => null,

‘domain’ => ‘.hogehoge.com’,

// Only transmit cookies over secure connections

// ‘secure’ => false,

// Only transmit cookies over HTTP, disabling Javascript access

// ‘http_only’ => false,

),

[/code]

fuel/app/config/session.php のcookie_domain の項目を編集

なければfuel/core/config/session.phpをコピーしてきて下さい。

[code]

cookie_domain’ => ‘.hogehoge.com’,

[/code]

以上、これだけでセッション情報を共有する事ができます。

内容について

上記の設定は保存するCookieドメイン属性の設定です。

「.hogehoge.com」のようにドメイン属性を指定してドットが付けると、Cookieは、サブドメインにアクセスした際にも送信されるようになります。hogehoge.com でも user.hogehoge.com でも login.user.hogehoge.com でも送信されるようになりました(Chromeで確認)。

ただ、サブドメインすべてに送信されるという事はセキュリティ的にもあまりいいものではありません。セッションを共有したい最小限のドメインにのみとか設定できるとベストなんですがこのあたりはもう少し調査が必要だと思っています。

この状態でhogehoge.comに接続してみて発行されたCookieドメインは 「.hogehoge.com」となります。また、user.hogehoge.comに接続してもCookieドメインは 「.hogehoge.com」として同じ値が送信されていると思います。

はまった所

今回の開発環境ではWindowsMACのhostsにホスト名を以下のように設定していて、以下のようなURLで開発環境に接続できるような設定を行っていました。

1http://hogehoge/

こういった設定の上でサブドメイン間のセッション共有をしたかったので、上記に習って「.hogehoge」と設定していたのですが何度やってもセッションが共有されないという事がありました。

何度やってもCookieドメインが 「.hogehoge」として送信されません。

ヘッダーなどを見てみるときちんとset-cookieが送信されていましたが、実際のブラウザ側ではCookieに入ってきません・・・。

すごく頭を悩ませていたのですが、どうやら「.」が内包されていないドメイン属性は拒否されるようです。

(考えてみたら .jp とかが設定できちゃうと、同じ設定をしてるCookieがとってこれる事になっちゃいますね )

これらの規約は「RFC6265」によって規定されていて、

現在のブラウザは概ねこの規約にのっとっているようです。

というわけで今回の例のように開発環境は以下で接続できるように設定を変更する事で解決しました。

1http://hogehoge.com/