CI 묻고 답하기

제목 [초보]session 유지 방법 질문
글쓴이 큰용 작성시각 2011/11/01 13:31:42
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 31158   RSS

안녕하세요. 이곳에서 글들 보면서 현재 사이트 하나 맹글고 있는데요... 로그인 후 세션이 만들어 지는데..
다른 페이지로 간다던가... 또는 base_url()로 가면 다시 로그인 폼이 나오네요. 세션 유지가 안됩니다.
원인을 모르겠어서... Config도 수정해보고 했는데... 도움을 구하고자 글을 올립니다.

Controller 는 login.php 와 admin.php 로 구성

view는 view_main에서 view_top, view_top_menu, view_middle, view_end를 $this->load->view를 호출해서 표현

이때... login.php 내에서 호출된 view 페이지는 세션을 정상적으로 표현, admin.php로 이동을 하게 되면 세션이 없어짐.

그리고 login.php 에서 에서 다시 브라우저에 index() 함수를 호출해도 세션이 없어짐..

소스 올려봅니다. 세션은 기본 컨틀롤러에서 설정하던 것을 autoload에서 설정하였습니다.

Controller login.php
 

<?php

class Login extends CI_Controller {
     
 function __construct()
 {
  // Call the Model constructor
  parent::__construct();
  $this->load->helper(array('url','form'));
  $this->load->model(array('auth_model','admin_model'));
  $this->load->library(array('form_validation','encrypt'));
 }

 function index()
 {
  $this->__logon();
  }
    
    function __logon()
    {
        if($this->session->userdata('logged_in'))
        {
            $this->__logon_user_route();            
        }
        else
        {
            $data['title'] = "Intranet site";
            $this->load->view('view_logon',$data);
        }
    }
    
    function login_form()
 {   
  $this->form_validation->set_rules('userid','userid','max_length[20]|trim|xss_clean|required');
  $this->form_validation->set_rules('password','Password','min_length[6]|trim|xss_clean|required');

            if ($this->form_validation->run() == FALSE)
            {
          //$data['title'] = 'Intranet Login Form';
                $data['title'] = "Intranet site";
                $this->load->view('view_logon',$data);
            }
            else
            {
       extract($_POST);
        
                $query_str1 = $this->auth_model->check_user($userid,$password);
                
                $query_str = "SELECT * FROM user_profile WHERE pid = ? ";
                $query_str2 = $this->admin_model->get_admin_select_row($query_str, $query_str1['pid']);
           
                    if (!$query_str1) 
              {
                //login failed error
              $this->session->set_flashdata('login_error', TRUE);
              redirect(base_url('login'));
              }
              else
              {
                        $newdata = array(
                                        'logged_in' => TRUE,
                                        'user_id' => $query_str1['userid'],
                                        'group_id' => $query_str1['gid'],
                                        'username' => $query_str2['username'],
                                        'position' => $query_str2['position']
                                    );
                        $this->session->set_userdata($newdata);
                        
                 // login success
                   
                        $this->__logon();
           }
            }
 }
    
    function __logon_user_route()
    {
        //유저 분기를 위한 데이터 수집
        $query_str = "SELECT * FROM menu_table WHERE auth_level = ? ";
        $gids = $this->session->userdata('group_id');
        $data['menu_level'] = $this->admin_model->get_admin_select_list($query_str, $gids);
        
        
        //사용자별 메뉴 구분
            if($gids == 'admin')
            {
                $this->load->view('view_main',$data);
            }
            elseif($gids == 'internal')
            {
                $this->load->view('view_main',$data);
            }
    }
    
    function logout()
    {
        $this->session->sess_destroy();
        redirect(base_url());     
    }
    
    function tests()
    {
        $data['title'] = "Intranet site";
        //$this->load->view('view_logon',$data);
        $this->load->view('view_main');
    }
}
?>
controller admin.php
<?php

class Admin extends CI_Controller {
     
 function __construct()
 {
  // Call the Model constructor
  parent::__construct();
  $this->load->helper(array('url','form'));
  //$this->load->model(array('auth_model','admin_model'));
  $this->load->library(array('form_validation','encrypt'));
         }
    
 function admin_menu_form()
 {
    $this->load->view('view_main');
//  if($this->session->userdata('logged_in'))
//        {
//            $group_id = $this->session->userdata('group_id');
//            
//            if($group_id == 'admin')
//            {
//                $this->load->view(admin_menu_form);
//            }
//            elseif($group_id == 'internal')
//            {
//                return false;
//            }
//        }
//        else
//        {
//            redirect(base_url());
//        }
  }
    
}

?>
Views view_main.php
<?php $this->load->view('view_top'); ?>

    <table border="1">
        <tr>
            <td colspan="2" height="80" width="1000"><?php $this->load->view('view_top_menu'); ?></td>
        </tr>
        <tr>
            <td width="200"><?php $this->load->view('view_menu',$menu_level); ?></td>
            <td width="800"><?php $this->load->view('view_middle'); ?></td>
        </tr>
    </table>
    
<?php $this->load->view('view_end'); ?>

