はい!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 }