SMS처리 도우미
이름 Session Library(세션 라이브러리)
카테고리 codeigniter     >     Session Library(세션 라이브러리)
예제(문법)

세션 클래스(Session class)는 사용자 "상태 정보"를 유지하게 해주고, 그들의 (브라우저를 통한)사이트 활동을 알 수 있게 해줍니다.

코드이그나이터는 몇몇 세션 저장 드라이버를 제공합니다. :
      파일 (기본설정, 파일시스템 기반)
      데이터베이스
      redis
      memcached

더욱이, 세션 클래스 기능의 이점을 활용하여, 기타 사용자 정의 세션 드라이버를 만들 수도 있습니다.


세션 클래스 사용
      세션 초기화

            페이지 로드시마다 세션이 전역에서 작동될 것입니다.
            따라서, 세션 클래스는 당신의 컨트롤러 생성자에서 초기화되어야 합니다.
            아니면, 시스템에 의해 자동 로드되어야 합니다.
            대부분의 경우, 세션 클래스는 백그라운드 시스템에서 사람의 개입없이 작동될 것입니다.
            클래스가 초기화되면, 필요에 따라 세션을 읽고 만들고 업데이트할 수 있습니다.
 
       당신의 컨트롤러 생성자에서 세션 클래스를 수동으로 초기화하기 위해 "$this->load->library()"메소드를 사용하세요. :
       $this->load->library('session');

       한번 로드된 후로, 세션 라이브러리 객체는 사용가능한 상태입니다:
       $this->session

       중요사항
             로더 클래스가 코드이그나이터의 기초 컨트롤러에서 인스턴트화되므로, 컨트롤러 생성자에서 해당 라이브러리를 로드하기 전에 "parent::__construct()"메소드를 실행하여야 합니다.


 세션 작동 방법?
       페이지가 로드될 때, 세션 클래스는 사용자 브라우저에서 받은 세션 쿠키가 유효한지 확인합니다.
       해당 세션 쿠키가 존재하지 않을 경우(또는 서버에 저장된 세션 쿠기가 만료되었다면), 새로운 세션을 만들고 저장합니다.

       유효한 세션이 존재하지 않을 경우, 해당 세션 정보는 업데이트됩니다.
       매 업데이트마다, 세션 ID는 설정정보에 맞게 재생성됩니다.

       한번 로드된 이후, 세션 클래스가 자동으로 작동된다는 것을 이해해야 하며 이것은 중요한 내용입니다.
       위 내용이 일어나도록 당신은 어떤 일도 할 필요가 없습니다.
       자동화되어 있으므로, 당신은 단지 세션을 읽고, 쓰고, 업데이트하면 됩니다. (아래에서 세션 데이터 작업 방법을 확인할 수 있습니다.)

       주의사항
             "HTTP" 프로토콜을 기반으로 하므로 CLI 하에서, 세션 라이브러리는 자동으로 종료될 것입니다.

 

  동시성에 대한 내용
        부하가 많은 AJAX 방식의 웹사이트 개발이 아니라면, 이 섹션을 고려하지 않아도 됩니다.
        반면에, 퍼포먼스 이슈를 겪고 있다면, 정확히 이 내용이 필요한 내용입니다.

        코드이그나이터 이전 버전에서의 세션은 잠금 기능, 즉 두가지 HTTP 요청이 동시에 발생했을 때 작동되는 기능이 제공되지 않습니다.
        보다 적절한 기술적 용어를 찾는다면, "요청이 차단되지 않음"입니다.

        하지만, "차단되지 않은 요청"은 세션 컨텍스트 내에서 안전한지 않음을 의미하기도 합니다.
        왜냐하면, 한 요청에서 세션 데이터를 수정하면, 이어지는 두번째 동시 요청이 방해받을 수 있기 때문입니다.
        이 점은 많은 이슈의 근본적인 이유였고, 왜 코드이그나이터 3.0에서 세션 라이브러리 재수정이 있었는지 설명하는 이유가 됩니다.

        그리고, 우리가 이점을 이야기하는 이유는, 당신이 퍼포먼스 이슈의 원인을 찾다, 잠금 문제로 판단하여 잠금을 해제하려 할 수 있기 때문입니다.....

        그렇게 하지 마십시오!
        잠금 기능을 해제하는 것은 잘못된 일이고, 더 많은 문제를 일으킬 것입니다!

        잠금 기능은 이슈가 아니라, 해결책입니다.
        문제는 세션을 이미 처리한 후에도, 세션이 여전히 열려 있고 더 이상 필요하지 않다는 점입니다.
        따라서, 당신에게 필요한 것은 세션이 더이상 필요하지 않을 경우, 해당 세션을 닫는 것입니다.

        이야기는 길지만 요점은 간단합니다. - 세션 변수를 더 이상 사용할 필요가 없다면, "session_write_close()" 메소드를 호출하십시오.

 세션 데이터란?
       세션 데이터는 특정 세션 ID(쿠키)와 연결되어 있는 간단한 연관 배열입니다.

       이전에 PHP의 세션을 사용하였다면, PHP의 $_SESSION 전역 변수와 유사합니다.
       (그렇지 않다면, "https://secure.php.net/manual/en/reserved.variables.session.php" 내용을 읽어보세요.)

       코드이그나이터는 PHP가 제공하는 세션 핸들러 매커니즘을 사용하므로, 동일한 방법으로 세션 데이터에 액세스할 수 있습니다.
       세션 데이터는 $_SESSION 배열을 읽고, 설정하고 해제함으로 조작할 수 있습니다.
 
       게다가, 코드이그나이터는 2가지 특별한 세션 데이터 타입을 제공합니다.
       그 점은 아래 설명되어 있으며, 개요는 다음과 같습니다 : 플래시 데이터, 임시데이터
 
       주의사항
             이전 버전에서, 코드이그나이터의 일반적인 세션 데이터를 "userdata"로 표기하였습니다.
             이 단어가 매뉴얼의 다른 곳에서 쓰일 수 있으므로 유념해 두십시오.
             이러한 경우의 대부분은 사용자정의 "userdata" 메소드 작동 방법을 설명할 때 사용됩니다.

 세션 데이터 검색
       세션 배열의 모든 정보는 $_SESSION 전역 변수를 통해 얻을 수 있습니다.:
       $_SESSION['item']

       매직(magic) 획득자를 통해서도 얻을 수 있습니다.:
       $this->session->item

       혹은  이전 버전과의 호환성을 위해, "userdata()" 메소드를 통해서도 가능합니다. :
       $this->session->userdata('item');

       "item"은 가져올 항목에 해당되는 배열키입니다.
       예를 들어, "name"항목에 저장한 내용을 $name 변수에 할당합니다. 다음처럼 할 수 있습니다:
       $name = $_SESSION['name'];
       // or:
       $name = $this->session->name
       // or:
       $name = $this->session->userdata('name');


       주의사항
             해당 "item"을 찾지 못한 경우, "userdata()" 메소드는 "NULL"을 반환합니다.

       모든 "userdata" 항목을 가져오길 원한다면, 간단히 키를 생략할 수 있습니다.
       (매직 획득자의 경우 반드시 속성이 필요합니다.) :
       $_SESSION
       // or:
       $this->session->userdata();

  
 세션 데이터 추가
       특정 사용자가 귀하의 사이트에 로그인했다고 가정해 보겠습니다.
       인증을 받으면 사용자 이름과 전자 메일 주소를 세션에 추가하여, 필요할 때 데이터베이스 쿼리를 실행할 필요없이 해당 데이터를 전역적으로 사용할 수 있습니다.

       당신은 간단하게 $_SESSION 배열 변수로 데이터를 할당할 수 있습니다. 또는 "$this->session" 속성을 통해 그렇게 할 수 있습니다.

       또는 "userdata"에 액세스하는, 이전 메소드 역시 사용가능합니다.
       이 경우, 새로운 데이터를 담은 배열을 "set_userdata" 메소드에 전달할 수 있습니다. :
       $this->session->set_userdata($array);

       여기서 "$array"는 새로운 데이터를 담은 연관 배열입니다. 다음은 한가지 예입니다. :
       $newdata = array(
        'username'  => 'johndoe',
        'email'     =>
'johndoe@some-site.com',
        'logged_in' => TRUE
       );

       $this->session->set_userdata($newdata);

       "userdata" 값 중 하나만 추가할 경우, "set_userdata()" 메소드는 다음 방법을 지원합니다. :
       $this->session->set_userdata('some_name', 'some_value');

       "session"값이 존재하는지 확인하려면, "isset()" 메소드로 체크하세요 :
       // returns FALSE if the 'some_name' item doesn't exist or is NULL,
       // TRUE otherwise:
       isset($_SESSION['some_name'])

       아니면, "has_userdata()" 메소드를 호출할 수 있습니다.:
       $this->session->has_userdata('some_name');

 세션 데이터 제거
       다른 변수들과 동일하게, "$_SESSION"의 특정 값을 "unset()"메소드를 통해 해제할 수 있습니다. :

       unset($_SESSION['some_name']);

       // or multiple values:

       unset(
        $_SESSION['some_name'],
        $_SESSION['another_name']
       );

       또한, "set_userdata()" 메소드로 세션 정보를 추가 할 수 있으며, "unset_userdata()" 메소드에 "session key"인자를 전달하여 해당 정보를 제거할 수 있습니다.
       예를 들어, 세션 데이터 배열에서 "some_name"을 제거하려면 다음처럼 할 수 있습니다. :
       $this->session->unset_userdata('some_name');

       이 메소드는 또한 배열로 된 항목 집합 값을 해제할 수 있습니다. :
       $array_items = array('username', 'email');

       $this->session->unset_userdata($array_items);


       주의사항
             이전 버전에서, "key => 'dummy value'" 형태의 연관 배열을 받아들이는데 "unset_userdata()"가 사용되었지만 해당 기능은 더 이상 지원되지 않습니다.

 플래시 데이터
       코드이그나이터는 "플래시 데이터(flashdata)"를 지원합니다.
       그리고, 이어지는 요청에만 사용가능하며 이후로는 (자동으로) 삭제되는 세션 데이터 형태를 지원합니다.

       이 기능은 일회성 정보 또는 오류 및 상태 메시지를 표시하는데 유용합니다. (예 : "2개의 레코드가 삭제되었습니다.")

       "flashdata"변수는 일반적인 세션 변수이며 '__ci_vars' 키 표기 형태로만 특별히 표시되어 있습니다 (이 정보를 건드리지 마세요).

       기존 항목을 '플래시 데이터(flashdata)'로 표시하려면 다음처럼 하세요 :
       $this->session->mark_as_flash('item');

       복수 아이템을 "flashdata"로 표시하려면, 간단히 배열 형태의 키를 전달하세요 :
       $this->session->mark_as_flash(array('item', 'item2'));

       플래시 데이터를 추가하려면 다음처럼 하십시오:
       $_SESSION['item'] = 'value';
       $this->session->mark_as_flash('item');

       혹은 다른 방법으로 "set_flashdata()" 메소드를 사용하세요 :
       $this->session->set_flashdata('item', 'value');
 
       아니면, "set_userdata()"와 동일하게, "set_flashdata()" 메소드에 인자로서 배열을 넣을 수 있습니다.

       그리고, "$_SESSION"를 통해 세션 값을 읽는 일반적인 방법으로, "flashdata" 변수를 읽을 수 있습니다. :
       $_SESSION['item']

       중요사항
             "userdata()" 메소드는 플래시 데이터("flash data") 항목을 반환하지 않습니다.

       (다른 종류가 아닌) "flashdata"를 읽는다는 것을 명확히 하고 싶을 경우, "flashdata()" 메소드를 사용할 수 있습니다 :
       $this->session->flashdata('item');

       혹은 모든 플래시 데이터를 배열 형태로 가져오길 원한다면 단순히 매개 변수(인자)를 생략할 수 있습니다. :
       $this->session->flashdata();

       주의사항
             해당 항목을 찾지 못한 경우, "flashdata()" 메소드는 "NULL" 값을 반환합니다.


       이어지는 요청에서 "flashdata" 변수를 유지할 필요가 있다면, "keep_flashdata()" 메소드를 사용할 수 있습니다.
       이 경우, 유지하고자 하는 단일 아이템 또는 배열로 된 플래시 데이터("flashdata") 항목을 전달할 수 있습니다.
       $this->session->keep_flashdata('item');
       $this->session->keep_flashdata(array('item1', 'item2', 'item3')); 


 임시 데이터
       코드이그나이터는 "임시 데이터(tempdata)" 및 만료 시간이 정해진 세션 데이터도 지원합니다.
       세션 값 및 세션 자체가 만료되거나 세션이 삭제되면, 해당 값은 자동적으로 제거됩니다.

       "flashdata"와 유사하게, "임시 데이터(tempdata)"는 "__ci_vars" 키 표기 형태로 표시되는 일반 세션 변수입니다. (이 정보를 건드리지 마세요.)

       기존 아이템을 "임시 데이터(tempdata)"로 표시하려면, "mark_as_temp()" 메소드에 해당 키(key)와 만료 시간(초단위)을 전달하세요. :
       // 'item' will be erased after 300 seconds
       $this->session->mark_as_temp('item', 300); 

       복수 아이템을 "임시 데이터(tempdata)"로 표시하려면 두 가지 방법을 사용할 수 있습니다.
       이 두가지 방법은 모든 아이템에 같은 만료 시간을 지정할 지, 아닐지에 따라 결정됩니다 :
       // Both 'item' and 'item2' will expire after 300 seconds
       $this->session->mark_as_temp(array('item', 'item2'), 300);

       // 'item' will be erased after 300 seconds, while 'item2'
       // will do so after only 240 seconds
       $this->session->mark_as_temp(array(
        'item'  => 300,
        'item2' => 240
       ));

       "임시 데이터(tempdata)"를 다음과 같이 추가할 수 있습니다 :
       $_SESSION['item'] = 'value';
       $this->session->mark_as_temp('item', 300); // Expire in 5 minutes

       또는 "set_tempdata()" 메소드를 사용하여 추가할 수 있습니다. :
       $this->session->set_tempdata('item', 'value', 300);


       그리고, "set_tempdata()"의 인자로서 배열을 넣을 수 있습니다. :
       $tempdata = array('newuser' => TRUE, 'message' => 'Thanks for joining!');
       $this->session->set_tempdata($tempdata, NULL, $expire);

       주의사항
             만료값이 지정되지 않거나 "0"이면, "time-to-live" 값은 기본값으로 300초(또는 5분)가 세팅됩니다.

  
       임시데이터 값을 읽으려면, $_SESSION 전역 배열 변수를 통해 그렇게 할 수 있습니다. :
       $_SESSION['item']
  
       중요사항
             "userdata()"메소드는 임시데이터 항목을 반환하지 않습니다.

       혹은, "임시데이터(tempdata)"를 읽기 전용으로 사용할 목적이라면, "tempdata()"메소드를 사용할 수 있습니다. :
       $this->session->tempdata('item');

       그리고, 임시데이터 모두를 가져오려면 다음처럼 할 수 있습니다 :
       $this->session->tempdata();

       주의사항
             "tempdata()" 메소드가 해당아이템을 찾지 못한 경우, "NULL"값을 반환합니다.

       만기전에, 임시데이터를 제거하고 싶으면, "$_SESSION" 배열에서 직접 해제할 수 있습니다. :
       unset($_SESSION['item']);

       하지만, 이 방법은 지정 아이템을 임시데이터로 만드는 지정자(marker)를 제거하지는 않습니다. (다음 HTTP 요청에서 무효화될 것입니다.)
       따라서, 동일한 요청에서 동일한 키 값을 재사용할 예정인 경우 "unset_tempdata()" 메소드를 사용할 수 있습니다 :
       $this->session->unset_tempdata('item');

 세션 제거
       현재 세션 정보를 제거하려면(예 - 로그아웃), PHP의 "session_destroy()" 함수를 사용하거나        "sess_destroy()" 메소드를 사용할 것입니다.
        둘다 정확히 동일한 방식으로 작동됩니다 :
       session_destroy();
       // or
       $this->session->sess_destroy();

       주의사항
             이 작동은 동일한 요청 내에서 세션과 관련된 작업 중 마지막 작업이어야 합니다.
             실행 시, 모든 세션데이터(플래시 데이터 및 임시데이터 포함)는 영구적으로 삭제됩니다.
             그리고, 삭제된 후로는 동일한 요청이라도 해당 기능을 사용할 수 없습니다.


 세션 메타데이터 엑세스
       코드이그나이터 이전 버전에서, 세션 데이터 배열 값은 기본적으로, 4가지 아이템을 포함합니다. :
       "session_id", "ip_address", "user_agent", "last_activity"

       이 항목들은 세션이 자동되는 세부 방식 때문에 필요했지만, 새 구현방식에서는 더 이상 필요하지 않습니다.
       하지만, 당신의 애플리케이션에서 해당 값들이 필요할 수 있습니다.
       따라서, 이 항목들에 엑세스할 수 있는 대체 방법은 다음과 같습니다. :
        session_id: session_id()
        ip_address: $_SERVER['REMOTE_ADDR']
        user_agent: $this->input->user_agent() (세션과 함께 사용되지 않음)
        last_activity: 저장소에 따라 달라지며, 직접적인 방법은 없습니다. 죄송합니다!

 세션 환경설정
       코드이그나이터는 일반적으로 모든 작업을 효율적으로 처리합니다.
       하지만, 세션은 모든 애플리케이션에서 매우 민감한 구성요소입니다.
       따라서, 구성정보를 조심스럽게 설정하여야 합니다.
       모든 구성정보의 옵션들과 그 효과를 시간을 내어 살펴보십시오.

       "application/config/config.php" 파일에서 세션과 관련된 다음 설정정보를 찾을 수 있습니다.

