CI 묻고 답하기

제목 [3.0] 밑에 세션이 끊기는 문제 이어서
글쓴이 유마 작성시각 2015/05/22 00:27:59
댓글 : 0 추천 : 0 스크랩 : 0 조회수 : 16785   RSS
http://www.codeigniter-kr.org/qna/view/16738/page/1/

오늘 테스트 하면서 문제점을 발견했습니다.
의문이 생기는 게 뭐냐면, CI의 db session 은 어떻게 작동하는 건지 궁금해집니다.

Flexi-auth 라이브러리를 사용했었는데,
function set_login_sessions 처리 할 때 보면,
 
public function set_login_sessions($user, $logged_in_via_password = FALSE)
{
	if ( ! $user )
	{
		return FALSE;
	}

	$user_id = $user->{$this->auth->database_config['user_acc']['columns']['id']};

	//$this->regenerate_ci_session_id();

	$this->update_last_login($user_id);

	if ($this->auth->security['validate_login_onload'] && ! $this->insert_database_login_session($user_id))
	{
		return FALSE;
	}

	// Set verified login session if user logged in via Password rather than 'Remember me'.
	$this->auth->session_data[$this->auth->sessions['logged_in_via_password']] = $logged_in_via_password;
		
	// Set user id and identifier data to session.
	$this->auth->session_data[$this->auth->sessions['user_id']] = $user_id;
	$this->auth->session_data[$this->auth->sessions['user_identifier']] = $user->{$this->auth->db_settings['primary_identity_col']};

	// Get group data.
	$sql_where[$this->auth->tbl_col_user_group['id']] = $user->{$this->auth->database_config['user_acc']['columns']['group_id']};

	$group = $this->get_groups(FALSE, $sql_where)->row();

	// Set admin status to session.
	$this->auth->session_data[$this->auth->sessions['is_admin']] = ($group->{$this->auth->database_config['user_group']['columns']['admin']} == 1);
		
	$this->auth->session_data[$this->auth->sessions['group']] = 
		array($group->{$this->auth->database_config['user_group']['columns']['id']} => $group->{$this->auth->database_config['user_group']['columns']['name']});

	$this->session->set_userdata(array($this->auth->sessions['name'] => $this->auth->session_data));

	return TRUE;
}

private function regenerate_ci_session_id()
{
	$ci_session = array(
		'name'   => $this->config->item('sess_cookie_name'),
		'value'  => '',
		'expire' => ''
	);
	set_cookie($ci_session);	
}

이렇게 처리 되어집니다.
로그인이 제대로 되면, 로그인 세션을 작성하는데 기존 ci_session을 새로 만들더군요.

제가 테스트 해보니까, CI 같은 경우.. 사이트에 접속하면 일단 ci_session이 만들어집니다.
그 세션을 가지고 사이트를 돌아다니는데, 로그인을 해서 저 함수를 만나면, 기존 세션이 사라지고 새로운 세션을 만들게 됩니다.

이 때, 상황이 페이지가 전환 되는게 아니라 로그인 처리 과정이기 때문에 내부적인 함수만 돌아다니게 되죠.
이럴 땐 아무런 문제가 없습니다. 그리고 마지막 단계인.. 로그인이 제대로 되고 세션이랑 쿠키도 만들고..
화면 전환이 되면, 기존 ci_session_id 는 사라지고 새로 만든 세션 아이디가 존재하기 때문에...
로그인이 풀린 것처럼 작동을 해버리더군요.

저 함수를 빼고 실행을 하면, 제대로 작동을 합니다. 세션 아이디가 새로 생성이 되지 않기 때문에 아무런 문제가 없으나 새로운 문제가 생깁니다. 브라우저를 껐다가 켜도 로그인 상태가 됩니다.

제가 크롬으로 집에서도 크롬 로그인 한 상태로 사용하고 회사에서도 로그인 상태로 사용하는데,
회사에서 작업하다가 집에서 크롬으로 접속하면, 회사에서 접속한 세션 아이디로 찾습니다. --;;;

이건 문제가 있지 않나요?

이런 건 어떻게 해야 하나요? CI 의 디비 세션은.. 어떻게 되는 건지..
 다음글 에러메시지가 출력이 안되는 부분이 있는데 모두다 출력할... (2)
 이전글 an error occurred while proces... (1)

댓글

없음