CI 묻고 답하기

제목 [해결] 세션을 읽지 못하는 질문 하나만...
글쓴이 밥아저씨 작성시각 2012/03/05 21:36:27
댓글 : 13 추천 : 0 스크랩 : 0 조회수 : 25744   RSS
약 한달 전 부터 세션문제를 해결하지 못했습니다.
결국 해결하지 못하고 꼼수를 이용하고 있었는데.
오늘은 끝을 봐야겠습니다.

사용자가 로그인을 하면 옳은 값이 들어갑니다.
하지만 페이지를 리다이렉트 하면
세션 데이터를 읽어오지 못하고
새로운 빈 세션을 자꾸 만들어냅니다.
분명 설정 관련 부분 문제인것 같습니다만..

제가 이용했던 꼼수는, 현재 프로젝트가
안드로이드 앱 과 연동되는 형태이기 때문에
로그인할때 세션 ID를 저장한뒤
페이지 로드시 header 값에 cookie 값으로 세션ID를 날리는 형태였습니다.
하지만 이제는 웹 서비스로도 지원이 되야하기 때문에 꼭 해결해야 합니다 ㅠㅡㅠ

아래는 로그인 파트 핵심 소스 입니다.
실제 DB에 값은 맞게 들어가기 때문에 문제는 없는것 같습니다.
if ($this->member->is_member($email, $password))
{
 $this->errcode = 100;
 $sess = array('email' => $email, 'password' => $password);
 $this->session->set_userdata($sess);
}
else
{
 $this->errcode = 402;
//로그인 값이 틀리면 빈 세션(칼럼)을 만들어내기 때문에
//강제적으로 삭제함
 $this->session->sess_destroy();
}

아래는 테스트로 세션의 값을 불러오는 소스 입니다.
빈 값을 불러옵니다. ㅠㅡㅠ
$email = $this->session->userdata('email');
$password = $this->session->userdata('password');
print $email;
print $password;


데이터베이스 세션을 사용하고 있습니다.
아래는 설정 부분입니다.

현재 이용하는 서버는 점검용 테스트 서버 이기때문에 제 아이피 주소로 되어 있습니다.
하지만 실제 서버(도메인)에서도 안됩니다. ㅠ.ㅠ

application/config/config.php
//혹시나 해서 끝에 /(슬래쉬)를 제거도 해보고
//주소를 localhost로도 해보았지만...안됩니다.
$config['base_url'] = 'http://192.168.0.5/';

$config['sess_cookie_name'] = 'ko_nb_session';
$config['sess_expiration'] = 0;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = TRUE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ko_nb_session';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = FALSE;
//사용자가 특별히 로그아웃하지 않는한 세션 유지입니다.
//페이스북 앱 처럼요
$config['sess_time_to_update'] = 359000000;

/*****************************************************/

$config['cookie_prefix'] = "";
//도메인 앞에 .를 삭제도 해보고 localhost로도 해보고
//아예 삭제도 해보고 모든 설정을 아예 Default 로도 해보았습니다...만 안됩니다.
$config['cookie_domain'] = ".192.168.0.5";
$config['cookie_path']  = "/";
$config['cookie_secure'] = TRUE;


다음은 리눅스 서버의 아파치 설정중
서버 네임 부분 입니다.

/etc/httpd/conf/httpd.conf
ServerName 192.168.0.5:80

<VirtualHost *80>
  DocumentRoot /var/www/html/
  ServerName 192.168.0.5
</VirtualHost>

구글링을 통하여 Native 세션을 적용해보았는데,
그건 잘 됩니다.
그런데 꼭 DB세션을 이용하고 싶어
요렇게 질문글을 올려봅니다.
 다음글 CI 기본 세션 이용시에 가끔 발생하는 문제 (1)
 이전글 이중 폴더 안에 컨트롤러를 넣으려고 합니다. (4)

댓글

세콩 / 2012/03/05 22:01:07 / 추천 0
세션 만료기한이 0으로설정되어있네요 참고해보세요 http://codeigniter-kr.org/lecture/view/207/page/1/
밥아저씨 / 2012/03/05 22:06:23 / 추천 0
 원래는  $config['sess_time_to_update'] = 359000000; 와 같은 값으로 되어있었습니다.
몇시간 전에 테스트를 해보려고 0으로 변경을 해보았습니다.

http://codeigniter-kr.org/user_guide_2.1.0/libraries/sessions.html

요기 보니깐 맨 밑에 유효기간을 무한대로 하려면 0으로 하라고 나와있더군요
(35900000로 해줘도 역시나 안됩니다 ㅠㅠ)
세콩 / 2012/03/05 22:19:26 / 추천 0
그러네요 저도 놓쳤던거 챙겨갑니닷
만료기한을 0으로주면 무기한이되는요

그렇담.. 음.. 혹시 database에 ko_nb_session 테이블은 만드셨나요?

그것도 아니라면,, 리다이렉트시에 어떤 메서드로인해
세션을 지우거나 덮어씌워지는지 확인해보세요

