생활코딩

Coding Everybody

Session

토픽 생활코딩 > 서버 > PHP > CodeIgniter

수업소개

이번 수업에서는 세션을 이용해서 사용자를 식별하는 방법에 대해서 알아본다. 또 복수의 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. 존레논아부지
    일단 완료~ !
  2. jeisyoon
    2021.09.26 Ci 4 에서 성공

    Ci 4 의 session library 가 많이 바뀌어 Ci 4 Manual 로 자습후 완성함
    http://ci4doc.cikorea.net......id3
  3. jeisyoon
    2021.08.22 Session - OK

    오래된 강의라 Session Library Autoload Error 로 테스트가 불가하여 강의만 듣고 PASS함
  4. 오래된 영상이라 많이 바꼈네요. 아래 링크 참조하시길..

    http://www.ciboard.co.kr......ver
  5. phphtmldb
    It works! Thanks.
    대화보기
    • MunBe
      오타 하나 때문에 1시간정도 계속 동영상 돌려봤네요 ㅋㅋ
    • 난만이
      아~ 정말 정말 고맙습니다.
      제가 php7을 사용하면서 딱 이 문제(세선이 사라져서 로그인이 되지 않는 문제)에 봉착했었는데
      wil님 말씀대로 php5.6으로 다시 깔아서 하니 바로 되네요.
      정말 고맙습니다.~~~!!!
      대화보기
      • 오지라퍼 스피드웨건
        $this->session->set_userdata(array('logged_in'=> true));<< 이코드 호출하지 못할경우
        function __construct()
        {

        $this->ci =& get_instance();
        } 이런식으로 코드추가 해주시고
        $this->ci->session->set_userdata(array('is_login'=>true)) 이런식으로 사용하시면됩니다
      • 참견쟁이 스피드웨건
        $this -> config - > item();< 전 이것이 사용이 되지않앗습니다 .
        이것이 사용되지 않은 분들은
        config_item(); 이것을 사용해보세요
      • 에그에그
        어려운 세션과정이었습니다...
        autoset (오토셋)이라는 APM 썼는데 ci_session 으로 세션 저장이 안되서 오토셋을 켜보니 phpsession 인가? php 기본 세션네이밍으로만 저장되도록 되어있어서 오토셋을 지우고 비트나미로 갈아탔는데
        비트나미도 버전업이되면서 뭔가 바뀐건지 configure 만 누르면 멈춰버리고...
        하 그래서 apache, php, mysql, phpmyadmin 다 수동설치해가지고 진행하니 되네요...
        밑에분들 댓글 써주셔서 감사합니다. 많은 참고가됏어요

        아! 그리고 APM 과 수동설치했을때의 차이점인지
        아니면 php7으로 넘어오면서 빨라진 속도때문인지는 모르겠는데 phpmyadmin 반응속도가 정말 엄청 빨라졌습니다.

        암이 치유되는느낌...
      • mafu
        감사합니다. ^^
        대화보기
        • will
          코드이그나이터 다시 배우는중인데 php버젼은 5.6x버젼으로사용하시길바랍니다 7.0에서 세션이 자꾸 초기화되네요 강으 ㅣ감사합니다
        • 비만짱구
          IPv4는 localhost를 127.0.0.1로 나타내지만
          IPv6에서는 ::1로 나타냅니다.

          즉, 같은 표현으로 오류가 아닙니다. :)
          대화보기
          • 김세창
            잘봤습니다. 어휴..맨처음동영상에서 막히고.. 엄청 힘든 수업이었습니다 ㅠ
            다름이 아니라, ip_address 부분에서 ip를 못가지고 오는데, 어떻게 해야할까요?
            계속 오류나서, 쿼리는

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

            밑에 분이 공유하신거로 작성했습니다.
            오류는 안나지만 ip_address가 ::1로 작성됩니다.
          • 이름
            학습중 곤란했는데 감사합니다.
            대화보기
            • GreenMan
              CodeIgniter를 설치해야 할 수 있는 건가요?
            • 신입개발자
              정말 설명을 잘하세요
            • 신입1
              항상 감사합니다.
            • 작은선물
              CodeIgniter 3.1.1버전 이후 config.php부분의 session부분이 변경되어서 수정하셔야될듯 싶네요~

              1.config.php
              // 파일로 할것인지, DB로 할것인지 선택
              //$config['sess_driver'] = 'files';
              $config['sess_driver'] = 'database';
              $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;

              2.mysql
              CREATE TABLE IF NOT EXISTS `ci_sessions` (
              `id` varchar(128) NOT NULL,
              `ip_address` varchar(45) NOT NULL,
              `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
              `data` blob NOT NULL,
              KEY `ci_sessions_timestamp` (`timestamp`)
              );

              PRIMARY key 설정

              // When sess_match_ip = TRUE
              ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);

              // When sess_match_ip = FALSE
              ALTER TABLE ci_sessions ADD PRIMARY KEY (id);

              // To drop a previously created primary key (use when changing the setting)
              ALTER TABLE ci_sessions DROP PRIMARY KEY;

              3.database.php

              $db['default'] = array(
              'pconnect' => FALSE // This value
              );

              이렇게 하니깐 되네요~휴휴
            • 신입1
              근대 저는 브라우져에서 넘겨주는 ci_session 의 value가 그대로 테이블에 id값으로 들어가네요....
            • 신입1
              아하 sess_driver 에 database로 설정해야 하군요
              대화보기
              • 신입1
                흠 아무리 해도 ci_sessions 테이블에 데이터가 안들어가네요..... 왜이럴까요 ㅠㅠ
              • 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 버젼(현재 최근버전)입니다.
              • JustStudy
                고맙습니다
              • 자바몬
                Message: Configured database connection is persistent. Aborting.
                에러 메세지가 뜨시면
                config-database 가셔서 pconnect 밸류값을 FALSE 로 주니까 사라지네염
              • 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 파일들을 다 삭제해도 똑같은 현상이 발생해요.
                      문제가 뭘까요??