CI 묻고 답하기

제목 session을 DB에서 삭제하지 못하는 문제.
글쓴이 궁금해 작성시각 2013/09/13 09:42:15
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 18041   RSS
웹에서 세션이 삭제될 시에 DB에서 세션이 row가 삭제되야 하는데 안되고 있습니다.
어디가 문제인지 모르겠네요...

autoload.php
  $autoload['libraries'] = array('session');

config.php
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

function logout(){
        $this->session->sess_destroy();
        $this->load->helper('url');
        redirect("/topic");
    }
function authentication(){
        $this->load->model('user_model');
        $user = $this->user_model->getByEmail(array('email'=>$this->input->post('email')));
        if(!function_exists('password_hash')){
            $this->load->helper('password');
        }
        if(
            $this->input->post('email') == $user->email && 
            password_verify($this->input->post('password'), $user->password)
        ) {
            $this->session->set_userdata('is_login', true);
            $this->load->helper('url');
            redirect("/topic");
        } else {
            $this->session->set_flashdata('message', '로그인에 실패 했습니다.');
            $this->load->helper('url');
            redirect('/auth/login');
        }
    }
 다음글 두 사이트 간에 데이터 put 를 해야하는 상황 (4)
 이전글 hook를 사용하면 될까요? (5)

댓글

변종원(웅파) / 2013/09/13 09:49:29 / 추천 0
config.php 7, 8번 false 로 해보세요 두항목때문에 오작동하는 경우가 있습니다
궁금해 / 2013/09/13 09:55:19 / 추천 0
false로 해도 같은 결과 입니다.
웹 상에선 정상적으로 세션삭제가되서 다시 들어가면 로그인해야 하는데
디비에는 왜 세션 정보가 남을까요.. 
암만 해도 안되네요..
궁금해 / 2013/09/13 10:33:09 / 추천 0
세션 디스트로이 할경우 아래걸 타는데
희한하게 전체 row가 삭제 되지 않고 user_data 칼럼의 is_login만 삭제됩니다.

function sess_destroy()
{
// Kill the session DB row
if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
{
$this->CI->db->where('session_id', $this->userdata['session_id']);
$this->CI->db->delete($this->sess_table_name);
}
 
// Kill the cookie
setcookie(
$this->sess_cookie_name,
addslashes(serialize(array())),
($this->now - 31500000),
$this->cookie_path,
$this->cookie_domain,
0
);
 
// Kill session data
$this->userdata = array();
}
변종원(웅파) / 2013/09/13 11:15:16 / 추천 0
정리를 해보면

db에 남아있는 세션이 어떤 영향을 주던가요?

로그아웃을 했는데 로그인되어 있는 것처럼 나오는건가요?

그게 아니면 로그아웃은 제대로 되는데 껍데기 세션이 남아있어서 찝찝한건가요?

^^
궁금해 / 2013/09/13 11:57:53 / 추천 0
ㅋㅋㅋ 글 내용이 이상한가봐요..

db에 남아있는 세션이 웹에 영향을 주지 않습니다.
로그아웃하면 user_data 칼럼에 is_login은 삭제됩니다.



근데 sess_destroy 자체에서 저 로우를 삭제해야하는 것이 맞는거 아닌가요?
케이든 / 2013/09/13 12:35:24 / 추천 0
-.-

세션이 오토로딩에 들어있으면...

/topic  으로 리디렉트 되니까

세션이 다시 생기는게

정상아닐까요?

세션아이디도 다르네요! (ci가 주기적으로 세션아이디를 변경했던가..)
궁금해 / 2013/09/13 12:46:32 / 추천 0
그러면 sess_expire_on_close true 는 db row를 삭제하라는게 정의되어있지 않은건가요?
케이든 / 2013/09/13 13:12:51 / 추천 0
session_expire_on_close는 브라우저가 닫힐때 세션유지 여부를 결정하는건데

true 라고해도 쿠키만 사라질뿐 db row는 그대로 있는게 정상입니다.

쿠키가 없으니 row는  garbage가 되겠구요.

ci가 일정 확률로 garbage collector를 실행하는데 이때 삭제됩니다


하지만 위의 소스처럼 브라우저를 닫았을때가 아닌 sess_destroy가 실행 됬을땐 바로 row를 삭제하지요

이 경우, 로그아웃 -> 세션삭제(db row제거) -> /topic으로 리디렉트 -> 세션생성(오토로딩,  db row 생성)

과정을 통해 새로운 세션이 생성된 겁니다.

아님 말구요 :)



로그 한번 보세요..
코어소스도 한번 보시구요..
궁금해 / 2013/09/13 13:18:48 / 추천 0
CI 공식 홈페이지에서도 저랑 같은 질문을 한 사람이 있네요 ㅋㅋㅋㅋ
답변 감사합니다.
letsgolee / 2013/09/17 11:04:47 / 추천 0
 이게 문제같습니다. $this->userdata(...). 이게 아니라 $this->session->userdata(...) 이렇게 되어야 세션에 해당 변수가 있는지 점검합니다. 혹 확인해 보시길...