설정정보 기본값 항목 설명
sess_driver files files/database/redis/memcached/custom 사용하고자 하는 세션 스토리지 드라이버
sess_cookie_name ci_session [A-Za-z_-] 문자만 가능 세션 쿠키를 위해 사용되어지는 "name" 값
sess_expiration 7200 (2 시간) 초 단위 (정수) 세션지속시간(초단위).
만료되지 않는 세션을 원할 경우(브라우저를 닫을 때까지) 해당 값을 "0"으로 설정하십시오.
sess_save_path NULL None 저장 위치를 지정하며, 이 값은 사용 중인 드라이버에 의해 결정됩니다.
sess_match_ip FALSE TRUE/FALSE (boolean) 세션 쿠키를 읽을 때, 사용자 IP 주소 유효성 검사를 실행할 지 여부
일부 ISP는 동적으로 IP를 변경하므로, 만료되지 않는 세션을 사용할 경우, 이 값을 "FALSE"로 설정하는 것이 좋습니다.
sess_time_to_update 300 초 단위 (정수) 이 옵션값은 세션 클래스가 얼마나 자주 자신을 재생성하여 새 세션 ID를 만드는 지 제어합니다.
이 값을 "0"으로 하면 세션 ID 재생성을 비활성화시킵니다.
sess_regenerate_destroy FALSE TRUE/FALSE (boolean) 세션 ID가 자동으로 재생성될 때, 이전 세션 ID와 관련된 세션 데이터를 제거할 지 여부를 지정합니다.
이 값이 "FALSE"로 설정되면, 해당 값은 가비지 컬렉터에 의해 나중에 제거될 것입니다.

       주의사항
             위 항목 중 세팅되지 않은 값이 있으면, 세션 라이브러리는 PHP의 세션 INI 세팅값을 가지고 오며,
             "sess_expire_on_close"와 같은 기존 CI 설정을 가지고 옵니다.
             하지만, 이러한 작동은 예기치 않은 결과를 야기시킬 수 있고, 향후 변경될 수 있으므로, 이에 의존해서는 안됩니다.
             따라서, 모든 항목을 적절히 설정하도록 하십시오.

       위 값을 사용하는 것에 더해, 쿠키 및 원시 드라이버는 입력 클래스 및 보안클래스와 공유되는 다음 설정항목 값을 사용합니다. :

