CI 묻고 답하기

제목 CI2 세션에 대해 문의드립니다..
카테고리 CI 2, 3
글쓴이 js 작성시각 2025/06/24 08:25:35
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 114   RSS

안녕하세요.

php5.4, ci2 환경에서 운영하던 프로젝트를 php7.4, ci2 환경으로 이관하여 (서버도 이관)

운영할 준비 하고 있습니다.

 

여러 서비스가 있는데, 참 희안하게 특정 A프로젝트 에서만 세션문제가 자꾸 발생합니다.

(로그인 후 조금있으면 로그인세션 풀림) PC, 모바일 모두 해당.

 

이런저런 테스트를 하다보니 PC는 좀 잡힌것 같은데 (이것마저도 한 10분 후에 다시 세션이 풀립니다.)

모바일은 툭하면 풀리고..;  대체 어느부분을 확인해야 할지 감이 안잡힙니다. ㅠㅠ

 

$config['sess_cookie_name']     = 'ci_session';

$config['sess_expiration']      = 7200;

$config['sess_expire_on_close'] = TRUE;

$config['sess_encrypt_cookie']  = FALSE;      // 암호화 사용 권장

$config['sess_use_database']    = TRUE;

$config['sess_table_name']      = 'ci_sessions';

$config['sess_match_ip']        = FALSE;

$config['sess_match_useragent'] = FALSE;

$config['sess_time_to_update']  = 300;

 

$config['cookie_prefix']    = "";

$config['cookie_domain']    = ".{domain}";

$config['cookie_path'] = "/";

$config['cookie_secure']    = FALSE;

 

 

로그인 직후

function make_session($attr=Array())

{

    $CI =& get_instance();

    extract($attr);//넘어온 배열을 php 변수로 분리//리스트 데이터 추출

    $session = array(

        'm_user_idx'        => $idx,

        'm_user_id'         => $user_id,

        'm_user_email'      => $user_email,

        'm_user_name'       => $user_name,

        'm_pc_point'        => $pc_point

    );

    $CI->session->set_userdata($session);

    $CI->session->sess_update();   // DB에 확실히 저장

}

 

 

조언좀 구해봅니다..

 이전글 CI Log 관련 질문드립니다. (1)

댓글

darkninja / 2025/06/25 21:41:08 / 추천 0

https://adot.ai/multillm

에이닷에게 질문 내용을 그대로 입력하고 물어보았습니다

안녕하세요.

php5.4, CodeIgniter 2 환경에서 php7.4, CodeIgniter 2 환경으로 이관 후 특정 프로젝트에서만 로그인 세션이 자꾸 풀리는 문제를 겪고 계신 상황에 대해 말씀해 주셨습니다. PC와 모바일 모두 동일하게 세션 유지에 문제가 있고, 특히 모바일에서 더욱 빈번히 세션이 만료되는 현상입니다.

세션 만료 문제는 PHP와 세션 설정, CodeIgniter 세션 라이브러리 설정, 서버 환경(특히 세션 저장 방식), 그리고 브라우저/클라이언트 환경 등 다양한 요인에서 기인할 수 있습니다. 다음과 같은 점들을 단계적으로 점검해보시길 권해드립니다.

 

1. 세션 설정 관련 점검

  • sess_expiration, sess_expire_on_close 설정

    현재 설정은 아래와 같습니다.

    php

    $config['sess_expiration'] = 7200; // 2시간 $config['sess_expire_on_close'] = TRUE; // 브라우저 종료시 세션 만료
    sess_expire_on_close가 TRUE면 사용자가 브라우저를 닫으면 세션이 종료됩니다. 모바일 환경에서 브라우저가 백그라운드로 이동하거나 앱이 자주 종료되는 경우 세션이 풀릴 수 있습니다.

    따라서 모바일에서 세션 유지가 중요하다면 sess_expire_on_close를 FALSE로 변경하는 것을 고려해보세요2.
  • 쿠키 도메인 및 경로 설정 확인

    php

    $config['cookie_domain'] = ".{domain}"; $config['cookie_path'] = "/"; $config['cookie_secure'] = FALSE;
    • 모바일 환경과 PC 환경 모두에서 쿠키가 정상적으로 전달되는지 확인이 필요합니다.
    • 특히 cookie_domain 설정이 올바른지 꼭 확인하세요. 도메인이 틀리거나 하위 도메인 문제로 쿠키가 공유되지 않는 문제가 있을 수 있습니다.
    • cookie_secure가 FALSE이므로 HTTPS 여부와는 무관하지만, 가능하면 HTTPS에서 사용 시 TRUE로 설정하는 것이 권장됩니다2.
  • 시간 관련 서버 설정

    서버의 시간이 정확한지 확인하세요. 서버 시계가 뒤틀려 있으면 세션 만료 타이밍이 맞지 않을 수 있습니다.

 

