codeignite 에서 제공하는 Session Class는 sess_expiration에서 치명적인 버그가 있다.
브라우저를 닫아도 세션이 존재한다는 것이다. 그 이유는 세션처리가 쿠키로서 존재하기 때문에 발생하는 에러이다.
/system/application/config/config.php 에서
$config['sess_expiration'] 을 잡아주게 되는데
$config['sess_expiration'] = 0 일경우는 무한대(엄격히 말하면 2년) 이라는 값이 잡힌다.
그리고 일정한 시간을 넣어 주게되면 (예, $config['sess_expiration'] = 7200;)
브라우저를 닫아도 세션이 남아 있었어 여러가지 문제를 초래하게 된다.
어떤 이는 -1을 넣는 경우도 있는데 이경우도 특정경우에 있었어 세션은 바로 닫혀 버리는 문제점이 발생한다.
그래서 아래와 같은 patch를 해주시기 바랍니다.
참조 : http://codeigniter.com/forums/viewthread/109645/#553043
1. /system/application/config/config.php 에서
$config['sess_expiration'] = 7200; 아래에 다음을 추가한다.
$config['sess_persistant_cookie'] = TRUE;
2. /system/libraries/Session.php 를 다음과 같이 각각 수정한다.
2_1 :
foreach (array (
'sess_encrypt_cookie',
'sess_use_database',
'sess_table_name',
'sess_expiration',
'sess_persistant_cookie', <!--추가
'sess_match_ip',
'sess_match_useragent',
2_2 :
function _set_cookie($cookie_data = NULL) {
if (is_null($cookie_data)) {
$cookie_data = $this->userdata;
}
// Serialize the userdata for the cookie
$cookie_data = $this->_serialize($cookie_data);
if ($this->sess_encrypt_cookie == TRUE) {
$cookie_data = $this->CI->encrypt->encode($cookie_data);
} else {
// if encryption is not used, we provide an md5 hash to prevent userside tampering
$cookie_data = $cookie_data . md5($cookie_data . $this->encryption_key);
}
// Session or persistant cookie...
//아래부분 추가
$expiration = $this->sess_expiration + time();
// We want the cookie to expire when browser session closes
if ($this->sess_persistant_cookie == FALSE)
{
$expiration = 0;
}
// Set the cookie
// 기존 $this->sess_expiration + time() -> $expiration 으로 변경
setcookie($this->sess_cookie_name, $cookie_data, $expiration, $this->cookie_path, $this->cookie_domain, 0);
}
이렇게 변경하시면 됩니다.
그리고 브라우저가 닫힐때 세션을 없애고 싶으시면
$config['sess_persistant_cookie'] = TRUE;// 을 FALSE로 하시면됩니다.