CI 묻고 답하기

제목 CI 세션 (DB) 로그인 여부 확인 시 세션 row 발생 문제
카테고리 CIBOARD
글쓴이 학학이 작성시각 2017/02/01 09:47:55
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 3224   RSS

CI 세션을 통한 로그인 / 로그아웃 구현 시 현재 로그인 여부 확인 시 문제 질문 드립니다.

 

test.com 이라는 도메인으로 접속하면 맨처음 로그인 여부를 확인합니다.

로그인 O -> test.com으로 이동 ( href / )

로그인 X -> test.com/login 이동 ( href /login )

 

이 상황에서 로그인 O / X 여부를 login.php 에서 

public function __construct()
  {
	$this->_ci =& get_instance();
  }

public function checkLogin()
{
  $this->_ci->load->library('session');
  
  if ( $this->_ci->session->userdata('session_id') ) {
  // 로그인 O     / 이동
  } else {
  // 로그인 X     /login 이동
  }
}

 

대충 이런식인데. 여기서 문제가 맨처음 test.com으로 접근하면 해당 login.php 를 한번을 꼭 타야하는데 ( 세션을 통한 로그인 여부 확인 위해) 이 때 무조건 session DB에 row가 생깁니다.

여기서 그냥 창을 닫으면 해당 row가 유지된 상태로 남아있습니다.(  session_id, ip_address, user_agent, last_activity 값이 들어간 상태 ) 

해당 브라우저를 닫고 시간이 흐른뒤 ( 아마 세션 설정의 sess_time_to_update 시간값 이후인 것 같습니다.)  다시 test.com 에 접근하면 위와 마찬가지로 값이 들어간 세션이 계속 생성됩니다. 

만약, ID/PW 입력 하면 해당 row의 `user_data` 칼럼에 데이터가 들어갑니다.

 

질문의 요약은 login을 판단하는 부분에서 session 라이브러리를 호출하면 그 순간 DB에 세션이 생성되고 이것을 일정 기간 동안 사용하지 않으면 세션 ID가 바꿔서 해당 세션은 그대로 남아있게 되어 제어를 할 수 없게 되는데 다른분들도 이런 상황이 나타나나요?

 

 

 

---------추가

http://www.codeigniter-kr.org/bbs/view/qna?idx=10810

이 글의 케이든 님의 답변과 비슷한 문제인것 같습니다. 그래서 로그아웃은 해결했는데. 전 로그인에서도 문제가 발생하네요..

 

 

---------추가

http://codeigniter-kr.org/bbs/view/etc_qna?idx=2534

찾다가 내부적으로 세션 gc가 발생한다는 사실을 확인했습니다. 실제로 gc 발생 후 DB row 가 없어지는지 확인해보겠습니다.

 다음글 CI 세션 Core 질문 _sess_gc() 함수 관련 (1)
 이전글 Codelgniter에서 db관련하여 어떻게 setti... (1)

댓글

변종원(웅파) / 2017/02/01 17:53:09 / 추천 0

gc 돌리시면 되는데 어떤게 문제인가요?

링크글 답변에도 제가 뭐가 문제인지 물어보는게 있습니다.66

그런 로우들이 시스템에 영향을 미칠까 생각하시는건지 링크글 질문처럼 찜찜하신건지요? ^^

학학이 / 2017/02/02 13:17:05 / 추천 0

Session.php에서 생성자 부분에 _sess_gc(); 함수 실행 부분이 주석 처리되어 GC가 안 돌았습니다.

주석 제거하고 100% 확률(기존 5%)로 테스트 해보니 잘 없어지는 거 확인했습니다.

 

@변종원(웅파) 

만약 저처럼 주석으로 인해 GC가 안 돌면 세션을 $this->session->sess_destroy(); 로 코드에서 삭제 하지 않으면 row는 계속 남아있습니다

만료시간이 지나서 풀리는 세션은 row가 삭제되지 않고 나중에 GC가 수행될때 row를 지우는데 이게 안되서 질문했습니다.

해당 row를 지우지 않으면 계속 쌓이고 필요없는 세션 정보들이 계속 table에 남아 있다면 성능상도 안 좋을 것 같아 왜 안 없어지는지 궁금했습니다. (다른 분들은 지워진다고 하시는데 저는 계속 남아있어서..)

성능상 안 좋을거라 생각한 이유는 어차피 쿠키의 지정된 id로 table에서 session_id를 찾을텐데 아무 필요없는 row가 생긴다면 select에서 안 좋을 거라 생각했습니다.