CodeIgniter

Session

수업소개

이번 수업에서는 세션을 이용해서 사용자를 식별하는 방법에 대해서 알아본다. 또 복수의 controller를 만들어서 사용하는 방법을 통해서 코어(core) 로직을 상속받아서 확장하는 방법에 대해서도 알아본다. 

Session이란?

HTTP 프로토콜은 사용자의 상태를 유지하는 능력이 없다. 다시 말해서 사용자가 로그인을 통해서 인증을 했다는 사실을 지속적으로 파악하고 있기 어렵다. 그래서 고안된 것이 사용자가 웹서버에 접근 할 때 사용자를 식별 할 수 있는 URL 파라미터를 릴레이로 전달하거나 브라우저에 쿠키를 심어서 사용자의 상태를 기억하는 방법을 사용한다. 이에 대한 기본적인 내용은 PHP 기본 수업의 쿠키와 세션편을 참고한다.

두 방법 모두 보안상의 취약점으로 인해서 잘 사용하지 않는다. 대신 사용자를 식별 할 수 있는 의미 없는 문자만을 쿠키로 저장하고, 사용자에 대한 식별자가 서버에 도착 했을 때 이것과 일치하는 사용자 정보를 데이터베이스에서 조회해서 인증 상태를 유지하는 방법을 사용한다. 이와 관련된 다양한 보안 이슈가 있는데 이에 대해서는 PHP 고급 수업의 보안편을 참고한다.

CodeIgniter와 Session

PHP 기본적으로 사용자의 세션 정보를 파일로 저장한다. 하지만 세션은 사용자를 식별하는 정보이기 때문에 보안이 매우 중요하기 때문에 이것을 로컬시스템의 파일로 저장하는 것은 보안 취약점이 된다. 또 PHP가 동작하는 서버가 여러대로 분산되면 사용자의 세션 정보를 공유하는 것이 어려워지기 때문에 세션 정보에 대한 저장소로 데이터베이스를 이용한다. 

CodeIgniter는 사용자의 세션정보와 데이터베이스를 연결해주는 기능을 기본적으로 가지고 있다. 다음은 이 기능을 활성화하는 방법이다. 

config 수정

application/config/config.php 파일의 내용을 수정한다. 필수적으로 수정해야 할 것은 아래와 같다. 

  • $config['encryption_key'] = ''; // 32글자의 문자를 입력한다.
  • $config['sess_use_database']    = TRUE; // 세션의 데이터를 데이터베이스에 저장한다.

보안을 위해서 수정을 권하는 부분은 아래와 같다.

  • $config['sess_match_ip']        = TRUE;
  • $config['sess_match_useragent']    = TRUE;

database 테이블 생성

세션 데이터를 저장 할 데이터베이스 테이블을 생성해야 한다. config 설정 값 중에 sess_table_name의 값에 해당하는 세션 테이블을 생성해야 한다. 

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

세션 정보의 사용

라이브러리 로드

세션을 사용하기 위해서는 우선 세션 라이브러리 클래스를 로드 해야 한다. 세션은 서비스 전역에서 사용되는 기능성이기 때문에 application/config/autoload.php 파일의 libraries를 아래와 같이 수정한다. 

$autoload['libraries'] = array('session');

세션 정보 셋팅

세션에 저장된 모든 정보를 열람하고 싶다면 아래와 같이한다.

$this->session->all_userdata()

그 결과는 아래와 유사할 것이다. 