세션에 관련된부분에 디버그모드 시전 강추!!
세콩 / 2012/03/05 22:40:16 / 추천 0
 잘은모르겠는데 쿠키도메인설정때문에 쿠키자체를 못찾는걸수도있겠다는 생각이드네요??

그냥 느낌입니다 혹시 아직 문제를 못찾으셨다면 참고해보세용.. ㅎㅎ;;
밥아저씨 / 2012/03/05 23:07:50 / 추천 0
네...직접 다 확인했는데, 값은 알맞게 잘 들어갑니다.

일단 더 확인을 해보겠습니다. ㅠㅡㅠ
밥아저씨 / 2012/03/05 23:24:06 / 추천 0
 감사합니다. 말씀하신대로의 문제 같더군요

// $config['cookie_prefix'] = "";
// $config['cookie_domain'] = ".192.168.0.5";
// $config['cookie_path'] = "/";
// $config['cookie_secure'] = TRUE;

이렇게 주석처리 해주니 잘 됩니다.
그런데 쿠키도메인과 어떻게 문제가 나길래
그랬던것일까요?...
변종원(웅파) / 2012/03/06 00:04:14 / 추천 0
.domain.com 형태로 쓰는 곳인데 아이피를 쓰셨네요. .192.168.0.1 이렇게 쓰시면.......
밥아저씨 / 2012/03/06 10:05:58 / 추천 0
 웅파// 아..넵 그렇긴한데 글에서 말씀드린대로 도메인으로도 안되던거라서욤...
정도령 / 2012/03/06 15:10:59 / 추천 0
도움이 될런지 모르겠습니다.
저도 뭔가 만들다가 세션 가지고 데이타 넣고 빼려고 하는데 계속 문제가 발생하더군요.
저의 config 에 세션 설정값은 아래와 같아요.
 
$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']  = 'use_sessions';
$config['sess_match_ip']  = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

위 설정값들을 아무리 변경해보고 별짓을 다해도 문제가 있더군요.
그래서 세션을 살펴보니깐... 
골때리게스리 사용자 세션이 자꾸 새로 생기더란 말이죠. 
이것 때문에 저도 몇일 뒷골 땡겨가면서까지 거시기 했는데 결국 이렇게 해서 해결했습니다.

 
    function __construct()
    {
        parent::__construct();
        header('P3P: CP="CAO PSA OUR"');
        header('Cache-Control: no-cache');
        header('Pragma: no-cache');
    }
 

요거 넣어주고 난뒤로는 그러한 문제가 발생하지 않더군요.
저 같은 경우는 페이스북 API 이용해서 이것 저것 맹글어보고 있는데 세션 문제 때문에 별의 별 쇼를 다했던것을 생각하면 아주 뒷골이 겁나리 땡겨버립니다.  ㅋㅎ
아무튼 이것도 하나의 해결 방법이 될듯 싶네요.
 
밥아저씨 / 2012/03/06 18:40:28 / 추천 0
 정도령 // 헙.. 좋은 정보 공유 감사합니다.
앞으로 페북 API 를 쓸 일이 있을텐데
큰 도움 될것 같습니다 (__)
SMINT / 2012/03/08 13:49:47 / 추천 0
저도 완전히 같은 문제인 것 같습니다...
profiler로 확인할 경우 같은 세션이 네 번 정도 update 되는 것 같은데, 밥아저씨 님도 똑같은 현상이신지요...
저희도 페이스북으로 로그인하는 기능이 있거든요... ㅋ 
schumann / 2012/12/04 15:16:34 / 추천 0
  저도 동일한 문제로 고생한 적이 있는데 

제가 파악해 본 바로는 앱에서 전송하는 헤더에 쿠키정보에 문제가 있었습니다.

세션에 데이터 입력시 여러번에 걸쳐서 set_userdata 를 사용하니 헤더의 쿠키부분이 여러번 입력되는 현상이 나타났습니다.

이로 인해서 앱에서 헤더정보를 읽지못해서 쿠키를 읽지 못하게 되고 이로 인해 계속 새로운 세션을 생성하였습니다.

예를 들어서

$sess_array = array(
    "user_id" => $user_id,
    "user_name" => $user_name
);

foreach($sess_array as $k=>$v) {

    $this->session->set_userdata($k,$v);

}


이렇게 코드를 작성할 경우 해당 증상이 발생하였습니다.

웹에서는 위와 같이 해도 쿠키를 문제없이 읽어 내었습니다.

브라우저마타 쿠키를 처리하는 방식도 다 달라서 생기는 문제같습니다.
(안드로이드 내장 브라우저에선 처리가 안되는듯)

$this->session->set_userdata($sess_array);

요렇게 하니 헤더의 쿠키가 정상적인 형태로 전송되었습니다.

참고가 되셨으면 합니다.

하루살이 / 2013/04/04 01:18:02 / 추천 0
저도 한참 헤매다가 구글링도 하고 이것저것 뒤져보다가
익스플로러 브라우저 호환모드가 있기때문에 그런게 아닌가해서
$config['sess_match_useragent']    = false;
여기 부분을 false 바꾸니 해결 되었습니다.