2. 세션 저장 방식 및 데이터베이스 확인

  • sess_use_database = TRUE로 세션 데이터를 DB에 저장하는 경우, DB 테이블(ci_sessions) 구조 및 세션 기록 갱신이 제대로 이루어지는지 확인해야 합니다.
  • 특이점은 다른 프로젝트는 문제가 없는데 특정 A프로젝트에서만 세션 문제가 발생한다는 점입니다. 이는 A프로젝트의 DB 연결 설정, 세션 테이블 사용 여부, 혹은 세션 테이블에 특이한 쿼리가 있지는 않은지 점검할 필요가 있습니다.
  • 세션 테이블의 last_activity 필드가 주기적으로 업데이트되는지, 세션 레코드가 정상적으로 삭제되고 생성되는지 모니터링을 권장합니다.

 

3. PHP 7.4와 CodeIgniter 2 호환성 문제

  • PHP 7.4에 올라오면서 CodeIgniter 2의 세션 라이브러리가 PHP 7.4 환경에 완벽 최적화되어 있지 않을 가능성이 있습니다.
  • PHP 7.4에서는 세션 관련 내장 함수 동작이 PHP 5.x와 차이가 있고, 특정 타입 비교 동작 등이 변경되어 세션 만료 처리에 영향을 줄 수 있습니다3.
  • CI2에서 PHP 7.4 호환성 문제를 완전히 해결하지 못했을 경우, 다음을 고려해 보세요.
    • CI3 이상 버전으로 업그레이드 (가능하면)
    • 현재 세션 라이브러리를 PHP 7.4와 호환되도록 커스터마이징
    • PHP 세션 설정(php.ini의 session.gc_maxlifetimesession.save_path 등) 확인 및 조정

 

4. 세션 갱신 관련 설정 확인

  • $config['sess_time_to_update']가 300초(5분)로 설정되어 있어 5분마다 세션 아이디가 갱신됩니다.
  • 이 갱신 과정에서 문제가 발생할 수도 있으니, 이 값을 늘리거나 임시로 0으로 설정하여 테스트해보는 것도 도움이 될 수 있습니다2.

 

5. 기타 점검 사항

  • 모바일에서 세션이 자주 끊어진다면, 모바일 앱 또는 브라우저에서 쿠키를 차단하거나 제한하는 경우는 없는지 확인하세요.
  • 세션 데이터 저장 호출부 (make_session 함수 등)에서 세션이 올바르게 생성, 갱신되고 있는지도 로그를 통해 꼼꼼히 점검해보셔야 합니다.

 

요약

점검 항목 권장 조치
sess_expire_on_close 설정 모바일 세션 유지 위해 FALSE로 변경 권장
쿠키 도메인 & 경로 모바일/PC 모두에서 쿠키 공유 가능한지 확인
DB 세션 테이블 세션 레코드 갱신 및 삭제 정상 작동 여부 점검
PHP 7.4 호환성 CI2 한계, CI3 업그레이드 또는 세션 라이브러리 수정 고려
세션 갱신 주기 (sess_time_to_update) 값을 늘리거나 0으로 테스트
모바일 브라우저 환경 쿠키 및 세션 제한 확인

이 문제는 복합적인 환경 이슈가 많아 한 가지 원인으로 확정하기 어렵습니다. 위 조치들을 순차적으로 점검 및 테스트하시면서 문제 재현 원인과 패턴을 정밀 분석하시면 해결에 가까워지실 것입니다.

필요하다면 상세한 로그를 남겨 세션 생성, 갱신, 만료 시점을 기록하는 것도 큰 도움이 됩니다.

문제가 잘 해결되길 기원합니다. 추가 질문 있으시면 언제든 문의해 주세요.

 

 

darkninja / 2025/06/25 21:45:12 / 추천 0

https://chatgpt.com/

챗지피티에게 질문 내용을 그대로 입력하고 물어보았습니다

 

안녕하세요!
PHP 7.4 + CodeIgniter 2 환경에서 세션 문제가 특정 프로젝트(A프로젝트)에서만 발생하는 상황, 특히 로그인 후 일정 시간 뒤 세션이 풀리는 증상은 꽤 까다로운 이슈일 수 있습니다. 아래에 가능한 원인들과 점검 포인트를 정리해 드릴게요.


