はい!OpenPNE3のクッキーとセッションについて整理してみる!の巻!

はい!ギュンばんわ!
みなさんOpenPNE3のセッションとクッキーの挙動を把握してますか?
ちょっとスマホのセッションとクッキーの設計を考えてるんで、整理してみるよ!
まずはpc_frontendから。

■1■はじめてSNSのトップページを開いた時( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	v76k4q1j6oriphkfv2v92crht6
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
  • 生成されたクッキーに紐づいたセッション
cat sess_v76k4q1j6oriphkfv2v92crht6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311225851;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_v76k4q1j6oriphkfv2v92crht6
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311225851;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";


■2■次回から自動的にログインを「しない」でログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	270tr3aiiqflnso8p7ge1pp6d0
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
  • 生成されたクッキーに紐づいたセッション
cat sess_270tr3aiiqflnso8p7ge1pp6d0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185502;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_270tr3aiiqflnso8p7ge1pp6d0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185502;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";


■3■ログアウトしたあと( http://op36-beta-head.myzw2.pne.jp/member/login )

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	j0gs7f5cv4b3u1v0rpj7v9sm07
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
  • 生成されたクッキーに紐づいたセッション
cat sess_j0gs7f5cv4b3u1v0rpj7v9sm07
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185648;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_j0gs7f5cv4b3u1v0rpj7v9sm07
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185648;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■4■次回から自動的にログインを「する」でログインしたあと( http://op36-beta-head.myzw2.pne.jp/ )

  • 生成されたクッキー(その1)
名前(name)	OpenPNE_pc_frontend
値(value)	8e1i4gsofsbevptaf9sdm6aqb0
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
  • 生成されたクッキー(その1)に紐づいたセッション
cat sess_8e1i4gsofsbevptaf9sdm6aqb0 
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185829;symfony/user/sfUser/authenticated|b:1;symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_8e1i4gsofsbevptaf9sdm6aqb0
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185829;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:1:{i:0;s:9:"SNSMember";}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:2:{s:9:"auth_mode";s:11:"MailAddress";s:9:"member_id";s:1:"1";}}
symfony/user/sfUser/culture|s:5:"ja_JP";
  • 生成されたクッキー(その2)
名前(name)	e6d7f8f66ff1bebd8be7e7f321e6d14c
値(value)	YToyOntpOjA7czoxOiIxIjtpOjE7czo2NDoiZTRiMGMzMGQwNzYxOWM0ZjgxMDhlNzUwYjhjNmRmMzk3OGQxYTI4YzhlNzc4MWFkNTQ4NzBiMjY0OTU0NjQyNiI7fQ==
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	Fri, 19 Aug 2011 18:21:01 GMT
  • 生成されたクッキー(その2)のnameの値からセッションを取ってくる方法
↓の★あたりでドメインのmd5を算出して、そこから取ってる。
 /**
  * get remember login cookie
  *
  * @return array
  */
  protected function getRememberLoginCookie()
  {
★    $key = md5(sfContext::getInstance()->getRequest()->getHost());
    if ($value = sfContext::getInstance()->getRequest()->getCookie($key))
    {
      $value = unserialize(base64_decode($value));

      return $value;
    }
  }
  • 生成されたクッキー(その2)のnameの値からセッションの値をとって、そこからmember_idをとる方法
↓の★あたりでクッキーの値をbase64_decodeしてunserializeして値を取ってる。
 /**
  * get remember login cookie
  *
  * @return array
  */
  protected function getRememberLoginCookie()
  {
    $key = md5(sfContext::getInstance()->getRequest()->getHost());
    if ($value = sfContext::getInstance()->getRequest()->getCookie($key))
    {
★      $value = unserialize(base64_decode($value));

      return $value;
    }
  }

で、
$value[0] = (string) '1';
$value[1] = (string) 'f9af432578a4aef988d4eb6eb5a81abf08e6b2ac3d18412226633308b6d2df2e';
な感じになって、$value[0]がmember_id、$value[1]がremember_key。

でmember_configに問い合わせて、レコードがあったら、認証すると。

mysql> select * from member_config where name = 'remember_key'\G
*************************** 1. row ***************************
             id: 6
      member_id: 1
           name: remember_key
          value: f9af432578a4aef988d4eb6eb5a81abf08e6b2ac3d18412226633308b6d2df2e
 value_datetime: NULL
name_value_hash: a1eaf9b5b84db3ccbeb4567f4e4d4d0e
     created_at: 2011-07-21 03:17:08
     updated_at: 2011-07-21 03:58:20
1 row in set (0.00 sec)

■5■ログアウトしたあと

  • 生成されたクッキー
名前(name)	OpenPNE_pc_frontend
値(value)	glu8b59sg44qsl7lqiqtkivop3
ホスト(host)	op36-beta-head.myzw2.pne.jp
パス(path)	/
セキュア(secure)	無効
有効期間(expire)	セッションの終わり
  • 生成されたクッキーに紐づいたセッション
cat sess_glu8b59sg44qsl7lqiqtkivop3
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";symfony/user/sfUser/lastRequest|i:1311185975;symfony/user/sfUser/authenticated|b:0;symfony/user/sfUser/credentials|a:0:{}symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}symfony/user/sfUser/culture|s:5:"ja_JP";

(読みやすいように展開)
cat sess_glu8b59sg44qsl7lqiqtkivop3
OpenPNE/user/opSecurityUser/site_identifier|s:34:"http://op36-beta-head.myzw2.pne.jp";
symfony/user/sfUser/lastRequest|i:1311185975;
symfony/user/sfUser/authenticated|b:0;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:1:{s:14:"opSecurityUser";a:1:{s:9:"auth_mode";s:11:"MailAddress";}}
symfony/user/sfUser/culture|s:5:"ja_JP";

■6■ソースコードへのポインタ
OpenPNE_pc_frontendのクッキーとセッション辺りが生成される(為の処理がされる)のは、
cache/apache2handler/pc_frontend/prod/config/config_core_compile.yml.php
の↓あたり。

3715   public function initialize($options = null)
3716   {
3717     $cookieDefaults = session_get_cookie_params();
3718     $options = array_merge(array(
3719       'session_name'            => 'symfony',
3720       'session_id'              => null,
3721       'auto_start'              => true,
3722       'session_cookie_lifetime' => $cookieDefaults['lifetime'],
3723       'session_cookie_path'     => $cookieDefaults['path'],
3724       'session_cookie_domain'   => $cookieDefaults['domain'],
3725       'session_cookie_secure'   => $cookieDefaults['secure'],
3726       'session_cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
3727       'session_cache_limiter'   => 'none',
3728     ), $options);
3729         parent::initialize($options);
3730         $sessionName = $this->options['session_name'];
3731     session_name($sessionName);
3732     if (!(boolean) ini_get('session.use_cookies') && $sessionId = $this->options['session_id'])
3733     {
3734       session_id($sessionId);
3735     }
3736     $lifetime = $this->options['session_cookie_lifetime'];
3737     $path     = $this->options['session_cookie_path'];
3738     $domain   = $this->options['session_cookie_domain'];
3739     $secure   = $this->options['session_cookie_secure'];
3740     $httpOnly = $this->options['session_cookie_httponly'];
3741     session_set_cookie_params($lifetime, $path, $domain, $secure, $httpOnly);
3742     if (null !== $this->options['session_cache_limiter'])
3743     {
3744       session_cache_limiter($this->options['session_cache_limiter']);
3745     }
3746     if ($this->options['auto_start'] && !self::$sessionStarted)
3747     {
3748       session_start();
3749       self::$sessionStarted = true;
3750     }
3751   }