설정항목 기본값 설명
cookie_domain "" 세션을 적용할 도메인
cookie_path / 세션을 적용할 경로
cookie_secure FALSE 암호화 된 연결(HTTPS)로 세션 쿠키를 생성할 지 여부

         주의사항
             "cookie_httponly" 세팅값은 세션에 어떤 영향도 주지 않습니다.
             대신, "HttpOnly" 매개변수 값은 보안상 이유로 항시 활성화됩니다.
             이에 더해, "cookie_prefix" 세팅값은 완전히 무시됩니다.

    

 세션 드라이버
       이미 언급되었듯이 세션 라이브러리는 4가지 드라이버 및 스토리지 엔진을 제공합니다.
       다음은 사용가능한 드라이버입니다 :
        파일(files)
        데이터베이스(database)
        redis
        memcached

       기본적으로, 세션이 초기화될 때 파일 드라이버가 사용됩니다.
       왜냐하면, 이것이 가장 안전하며 어디든 사용할 수 있기 때문입니다.
       (거의 모든 환경에서 파일 시스템을 갖춥니다)
  

       다른 드라이버를 선택하고자 할 경우, "application/config/config.php"의 $config['sess_driver'] 라인에서 설정할 수 있습니다.
       모든 드라이버는 각기 다른 주의점이 있음을 기억하십시오.
       따라서, 드라이버를 선택하기 전에 그것에 익숙해져야 합니다.

       게다가, 이러한 드라이버에 만족하지 않는 경우, 당신은 사용자정의 드라이버를 만들수 있습니다.

       주의사항
             코드이그나이터의 이전 버전에서, "쿠키 드라이버(cookie)"가 유일한 옵션이었으며, 해당 옵션을 제공하지 않게 되어 부정적인 피드백을 받았습니다.
             커뮤니티의 피드백을 확인하는 과정에서, 우리는 해당 옵션을 버렸음을 알려드립니다.
             왜냐하면 이 방법은 안전하지 않기 때문이며, 당신이 사용자정의 드라이버를 통해 해당 기능을 복제하지 않도록 조언합니다.

       파일 드라이버
             파일 드라이버는 세션 데이터 저장소로 파일 시스템을 사용합니다.

             이것이 PHP의 기본 세션 구현과 똑같이 작동된다고 분명히 말할 수 있습니다.
             하지만, 사실 동일한 코드가 아니며 일부 제한(및 장점) 이 따른다는 점을 기억해야 하며, 이것은 당신에게 중요한 점입니다.

             더 상세히 설명하면, 이것은 "session.save_path"에서 사용되는 PHP의 디렉토리 레벨 및 모드 포맷을 지원하지 않습니다.
             그리고, 안전을 위해 대부분의 옵션값은 하드 코딩된(변경 힘듬) 형태로 지정됩니다.
             또한, "$config['sess_save_path']" 값은 절대경로로만 제공됩니다.

             당신이 알아야 할 또 다른 중요한 점은, 세션 파일 저장을 위해 공유 디렉토리 또는 공용 디렉토리를 사용하지 말아야 한다는 점입니다.
             "sess_save_path" 경로로서 당신만 엑세스할 수 있는 디렉토리를 지정하세요.
             그렇지 않으면, 누군가가 엑세스하여 현재 세션 정보를 훔칠 수 있습니다.(이것은 "세션 fixation" 공격으로 알려져 있습니다.)

             "UNIX"와 같은 운영체제에서, 대개 "chmod" 명령을 통해 해당 디렉토리가 "0700" 퍼미션으로 세팅됩니다.
             이 세팅은 해당 디렉토리 소유자(owner)만 읽고 쓸 수 있도록 허용합니다.
             하지만, 시스템 유저가 당신 소유가 아닌, 이를테면 "www-data"와 같은 권한으로 스크립트를 실행할 수 있음에 유의하세요.
             따라서, 이러한 퍼미션 세팅은 당신의 애플리케이션을 파괴할 위험 요소를 지니고 있습니다.

             따라서, 당신의 환경에 맞는... 이것과 유사한 형태로 설정하여야 합니다.
             mkdir /<애플리케이션 디렉토리 경로>/sessions/
             chmod 0700 /<애플리케이션 디렉토리 경로>/sessions/
             chown www-data /<애플리케이션 디렉토리 경로>/sessions/

             보너스 팁
                   일부 사용자는 다른 세션 드라이버를 선택합니다.
                   왜냐하면, 파일 스토리지가 대개 느리기 때문입니다.
                   하지만, 이것은 절반만 진실입니다.

  
              기본적인 테스트에서 SQL 데이터베이스를 사용한 것이 더 빠르게 보이지만, 99%의 경우, 단지 몇개의 세션을 사용한 경우에만 그러합니다.
              세션 수와 세션 로드가 증가함에 따라 (중요시점) 파일 시스템은 모든 관계 데이터베이스 설정을 지속적으로 가능하게 합니다.

              게다가, 성능이 유일한 관심사라면, "tmpfs"(주의 : 외부자원임)를 사용할 수 있습니다. 이것은 세션을 매우 빠르게 만듭니다.

       데이터베이스 드라이버
             세션 저장을 위한 데이터베이스 드라이버는 "MySQL", "PostgreSQL" 같은 관계형 데이터베이스를 사용합니다.
             이는 대다수 사용자를 위한 일반적인 선택입니다.
             왜냐하면, 개발자들이 동일한 애플리케이션에서 세션 데이터에 쉽게 엑세스하도록 허용하기 때문입니다. - 단지, 당신의 데이터베이스 내의 다른 테이블로 존재합니다.

             하지만, 충족되어야 할 몇가지 조건이 있습니다 :
              당신의 기본 데이터베이스 커넥션만 사용할 수 있습니다.
              (혹은, 당신의 컨트롤러에서 "$this->db"로 엑세스할 수 있는 대상)
              활성화된 쿼리 빌더가 있어야 합니다.
              영구적인 연결을 사용할 수 없습니다.
              "cache_on" 설정이 활성화된 상태로 커넥션을 사용할 수 없습니다.

             데이터베이스 세션 드라이버를 사용하고자 할 경우, 우리가 언급한 테이블을 만들어야 합니다.
             그리고, 그 후 "$config['sess_save_path']" 값으로 해당값을 설정해야 합니다.
             예를 들어, 당신의 테이블명을 "ci_sessions"로 사용하고자 할 경우, 다음처럼 할 수 있습니다 :
             $config['sess_driver'] = 'database';
             $config['sess_save_path'] = 'ci_sessions';

             주의사항
                   코드이그나이터 이전 버전에서 상위 버전으로 업그레이드 하였다면, 설정된 "sess_save_path"값이 없을 것입니다.
                   이 때 세션 라이브러리는 이것을 대신하여, 이전 "sess_table_name" 값 설정을 찾을 것입니다.
                   향후 이 동작은 제거될 것이므로, 이것에 의존하지 마십시오.

             물론, 데이터베이스 테이블을 생성하여야 합니다....

             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`)
             );

             PostgreSQL:
             CREATE TABLE "ci_sessions" (
              "id" varchar(128) NOT NULL,
              "ip_address" varchar(45) NOT NULL,
              "timestamp" bigint DEFAULT 0 NOT NULL,
              "data" text DEFAULT '' NOT NULL
             );

             CREATE INDEX "ci_sessions_timestamp" ON "ci_sessions" ("timestamp");

             또한, "sess_match_ip" 설정에 따라, "PRIMARY KEY"를 추가해야 합니다.
             다음은 "MySQL" 및 "PostgreSQL" 아래에서 작동하는 예입니다 :
             // sess_match_ip = TRUE 일 때
             ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);

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

             // 이전에 생성된 "primary key"를 지우려면 (세팅이 변경되었을 때 사용하세요.)
             ALTER TABLE ci_sessions DROP PRIMARY KEY;

             중요사항
                   타 플랫폼에서는 잠금 메커니즘 지원이 부족하기 때문에, "MySQL" 및 "PostgreSQL" 데이터베이스만 공식적으로 지원됩니다.
                   잠금 기능 없이 세션을 사용하면 많은 문제가 발생합니다. 특히, 무거운 AJAX 사용 시 그러하며 이 경우에 다한 우리의 지원은 없습니다.
                   세션 데이터를 사용한 후 성능 문제가 발생되면 , "session_write_close()" 메소드를 사용하세요.

    

       Redis 드라이버
             주의사항
              
     "Redis"는 잠금 매커니즘이 없으므로, 이 드라이버를 위한 잠금은 각 값에 대해 300초 동안 유지되도록 에뮬레이션됩니다.

   
              "Redis"는 고성능 때문에 캐싱에 일반적으로 사용되는 스토리지 엔진입니다.
              이것은 "redis" 세션 드라이버를 사용해야 하는 이유입니다.
             이미 "Redis"에 익숙하고 이미 다른 목적으로 "Redis"를 사용하고 있는 경우에만 "redis" 드라이버를 사용해야 합니다.
 
             "파일", "데이터베이스" 드라이버처럼, "$config['sess_save_path']" 설정값을 통해 세션 스토리지 위치를 설정해야 합니다. 
             해당 형식은 조금씩 다르고 복잡합니다.

             "phpredis extension" "README" 파일에서 잘 설명되어 있습니다. 따라서 간단한 링크만 제공합니다 :
             https://github.com/phpredis/phpredis#php-session-handler

             경고
                   코드이그나이터 세션 라이브러라는 실제 "redis" "session.save_handler"을 사용하지 않습니다.

              위 링크를 통해 정보를 얻으세요.

             일반적인 경우, 쌍으로 된 간단한 "host:port"값만으로 충분합니다. :
             $config['sess_driver'] = 'redis';
             $config['sess_save_path'] = 'tcp://localhost:6379';

       Memcached 드라이버
             주의사항
                   "Memcache"는 잠금 매커니즘이 없으므로, 이 드라이버를 위한 잠금은 각 값에 대해 300초 동안 유지되도록 에뮬레이션됩니다.

             "memcached" 드라이버는 가용성을 제외하고, "redis" 속성과 매우 유사합니다.
             PHP의 "Memcached extension"은 PECL을 통해 배포됨으로, 일부 리눅스에서 패키지 형태로 쉽게 설치할 수 있습니다.

             이러한 점 외에, "Memcached"에 관해 많이 언급되는 것은 일반적인 일입니다.
             - 이것 또한, 처리 속도가 뛰어나기에 캐싱에 사용되는 일반적인 유명한 제품입니다.

             하지만, "Memcached"가 제공하는 유일한 성능 보증은 "Y"초 후에 "X" 값이 만료되도록 설정되면 "Y"초 후에 해당 값이 삭제된다는 것입니다.
             (해당 시간보다 일찍 만료되지 않을 수도 있습니다).
             이것은 매우 드물게 발생합니다.
             하지만, 세션이 손실될 수 있으므로 고려되어야 합니다.
   
             "$config['sess_save_path']" 값의 형식은 매우 간단합니다. 단지 "host:port" 형식입니다. :
             $config['sess_driver'] = 'memcached';
             $config['sess_save_path'] = 'localhost:11211';

   
             보너스 팁
                   멀티 서버 환경에서, 선택항목으로서 콜론으로 구분되는 "weight" 매개변수 값(:weight) 역시 지원됩니다.
                   하지만, 신뢰할 수 있을 만큼 테스트하지 않았음에 주의하세요.
  
                  (위험부담을 안고)이 기능을 시험해보려면, 멀티 서버 경로를 콤마로 구분하여 실행할 수 있습니다 :
                  // localhost will be given higher priority (5) here,
                  // compared to 192.0.2.1 with a weight of 1.
                  $config['sess_save_path'] = 'localhost:11211:5,192.0.2.1:11211:1';

       사용자정의 드라이버
             당신은 또한 자신만의 사용자정의 세션 드라이버를 만들 수 있습니다.
             하지만, 많은 지식이 필요하므로 간단한 일이 아님을 명심하여야 합니다.

             세션이 일반적으로 어떻게 작동하는지 뿐 아니라, PHP에서 어떻게 구체적으로 작동하는지, 그리고 저장 매커니즘이 어떻게 작동하는지 알아야 합니다.
             또한, 어떻게 동시성을 다룰 것인지, 교착 상태(dead lock)를 어떻게 피할 것인지 알아야 합니다.
             그리고, 잠재적인 보안 이슈를 어떻게 다룰 것인지 알아야 하며, 이러한 일은 쉽지 않습니다.

             이야기가 길지만 간단히 말하면 - 원시 PHP에서 어떻게 처리하는지 모른다면, 코드이그나이터에서 역시 시도하지 말아야 합니다.

             당신의 세션이 몇 가지 추가 기능을 작성하려면, 단지 기본 세션 클래스에서 해당 기능을 확장하십시오.
             이것이 훨씬 쉽습니다.
             어떻게 하는지 배우려면, "라이브러리 제작" (https://codeigniter.com/user_guide/general/creating_libraries.html) 기사를 읽어보십시오.

  
             - 이제, 코드이그나이터 세션 드라이버를 만들 때 따라할 세가지 규칙을 설명합니다. :
               당신의 드라이버 파일을 "application/libraries/Session/drivers/"에 넣으세요. 이 때, 세션 클래스에 의해 사용되는 이름 규칙을 따르세요.
                예를 들어, "dummy" 드라이버를 만든다면, 클래스명을 "Session_dummy_driver"로 하여야 합니다.
                그리고, 이에 해당되는 구현을 "application/libraries/Session/drivers/Session_dummy_driver.php"에 작성해야 합니다.

             - "CI_Session_driver" 클래스를 확장하세요.
               이것은 내부 헬퍼 메소드가 있는 기본 클래스일 뿐입니다.
               필요하다면, 이것을 다른 라이브러리처럼 확장할 수 있습니다.
               하지만, 어떻게 해야하는지 세부적으로 설명드리진 않습니다...
               CI에서 클래스를 확장하고 재정의하는 방법에 익숙하다면, 이 작업을 실행할 수 있습니다.
               그렇지 않다면, 시도해선 안됩니다.

             - "SessionHandlerInterface" 인터페이스를 구현하세요.         
                (https://secure.php.net/sessionhandlerinterface)

              주의사항
                    "SessionHandlerInterface"는 버전 5.4.0부터 PHP에 의해 제공됨을 공지받았을 것입니다.
                    이전 PHP 버전을 사용하는 경우, 코드이그나이터는 자동으로 동일한 인터페이스를 제공합니다.

    
               위 링크에서 왜 필요하며 어떻게 작동하는지 설명합니다.

               위 "dummy" 드라이버 예제를 기반으로, 다음과 같이 할 수 있습니다. :
             // application/libraries/Session/drivers/Session_dummy_driver.php:

             class CI_Session_dummy_driver extends CI_Session_driver implements SessionHandlerInterface
             {

              public function __construct(&$params)
              {
               // DO NOT forget this
               parent::__construct($params);

               // Configuration & other initializations
              }

              public function open($save_path, $name)
              {
               // Initialize storage mechanism (connection)
              }

              public function read($session_id)
              {
               // Read session data (if exists), acquire locks
              }

              public function write($session_id, $session_data)
              {
               // Create / update session data (it might not exist!)
              }

              public function close()
              {
               // Free locks, close connections / streams / etc.
              }

              public function destroy($session_id)
              {
               // Call close() method & destroy data for current session (order may differ)
              }

              public function gc($maxlifetime)
              {
               // Erase data for expired sessions
              }

             }

             모든 것을 수행했다면, "sess_driver" 설정 값을 "dummy"로 설정하여 자신만의 드라이버를 사용할 수 있습니다. 축하합니다.!

   

변수
-
설명

세션 클래스(Session class)는 사용자 "상태 정보"를 유지하게 해주고, 그들의 (브라우저를 통한)사이트 활동을 알 수 있게 해줍니다.

X
로그기록