✅ 주요 점검 항목

1. sess_expire_on_close = TRUE 설정


 
php
$config['sess_expire_on_close'] = TRUE;
  • 이 설정은 브라우저를 닫으면 세션이 만료되게 합니다.

  • 모바일에서는 앱 내 WebView나 브라우저가 백그라운드로 갔다가 다시 켜질 때 브라우저가 새로 열린 것으로 인식되어 세션이 사라질 수 있습니다.

  • 우선 FALSE로 설정해 보세요.


 
php
$config['sess_expire_on_close'] = FALSE;

2. CI 2.x의 sess_update()sess_time_to_update의 관계


 
php
$config['sess_time_to_update'] = 300; // 5분마다 세션 ID 갱신
  • CI2는 기본적으로 일정 주기마다 세션 ID를 변경하면서 새로 저장합니다.

  • 하지만 sess_update()를 수동으로 호출했을 때 중복된 갱신 충돌이 날 가능성도 있습니다.

  • CI 2의 세션 라이브러리는 PHP 7.x에서 미묘한 충돌 가능성이 있으므로 아래 중 하나로 시도해보세요:

    • sess_update() 호출을 제거해보기

    • 또는 sess_time_to_update를 더 늘려보기 (예: 3600)


3. 세션 테이블 구조 점검

ci_sessions 테이블 구조가 PHP 7.4에서 정상 작동할 수 있도록 되어 있는지 점검해보세요:


 
sql
CREATE TABLE IF NOT EXISTS `ci_sessions` ( `session_id` varchar(40) NOT NULL DEFAULT '0', `ip_address` varchar(45) NOT NULL DEFAULT '0', `user_agent` varchar(120) NOT NULL, `last_activity` int(10) unsigned NOT NULL, `user_data` text NOT NULL, PRIMARY KEY (`session_id`) );

PHP 7에서는 IP 주소가 IPv6를 사용하면서 ip_address가 45자까지 필요합니다. 기존 16자면 잘리는 문제가 있을 수 있습니다.


4. 서버 시간 문제 (로그 시간 차이 등)

  • 서버 시간이 잘못 설정되어 있거나, last_activity의 기준이 서버 시간과 맞지 않으면 만료 오판 가능성 있음.

  • 확인 방법:


 
bash
date php -r "echo date('Y-m-d H:i:s');"

둘이 차이 없는지 확인하세요.


5. 모바일에서의 Cookie 문제

모바일 환경에서:

  • 쿠키가 저장되지 않거나, 도메인이 맞지 않거나,

  • HTTPS 문제 (cookie_secure = FALSE)로 인해 저장 실패 가능성 있음

점검:

  • 개발자 도구에서 모바일에서도 쿠키가 잘 저장되는지

  • 쿠키가 보내지고 있는지 (응답/요청 헤더 확인)

  • cookie_domain이 서브도메인 포함하고 있는지


 
php
$config['cookie_domain'] = '.example.com'; // 점 꼭 포함!

6. PHP의 session.gc_maxlifetime 설정

php.ini 또는 .htaccess에서 다음 설정 확인:


 
ini
session.gc_maxlifetime = 7200
  • 이 값이 너무 작거나, sess_expiration보다 작으면 세션이 서버에서 빨리 사라질 수 있습니다.

또한, GC가 작동 안 하는 경우도 있으니 session.save_path 경로의 파일들도 잘 유지되고 있는지 확인해보세요 (CI에서 DB 세션 쓰더라도 PHP 자체 설정 영향을 받을 수 있음).


✅ 추천 순서

  1. sess_expire_on_closeFALSE로 바꿔보기

  2. cookie_domain 확인 (. 포함 여부, 도메인 일치)

  3. sess_time_to_update를 3600으로 늘리거나 sess_update() 제거

  4. ci_sessions 테이블의 IP 컬럼 45자로 변경

  5. 서버 및 PHP 시간 동기화 확인

  6. 모바일에서 실제 쿠키 저장/전송 확인


필요하시면 phpinfo()세션 테이블 구조, 또는 요청 헤더 정보를 같이 공유해 주시면 더 깊게 진단 도와드릴 수 있습니다.
추가로 원하시면 CodeIgniter 3 또는 다른 세션 관리 방식으로 마이그레이션 조언도 드릴 수 있어요.

 

js / 2025/06/26 08:04:45 / 추천 0

챗gpt로 수십번 문답해서 테스트 해봤는데 결국 100% 해결되지는 않았습니다...

관심 감사합니다.