Array
(
    [session_id] => 4a5a5dca22728fb0a84364eeb405b601
    [ip_address] => 127.0.0.1
    [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
    [last_activity] => 1303142623
)

만약 세션 정보에 어떤 정보를 추가하고 싶다면 아래와 같이 한다. 

$this->session->set_userdata(array('logged_in'=> true));

위의 정보를 가져올 때는 아래와 같이 한다. 

$this->session->userdata('logged_in');

예제

태그

태그명 : session_auth

태그주소 : https://github.com/egoing/codeigniter_codeingeverbody/tree/session_auth

참고

댓글

댓글 본문
작성자
비밀번호
  1. refers
    항상 강좌 감사한 마음으로 듣고 있습니다.
    이번 session 강좌를 따라 하다보니 문제가 하나 생겼는데... 혼자 해결을 해보려고 여기저기 열심히 구글링하다가 못찾고 여기 글을올립니다.

    add 쪽에서
    $this->load->helper('url');
    redirect('/topic/get/'.$topic_id);

    요렇게 넣고 접근을하니 data는 db에 정상적으로 insert가되는데 페이지 전환이 안되고 반응이 없습니다. 구글 개발자로 보니 "Failed to load response data"라고 뜨는데요... 이문제 어떻게 해결할수있을까요?

    처음엔 페이지전환이 됐었는데 ckeditor을 적용시키고 나서부터 안되네요.
    참고로 CKEditor 버전은 4.5.9 버젼(현재 최근버전)입니다.
  2. JustStudy
    고맙습니다
  3. 자바몬
    Message: Configured database connection is persistent. Aborting.
    에러 메세지가 뜨시면
    config-database 가셔서 pconnect 밸류값을 FALSE 로 주니까 사라지네염
  4. jongilnose
    저도 이거때문에 조금 해맸었는데요
    ci 3.2에서는 will님처럼 설정을 맞춰주셔야 하고
    table 생성시 3.2에서 제공하는 가이드에 맞춰서 테이블을 생성하셔야 합니다.

    [참고 주소] http://www.codeigniter.com......ion
    중간부분에 자세히 설명되어 있네요 ^^
    대화보기
    • 정진원
      정말 좋은강의 입니다.. 감사합니다.. ^^*
    • will
      ci 3.2 기준 첫번쨰 동영상 예제에서
      $config['sess_driver'] = 'file'; 로하면 계속 오류뜹니다

      $config['sess_driver'] = 'database'; 데이터베이스로 바꿔주고
      밑에글 choish777@hotmail.com님이 쓰신거

      application/config/config.php
      $config['sess_driver'] = 'database'; <-- 파일로 할것인지, DB로 할것인지 선택
      $config['sess_cookie_name'] = 'ci_session';
      $config['sess_expiration'] = 7200;
      $config['sess_save_path'] = 'ci_sessions'; <-- 테이블이름
      $config['sess_match_ip'] = FALSE;
      $config['sess_time_to_update'] = 300;
      $config['sess_regenerate_destroy'] = FALSE;

      php어드민 쿼리실행
      CREATE TABLE IF NOT EXISTS `ci_sessions` (
      `id` varchar(40) NOT NULL,
      `ip_address` varchar(45) NOT NULL,
      `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
      `data` blob NOT NULL,
      PRIMARY KEY (id),
      KEY `ci_sessions_timestamp` (`timestamp`)
      );

      로 하니까 잘되네요
    • will
      .
    • 육점이
      감사합니다. 덕분에 헤매지 않았습니다.^_^
      대화보기
      • choish777@hotmail.com
        config.php 에서 세션설정하는것도 달라졌네요

        $config['sess_driver'] = 'database'; <-- 파일로 할것인지, DB로 할것인지 선택
        $config['sess_cookie_name'] = 'ci_session';
        $config['sess_expiration'] = 7200;
        $config['sess_save_path'] = 'ci_sessions'; <-- 테이블이름
        $config['sess_match_ip'] = FALSE;
        $config['sess_time_to_update'] = 300;
        $config['sess_regenerate_destroy'] = FALSE;
      • choish777@hotmail.com
        ci 업그레이드 되면서 변경된게 있네요

        For MySQL
        CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(40) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        PRIMARY KEY (id),
        KEY `ci_sessions_timestamp` (`timestamp`)
        );

        For PostgreSQL

        CREATE TABLE "ci_sessions" (
        "id" varchar(40) NOT NULL,
        "ip_address" varchar(45) NOT NULL,
        "timestamp" bigint DEFAULT 0 NOT NULL,
        "data" text DEFAULT '' NOT NULL,
        PRIMARY KEY ("id")
        );

        CREATE INDEX "ci_sessions_timestamp" ON "ci_sessions" ("timestamp");
      • egoing
        그건 xdebug란은 것을 이용하고 있기 때문일꺼예요~
        대화보기
        • Zion
          열심히 시청하는 관객입니다.ㅎ;

          궁금한게 있는데요.. 전 var_dump 함수 출력하면 데이터가 그냥 텍스트 로우 파일처럼 보이는데

          이고잉님은 html 태그가 입혀서 출력이 되시던데.. 어떻게 하는건가요?
        • 헐..이런
          3.2 버전 부트스트렙 모달이 안불러져서 이것저것 알아봤는데요..; ㅋㅋㅋ 너무 간단해서 어이없는..ㄷㄷ;;

          밑에 분걸로 해도 안되길래 왜그럴까해서 찾아봤는데..

          부트스트랩 3.2버전쓰시는부는 <div class="modal fade"> 이부분을 <div class="modal show">로 바꿔주시기만 하면됩니다.
        • hanize
          부트스트랩 3.2로 공부하시는 분들은
          두번째 영상에서 modal 창 불러올때 부트스트랩 버전업(V 3.2)으로 아마 영상처럼 적용이 안될겁니다.
          부트스트랩 소스도 약간 다르구요.

          jquery 라이브러리 불러온다음에
          <script>
          $(document).ready(function() {
          $('#myModal').modal('show')
          });
          </script>
          이렇게 modal창을 불러오면 됩니다.
        • 코난도일
          참고에서 "CodeIgniter Session" 링크가 빈 페이지로 나옵니다.
        • 김승갑
          감사합니다. 핵심만 들어있어서 일시정지하고 이것저것하고 보는중이에요 정말 좋은 강의 감사합니다.
        • styner007
          제 개인적으로 맥에서 뭔가 문제가 있었내요,, 윈도환경에서는 잘돌아갑니다,, 포트 80번이 열리지 않아 81번으로 진행하지만,, 계속 진행하겠습니다~
        • styner007
          또,, redirect 만 넣으면 넘어가지가 않내요,, ㅠㅠ 맥쓰고있는데,, 뭔가 개발환경 변경을 심각하게 고민해 봐야 겠어요 ,,,
        • spilist@gmail.com
          세션 테이블을 생성할 때 collation이 utf-8이 맞나 확인하는 과정이 있으면 좋겠네요.
          저는 별 생각없이 코드를 붙여넣기했더니, 세션이 생성은 잘 되는데 이용이 계속 안되더군요.
          그래서 계속 이것저것 살펴보다가, DB를 살펴보니까 이유는 잘 모르겠지만 collation이 라틴어로 세팅이 되어있더라고요; 이걸 utf8_general_ci로 다시 바꾸니까 잘 됐습니다.
        • 물알갱이
          디비에 저장된 세션을 확인하던 중 ie나 firefox에서는 정상적으로 한개씩만 세션이 생성이 되는데 chrome에서만 추가적으로 여러개가 더 생성이 되네요.
          이거 뭐가 문제일까요?? 혹시나 싶어서 config 폴더에 있는 config.php 만 남겨두고 서브폴더에 있는 config.php 파일들을 다 삭제해도 똑같은 현상이 발생해요.
          문제가 뭘까요??
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기