CI 묻고 답하기

제목 세션 재 질문
글쓴이 작성시각 2015/12/15 10:21:06
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 23249   RSS
세션때문에  http://codeigniter-kr.org/qna/view/18373/page/1/  이렇게 질문을 했었습니다.
답변 감사드립니다~


 ci3.0으로 설치를했는데 세션이 잘 작동을 안해서 삽질중입니다.
현재 config.파일은 

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'cisessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = '/var/lib/php/session/';
$config['sess_match_ip'] = false;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
이렇게 설정되어있는 상태입니다.

하나 궁금한게있어서 다시 질문 드립니다.

생성된 파일을 보기위해서 /var/lib/phpsession/  폴더에서 세션파일을 보면
같은시간으로 찍힌 세션파일이 두개가 생기는데요.
첫번째파일은 프로그램에서 설정한 값(로그안아이디,등등)들이  들어가있는데
두번째세션파일은
__ci_last_regenerate|i:1450143682;  이렇게  timestamp만 찍히거든요 왜그럴까요?
같은시간에 세션파일이 두개가 생기는것도 좀 이상하고 ...  

아무래도 나중에생긴 두번째파일만 읽어서 세션값들이 다 비어있는걸로 되는것같은데.. 왜 두개씩새기는건지;;


질문답변란 게시물을 검색해봤는데

http://codeigniter-kr.org/qna/view/18255/page/1/q/%EC%84%B8%EC%85%98 
이분하고 제 상황이 가장 비슷한 것같은데 아무래도 같은원인인것같기도하고 저도  var_dump 해보면 저렇게 시간만 찍히거든요
 다음글 CI 3.0 라이브러리 확장 질문 (2)
 이전글 엑티브 레코드 질문 드립니다. (2)

댓글

변종원(웅파) / 2015/12/15 10:50:58 / 추천 0
세션이 2개 생성되고 빈 세션을 참고하기 때문에 로그인 안된것 처럼 보이는 겁니다. 네이티브 세션으로 설정해보세요.
tuyitu719 / 2026/03/14 10:46:52 / 추천 0

안녕하세요.
지금 보이는 증상만 보면, 세션 파일이 2개 생기는 것 자체는 이상한 동작이 아닐 가능성이 큽니다.
현재 설정에서 sess_time_to_update = 300 이면 CodeIgniter 3가 세션 시작 후 __ci_last_regenerate 값을 보고, 일정 시간이 지나면 자동으로 session ID를 재생성합니다. CI3 소스에도 __ci_last_regenerate 가 없으면 현재 시간을 넣고, 설정한 시간(여기서는 300초)이 지나면 sess_regenerate() 를 호출하도록 되어 있습니다.

그리고 __ci_last_regenerate|i:...; 만 들어 있는 값은 CI3가 내부적으로 쓰는 정상 메타데이터입니다.
즉, 그 값이 보인다고 해서 그 자체가 오류는 아닙니다. 오히려 “마지막으로 세션 ID를 갱신한 시각”을 저장하는 용도에 가깝습니다. CI3 세션 초기화 코드에서도 $_SESSION['__ci_last_regenerate'] 를 직접 사용합니다.

또 하나 중요한 건, 지금 설정이 sess_regenerate_destroy = FALSE 라는 점입니다.
이 값은 세션 ID를 재생성할 때 예전 세션 데이터를 바로 삭제하지 않을지를 결정하는 옵션인데, CI3 문서에서 FALSE 일 경우 old session ID와 연결된 데이터가 남아 있을 수 있다고 설명합니다. 그래서 자동 재생성이 일어나면 예전 세션 파일 + 새 세션 파일이 잠시 같이 보이는 것이 가능합니다.

그래서 질문 내용만 놓고 보면,
“같은 시간에 세션 파일이 2개 생긴다”
→ 이건 sess_time_to_updatesess_regenerate_destroy = FALSE 조합 때문에 생길 수 있는 정상 범주 동작입니다.

다만, 말씀하신 것처럼 새로 생긴 파일에는 __ci_last_regenerate 만 있고, 실제 로그인 값들이 비어 있는 것처럼 보인다면, 그때는 재생성 자체보다 쿠키 설정이나 도메인/경로/프로토콜 불일치를 같이 봐야 합니다.
CI3는 세션 쿠키를 만들 때 sess_cookie_name, cookie_path, cookie_domain, cookie_secure 같은 값을 사용하고, 현재 세션 ID와 맞으면 쿠키를 다시 내려줍니다. 그래서 도메인, 서브도메인, http/https, 쿠키 경로가 안 맞으면 브라우저가 다른 세션 쿠키를 보내서 “새 세션만 읽는 것처럼” 보일 수 있습니다.

제일 쉬운 확인 방법은 아래 순서입니다.

  1. 테스트용으로 일단
    sess_time_to_update = 0
    으로 바꿔보세요.
    이러면 자동 세션 ID 재생성이 꺼지므로, 문제가 재생성 때문인지 바로 구분할 수 있습니다. CI3는 sess_time_to_update > 0 일 때만 자동 재생성을 수행합니다.

  2. 세션 파일이 두 개 남는 게 헷갈리면
    sess_regenerate_destroy = TRUE
    로 바꿔보세요.
    그러면 재생성 시 old session data를 제거하는 쪽으로 동작합니다. 문서상 이 옵션은 “auto-regenerating 시 old session ID와 연결된 데이터를 destroy 할지”를 결정합니다.

  3. 아래도 꼭 같이 확인해 보세요.

    • cookie_domain

    • cookie_path

    • cookie_secure

    • base_url

    • 실제 접속 주소가 http 인지 https 인지

    • 서브도메인을 쓰는지
      CI3는 이 값들을 바탕으로 세션 쿠키를 생성하므로, 여기 하나만 어긋나도 세션이 유지되지 않는 것처럼 보일 수 있습니다.

  4. 그리고 경로도 한 번 다시 보세요.
    질문 본문에는 설정이 /var/lib/php/session/ 인데, 확인하신 폴더는 /var/lib/phpsession/ 처럼 적혀 있습니다. 단순 오타일 수도 있지만, 실제로는 설정 경로와 확인한 경로가 정확히 같은지, 그리고 그 디렉터리가 writable 한지도 확인하시는 게 좋습니다. CI3의 files 드라이버는 sess_save_path 에 설정된 writable 디렉터리를 사용합니다.

정리하면,
세션 파일 2개 생성 + __ci_last_regenerate 값만 보이는 것 자체는 CI3의 세션 ID 자동 재생성과 관련된 정상 흔적일 가능성이 큽니다.
먼저 sess_time_to_update = 0 으로 바꿔서 재생성 문제인지 확인해 보시고, 그다음 cookie_domain / cookie_path / http/https / 서브도메인 쪽을 같이 점검해 보시는 게 가장 빠릅니다.