config 세션 설정 부분..
$config['sess_cookie_name']  = 'ci_session';
$config['sess_expiration']  = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = TRUE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name']  = 'ci_sessions';
$config['sess_match_ip']  = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update'] = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
| 'cookie_secure' =  Cookies will only be set if a secure HTTPS connection exists.
|
*/
$config['cookie_prefix'] = "";
$config['cookie_domain'] = ".domain.co.kr";
$config['cookie_path']  = "/";
$config['cookie_secure'] = TRUE;
 다음글 CI 공부 처음하는 학생 질문입니다. (3)
 이전글 [초보]like에 관하여 (3)

댓글

변종원(웅파) / 2011/11/01 13:38:13 / 추천 0
$config['cookie_domain'] = ".domain.co.kr";

글 올리시느라 domain.co.kr로 쓰신거죠? 실제로는 사용도메인 쓰시구요.
빈칸으로 두시고 테스트해보세요.
큰용 / 2011/11/01 13:40:52 / 추천 0
빈칸으로도 해봤는데.. 마찬가지 이더라구요. ㅠ.ㅠ
네.. 도메인은 글 올리느라 바꾸었습니다. ㅠ.ㅠ
변종원(웅파) / 2011/11/01 13:51:33 / 추천 0
 그럼 세션과 쿠키 관련 셋팅을 전부 default로 바꾸고 해보세요.
db세션 쓰시니까 그것만 놔두시고 나머지는 기본으로..

다른 컴에서도 확인해보시구요. 그리고 사무실 내부 말고 외부의 다른 컴도 해보세요.
한대승(불의회상) / 2011/11/01 13:51:39 / 추천 0
^^ 별다른 이상이 없어 보이는데...
$config['cookie_secure'] = TRUE;
이 부분을
$config['cookie_secure'] = FALSE;
요렇게 바꾸고 테스트 해보세요.

로그인 후에 브라우져 주소줄에
ⓙavascrip:alert(ⓓocument.cookie)
요거 입력 함 해보세요. ^^


큰용 / 2011/11/01 14:04:49 / 추천 0

혹시 사이트 오픈하면 원인이 찾아질 수 있을가요???

이고 메뉴중... 메뉴등록 부분만 링크가 되어 있는데...

사용자 정보가 사라지는 것은 세션이 사라지는 것때문에 그런것이겠죠..??

처음에 할때는 세션이 유지되었는데.. 다시 새롭게 만들면서 기존 코드들을 갔다가 사용하는데..

잘 안되네요.. bigyong.co.kr 입니다.

한대승(불의회상) / 2011/11/01 14:22:25 / 추천 0
세션은 잘 생성 되는것 같습니다.
세팅상의 문제로 보이는군요. ^^

ci_session=a:4:{s:10:"session_id";s:32:"0c2c49e292c8c239453a7c12d55531cb";s:10:"ip_address";s:12:%



 
큰용 / 2011/11/01 14:24:40 / 추천 0
세팅이라면.. Config 부분이겠죠... ?? 네 ... 고맙습니다.
한대승(불의회상) / 2011/11/01 14:34:07 / 추천 0
큰용// Config 맞습니다. ^^
변종원(웅파) / 2011/11/01 15:04:38 / 추천 0
로그인해보니 쿠키가 2개 생기네요. bigyong.co.kr, www.bigyong.co.kr

bigyong.co.kr 로 접속을 했는데 www.bigyong.co.kr로 주소가 바뀝니다.

아파치셋팅으로 하시던지 포워딩시켜주시던지 bigyong.co.kr로 접속했을때 www.bigyong.co.kr로 접속되도록 하시면 해결될 거 같네요.

bigyong.co.kr 로 접속해서 bigyong.co.kr 에 해당되는 쿠키가 만들어졌는데 로그인후 포워딩할때 www.bigyong.co.kr 되어버리니 로그인 안된것처럼 나오는 것이 당연합니다.

한대승(불의회상) / 2011/11/01 15:26:08 / 추천 0
웅파// .bigyong.co.kr로 되어 있으면 상관 없을거 같은데..
큰용 / 2011/11/01 18:02:41 / 추천 0
원인 찾았습니다. 감사합니다. 웅파님.. 불의 화상님..

웅파님께서 말씀하신 도메인에 문제가 있었네요.

아파치서버 설정 도메인과 CI의 config 도메인이 서로 www 이거 하나 차이로 안되었네요.

그래도 의구심이 드는건... CI에서도 www 붙여서도 해보았는데.. 그때 역시 안되고... ㅠ.ㅠ

일단 아파치도 domain.co.kr:80 으로 설정하고 CI도 http://domain.co.kr/ 로 설정 후 정상적으로

동작합니다. 감사합니다.
한대승(불의회상) / 2011/11/01 23:44:31 / 추천 0
큰용// 문제를 해결 하셨다니 기쁘군요.
큰용님이 지적하신대로 약간 미심적은 부분이 존재하는것 같습니다.
이후 관련 사항을 분석하시면 해결되리라 생각 됩니다.
CI와 함께 즐거운 코딩 되십시오. ^^