Session 라이브러리¶
Session 클래스를 사용하면 사용자의 “상태”를 유지하고 사이트를 탐색하는 동안 활동을 추적할 수 있습니다.
CodeIgniter는 몇 가지 세션 저장 드라이버를 제공합니다:
files (기본값; 파일 시스템 기반)
database
redis
memcached
또한 Session 클래스의 기능을 활용하면서 다른 종류의 저장소를 기반으로 자체 사용자 정의 세션 드라이버를 만들 수 있습니다.
Session 클래스 사용¶
세션 초기화¶
세션은 일반적으로 각 페이지 로드와 함께 전역적으로 실행되므로 Session 클래스는 컨트롤러 생성자에서 초기화하거나 시스템에 의해 자동으로 로드되어야 합니다. 대부분의 경우 세션 클래스는 백그라운드에서 자동으로 실행되므로 단순히 클래스를 초기화하면 필요할 때 세션을 읽고, 만들고, 업데이트합니다.
컨트롤러 생성자에서 Session 클래스를 수동으로 초기화하려면
$this->load->library() 메소드를 사용합니다:
$this->load->library('session');
로드되면 다음을 사용하여 Sessions 라이브러리 객체에 접근할 수 있습니다:
$this->session
중요
Loader 클래스는 CodeIgniter의 기본
컨트롤러에 의해 인스턴스화되므로 컨트롤러 생성자 내에서 라이브러리를 로드하기
전에 반드시 parent::__construct()를 호출하세요.
세션 작동 방식¶
페이지가 로드될 때 세션 클래스는 유효한 세션 쿠키가 사용자의 브라우저에서 전송되는지 확인합니다. 세션 쿠키가 존재하지 않으면(또는 서버에 저장된 것과 일치하지 않거나 만료된 경우) 새 세션이 생성되고 저장됩니다.
유효한 세션이 존재하면 해당 정보가 업데이트됩니다. 각 업데이트마다 설정에 따라 세션 ID가 재생성될 수 있습니다.
초기화되면 Session 클래스가 자동으로 실행된다는 점을 이해하는 것이 중요합니다. 위의 동작을 일으키기 위해 할 일은 아무것도 없습니다. 아래에서 볼 수 있듯이 세션 데이터를 다룰 수 있지만 세션 읽기, 쓰기, 업데이트 과정은 자동입니다.
참고
CLI에서 Session 라이브러리는 HTTP 프로토콜을 기반으로 하는 개념이므로 자동으로 중단됩니다.
동시성 참고¶
AJAX를 많이 사용하는 웹사이트를 개발하지 않는다면 이 섹션을 건너뛸 수 있습니다. 그러나 성능 문제를 겪고 있다면 이 내용이 도움이 될 것입니다.
이전 버전의 CodeIgniter 세션은 잠금을 구현하지 않았는데, 이는 동일한 세션을 사용하는 두 HTTP 요청이 정확히 동시에 실행될 수 있음을 의미했습니다. 더 적절한 기술적 용어로는 요청이 비차단(non-blocking)이었습니다.
그러나 세션 컨텍스트에서 비차단 요청은 안전하지 않음을 의미합니다. 한 요청에서 세션 데이터(또는 세션 ID 재생성)를 수정하면 동시에 실행되는 두 번째 요청의 실행을 방해할 수 있기 때문입니다. 이 세부 사항은 많은 문제의 근본이었으며 CodeIgniter 3.0이 완전히 재작성된 Session 라이브러리를 갖는 주된 이유였습니다.
왜 이것을 알려드릴까요? 성능 문제의 원인을 찾으려다 잠금이 문제라는 결론에 도달하여 잠금을 제거하는 방법을 찾을 수 있기 때문입니다…
그렇게 하지 마세요! 잠금을 제거하는 것은 잘못된 것이며 더 많은 문제를 야기합니다!
잠금이 문제가 아니라 해결책입니다. 문제는 이미 처리했고 더 이상 필요하지 않은데도 세션이 여전히 열려 있다는 것입니다. 따라서 필요한 것은 더 이상 필요하지 않은 후 현재 요청에 대한 세션을 닫는 것입니다.
간단히 말하면 - 세션 변수와 관련하여 더 이상 할 일이 없으면
session_write_close()를 호출하세요.
세션 데이터란?¶
세션 데이터는 단순히 특정 세션 ID(쿠키)와 연관된 배열입니다.
이전에 PHP에서 세션을 사용한 적이 있다면 PHP의 $_SESSION 슈퍼글로벌에 익숙할 것입니다(그렇지 않다면 해당 링크의 내용을 읽어보세요).
CodeIgniter는 PHP에서 제공하는 세션 핸들러 메커니즘을 사용하므로 동일한 수단으로
세션 데이터에 접근할 수 있습니다. 세션 데이터 사용은 $_SESSION 배열을
조작하는(읽기, 설정, 설정 해제 값) 것만큼 간단합니다.
또한 CodeIgniter는 아래에 추가로 설명된 두 가지 특수 유형의 세션 데이터를 제공합니다: flashdata와 tempdata.
참고
이전 버전에서 CodeIgniter의 일반 세션 데이터는 ‘userdata’라고 불렸습니다. 설명서의 다른 곳에서 해당 용어가 사용되면 이를 염두에 두세요. 대부분은 사용자 정의 ‘userdata’ 메소드가 어떻게 작동하는지 설명하기 위해 작성되었습니다.
세션 데이터 검색¶
세션 배열의 모든 정보는 $_SESSION 슈퍼글로벌을 통해 사용할 수 있습니다:
$_SESSION['item']
또는 매직 getter를 통해:
$this->session->item
이전 버전과의 호환성을 위해 userdata() 메소드를 통해서도 가능합니다:
$this->session->userdata('item');
여기서 item은 가져오려는 항목에 해당하는 배열 키입니다. 예를 들어 이전에 저장된
‘name’ 항목을 $name 변수에 할당하려면 다음과 같이 합니다:
$name = $_SESSION['name'];
// 또는:
$name = $this->session->name
// 또는:
$name = $this->session->userdata('name');
참고
userdata() 메소드는 접근하려는 항목이 존재하지 않으면 NULL을
반환합니다.
기존의 모든 userdata를 검색하려면 항목 키를 생략하면 됩니다(매직 getter는 속성에 대해서만 작동합니다):
$_SESSION
// 또는:
$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');
세션 값이 존재하는지 확인하려면 isset()으로 확인하면 됩니다:
// 'some_name' 항목이 존재하지 않거나 NULL이면 FALSE 반환,
// 그렇지 않으면 TRUE 반환:
isset($_SESSION['some_name'])
또는 has_userdata()를 호출할 수 있습니다:
$this->session->has_userdata('some_name');
세션 데이터 삭제¶
다른 변수와 마찬가지로 $_SESSION에서 값을 설정 해제하는 것은
unset()을 통해 할 수 있습니다:
unset($_SESSION['some_name']);
// 또는 여러 값:
unset(
$_SESSION['some_name'],
$_SESSION['another_name']
);
또한 set_userdata()가 세션에 정보를 추가하는 데 사용될 수 있듯이
unset_userdata()는 세션 키를 전달하여 제거하는 데 사용할 수 있습니다.
예를 들어 세션 데이터 배열에서 ‘some_name’을 제거하려면:
$this->session->unset_userdata('some_name');
이 메소드는 설정 해제할 항목 키 배열도 허용합니다:
$array_items = array('username', 'email');
$this->session->unset_userdata($array_items);
참고
이전 버전에서 unset_userdata() 메소드는 key => 'dummy value'
쌍의 연관 배열을 허용했습니다. 이는 더 이상 지원되지 않습니다.
Flashdata¶
CodeIgniter는 다음 요청에서만 사용 가능하고 자동으로 지워지는 세션 데이터인 “flashdata”를 지원합니다.
이는 특히 일회성 정보, 오류 또는 상태 메시지(예: “레코드 2가 삭제되었습니다”)에 매우 유용합니다.
flashdata 변수는 일반 세션 변수이며 ‘__ci_vars’ 키 아래에 특정 방식으로 표시됩니다 (건드리지 마세요, 경고했습니다).
기존 항목을 “flashdata”로 표시하려면:
$this->session->mark_as_flash('item');
여러 항목을 flashdata로 표시하려면 키를 배열로 전달합니다:
$this->session->mark_as_flash(array('item', 'item2'));
flashdata를 추가하려면:
$_SESSION['item'] = 'value';
$this->session->mark_as_flash('item');
또는 set_flashdata() 메소드를 사용하여:
$this->session->set_flashdata('item', 'value');
set_userdata()와 동일한 방식으로 set_flashdata()에 배열을 전달할
수도 있습니다.
flashdata 변수 읽기는 $_SESSION을 통해 일반 세션 데이터를 읽는 것과
동일합니다:
$_SESSION['item']
중요
userdata() 메소드는 flashdata 항목을 반환하지 않습니다.
그러나 “flashdata”(다른 종류가 아닌)를 읽고 있다는 것을 확인하려면
flashdata() 메소드를 사용할 수도 있습니다:
$this->session->flashdata('item');
또는 모든 flashdata를 포함하는 배열을 얻으려면 키 매개변수를 생략합니다:
$this->session->flashdata();
참고
flashdata() 메소드는 항목을 찾을 수 없는 경우 NULL을 반환합니다.
추가 요청을 통해 flashdata 변수를 보존해야 하는 경우 keep_flashdata() 메소드를
사용하면 됩니다. 단일 항목 또는 유지할 flashdata 항목 배열을 전달할 수 있습니다:
$this->session->keep_flashdata('item');
$this->session->keep_flashdata(array('item1', 'item2', 'item3'));
Tempdata¶
CodeIgniter는 특정 만료 시간이 있는 세션 데이터인 “tempdata”도 지원합니다. 값이 만료되거나 세션이 만료되거나 삭제되면 값이 자동으로 제거됩니다.
flashdata와 유사하게 tempdata 변수는 ‘__ci_vars’ 키 아래에 특정 방식으로 표시되는 일반 세션 변수입니다(역시 건드리지 마세요).
기존 항목을 “tempdata”로 표시하려면 키와 만료 시간(초!)을 mark_as_temp()
메소드에 전달합니다:
// 'item'은 300초 후 지워집니다
$this->session->mark_as_temp('item', 300);
같은 만료 시간을 갖는지 여부에 따라 두 가지 방법으로 여러 항목을 tempdata로 표시할 수 있습니다:
// 'item'과 'item2' 모두 300초 후 만료됩니다
$this->session->mark_as_temp(array('item', 'item2'), 300);
// 'item'은 300초 후 지워지고, 'item2'는 240초 후에만 지워집니다
$this->session->mark_as_temp(array(
'item' => 300,
'item2' => 240
));
tempdata를 추가하려면:
$_SESSION['item'] = 'value';
$this->session->mark_as_temp('item', 300); // 5분 후 만료
또는 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으로 설정되면 기본 수명 값인 300초(또는 5분)가 사용됩니다.
tempdata 변수를 읽으려면 $_SESSION 슈퍼글로벌 배열을 통해 접근하면 됩니다:
$_SESSION['item']
중요
userdata() 메소드는 tempdata 항목을 반환하지 않습니다.
또는 “tempdata”(다른 종류가 아닌)를 읽고 있다는 것을 확인하려면
tempdata() 메소드를 사용할 수도 있습니다:
$this->session->tempdata('item');
모든 기존 tempdata를 검색하려면:
$this->session->tempdata();
참고
tempdata() 메소드는 항목을 찾을 수 없는 경우 NULL을 반환합니다.
만료 전에 tempdata 값을 제거해야 하는 경우 $_SESSION 배열에서 직접 설정을
해제할 수 있습니다:
unset($_SESSION['item']);
그러나 이렇게 하면 이 특정 항목을 tempdata로 만드는 표시가 제거되지 않으므로
(다음 HTTP 요청에서 무효화됩니다), 동일한 요청에서 동일한 키를 재사용하려면
unset_tempdata()를 사용해야 합니다:
$this->session->unset_tempdata('item');
세션 삭제¶
현재 세션을 지우려면(예: 로그아웃 중) PHP의
session_destroy() 함수 또는
sess_destroy() 메소드를 사용할 수 있습니다. 둘 다 정확히 동일한 방식으로
작동합니다:
session_destroy();
// 또는
$this->session->sess_destroy();
참고
이것은 동일한 요청 중에 수행하는 마지막 세션 관련 작업이어야 합니다. 모든 세션 데이터(flashdata와 tempdata 포함)가 영구적으로 삭제되며 세션을 삭제한 후 동일한 요청 중에 함수를 사용할 수 없습니다.
세션 메타데이터 접근¶
이전 CodeIgniter 버전에서 세션 데이터 배열에는 기본적으로 ‘session_id’, ‘ip_address’, ‘user_agent’, ‘last_activity’라는 4개의 항목이 포함되었습니다.
이것은 세션 작동 방식의 특성 때문이었지만 새로운 구현에서는 더 이상 필요하지 않습니다. 그러나 애플리케이션이 이 값에 의존하는 경우 다음은 이를 접근하는 대안적 방법입니다:
session_id:
session_id()ip_address:
$_SERVER['REMOTE_ADDR']user_agent:
$this->input->user_agent()(세션에서 사용되지 않음)last_activity: 저장소에 따라 다름, 직접적인 방법 없음. 죄송합니다!
세션 설정¶
CodeIgniter는 일반적으로 모든 것을 즉시 작동하게 합니다. 그러나 세션은 모든 애플리케이션의 매우 민감한 구성 요소이므로 신중한 설정이 필요합니다. 모든 옵션과 그 효과를 고려하는 데 시간을 투자하세요.
application/config/config.php 파일에서 다음 세션 관련 설정을 찾을 수 있습니다:
설정 |
기본값 |
옵션 |
설명 |
|---|---|---|---|
sess_driver |
files |
files/database/redis/memcached/custom |
사용할 세션 저장 드라이버입니다. |
sess_cookie_name |
ci_session |
[A-Za-z_-] 문자만 |
세션 쿠키에 사용되는 이름입니다. |
sess_samesite |
ci_session |
‘Lax’, ‘Strict’ 또는 ‘None’ |
세션 쿠키의 SameSite 속성 값입니다. PHP 7.3+에서는
|
sess_expiration |
7200 (2시간) |
초 단위 시간 (정수) |
세션이 지속되길 원하는 초 수입니다. 만료되지 않는 세션(브라우저가 닫힐 때까지)을 원하면 값을 0으로 설정합니다. |
sess_save_path |
NULL |
없음 |
저장 위치를 지정하며 사용 중인 드라이버에 따라 다릅니다. |
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로 설정하면 데이터가 나중에 가비지 수집기에 의해 삭제됩니다. |
참고
최후의 수단으로 Session 라이브러리는 위의 항목 중 어느 것도 설정되지 않은 경우 PHP의 세션 관련 INI 설정과 ‘sess_expire_on_close’와 같은 레거시 CI 설정을 가져오려고 합니다. 그러나 이 동작은 예상치 못한 결과를 초래하거나 나중에 변경될 수 있으므로 절대 의존하지 마세요. 모든 것을 올바르게 설정하세요.
위의 값 외에도 쿠키와 기본 드라이버는 Input 및 Security 클래스가 공유하는 다음 설정 값을 적용합니다:
설정 |
기본값 |
설명 |
|---|---|---|
cookie_domain |
‘’ |
세션이 적용되는 도메인입니다. |
cookie_path |
/ |
세션이 적용되는 경로입니다. |
cookie_secure |
FALSE |
암호화된(HTTPS) 연결에서만 세션 쿠키를 생성할지 여부입니다. |
참고
‘cookie_httponly’ 설정은 세션에 영향을 미치지 않습니다. 대신 보안상의 이유로 HttpOnly 매개변수는 항상 활성화됩니다. 또한 ‘cookie_prefix’ 설정은 완전히 무시됩니다.
세션 드라이버¶
이미 언급했듯이 Session 라이브러리에는 사용할 수 있는 4가지 드라이버 또는 저장 엔진이 있습니다:
files
database
redis
memcached
기본적으로 세션이 초기화될 때 Files 드라이버가 사용됩니다. 가장 안전한 선택이며 모든 곳에서(거의 모든 환경에 파일 시스템이 있으므로) 작동할 것으로 예상됩니다.
그러나 application/config/config.php 파일의 $config['sess_driver'] 줄을
통해 다른 드라이버를 선택할 수 있습니다. 단, 모든 드라이버마다 다른 주의
사항이 있으므로 선택하기 전에 아래에서 익숙해지도록 하세요.
또한 기본적으로 제공되는 드라이버가 사용 사례를 충족하지 못하는 경우 사용자 정의 드라이버를 만들고 사용할 수도 있습니다.
참고
이전 CodeIgniter 버전에서는 다른 “쿠키 드라이버”가 유일한 옵션이었으며 해당 옵션을 제공하지 않는 것에 대한 부정적인 피드백을 받았습니다. 커뮤니티의 피드백을 듣지만 안전하지 않기 때문에 삭제되었으며 사용자 정의 드라이버를 통해 복제하지 않도록 권고합니다.
Files 드라이버¶
‘files’ 드라이버는 세션 데이터를 저장하기 위해 파일 시스템을 사용합니다.
PHP 자체의 기본 세션 구현과 정확히 동일하게 작동한다고 안전하게 말할 수 있지만, 이것이 중요한 세부 사항인 경우 실제로 동일한 코드가 아니며 일부 제한(및 장점)이 있다는 점을 기억하세요.
더 구체적으로는 PHP의
session.save_path에 사용되는 디렉터리 수준 및 모드 형식을
지원하지 않으며 안전성을 위해 대부분의 옵션이 하드코딩되어 있습니다. 대신
$config['sess_save_path']에 절대 경로만 지원됩니다.
알아야 할 또 다른 중요한 것은 세션 파일을 저장하기 위해 공개적으로 읽을 수 있거나 공유된 디렉터리를 사용하지 않도록 하는 것입니다. 선택한 sess_save_path 디렉터리의 내용을 볼 수 있는 것은 오직 당신만이여야 합니다. 그렇지 않으면 그렇게 할 수 있는 사람은 현재 세션 중 하나를 훔칠 수 있습니다(“세션 고정” 공격이라고도 함).
UNIX 계열 운영 체제에서는 일반적으로 chmod 명령을 통해 해당 디렉터리에 0700 모드 권한을 설정하여 달성하며, 이렇게 하면 디렉터리 소유자만 읽기 및 쓰기 작업을 수행할 수 있습니다. 그러나 스크립트를 실행하는 시스템 사용자는 일반적으로 사용자 자신이 아니라 ‘www-data’와 같은 것이므로 해당 권한만 설정하면 애플리케이션이 중단될 수 있습니다.
대신 환경에 따라 다음과 같이 하세요:
mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/
보너스 팁¶
일부 사용자는 파일 저장이 일반적으로 느리기 때문에 다른 세션 드라이버를 선택할 것입니다. 이것은 절반만 사실입니다.
매우 기본적인 테스트는 SQL 데이터베이스가 더 빠르다는 믿음을 갖게 할 수 있지만 99%의 경우 현재 세션이 몇 개 밖에 없을 때만 사실입니다. 세션 수와 서버 부하가 증가함에 따라 - 중요한 시점에 - 파일 시스템은 거의 모든 관계형 데이터베이스 설정을 지속적으로 능가합니다.
또한 성능만이 관심사인 경우 tmpfs를 (경고: 외부 리소스) 사용하는 것을 고려할 수 있으며 세션을 매우 빠르게 만들 수 있습니다.
Database 드라이버¶
‘database’ 드라이버는 MySQL 또는 PostgreSQL과 같은 관계형 데이터베이스를 사용하여 세션을 저장합니다. 개발자가 애플리케이션 내에서 세션 데이터에 쉽게 접근할 수 있게 해주므로 많은 사용자들에게 인기 있는 선택입니다 - 데이터베이스의 또 다른 테이블일 뿐입니다.
그러나 충족해야 하는 몇 가지 조건이 있습니다:
기본 데이터베이스 연결(또는 컨트롤러에서
$this->db로 접근하는 것)만 사용할 수 있습니다.영구 연결을 사용할 수 없습니다.
cache_on 설정이 활성화된 연결을 사용할 수 없습니다.
‘database’ 세션 드라이버를 사용하려면 이미 언급한 테이블을 만들고
$config['sess_save_path'] 값으로 설정해야 합니다. 예를 들어 테이블 이름으로
‘ci_sessions’를 사용하려면:
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions';
참고
이전 버전의 CodeIgniter에서 업그레이드했고 ‘sess_save_path’가 설정되어 있지 않으면 Session 라이브러리는 이전 ‘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);
// 이전에 생성된 기본 키를 삭제할 때 (설정 변경 시 사용)
ALTER TABLE ci_sessions DROP PRIMARY KEY;
중요
다른 플랫폼에 권고 잠금 메커니즘이 없기 때문에 MySQL과 PostgreSQL
데이터베이스만 공식적으로 지원됩니다. 잠금 없이 세션을 사용하면 특히 AJAX를
많이 사용할 때 모든 종류의 문제가 발생할 수 있으며 그런 경우를 지원하지
않습니다. 성능 문제가 있는 경우 세션 데이터 처리 후 session_write_close()를
사용하세요.
Redis 드라이버¶
참고
Redis는 잠금 메커니즘을 노출하지 않으므로 이 드라이버의 잠금은 최대 300초 동안 유지되는 별도의 값으로 에뮬레이션됩니다.
Redis는 일반적으로 캐싱에 사용되는 저장 엔진으로 높은 성능으로 인기가 있으며 ‘redis’ 세션 드라이버를 사용하는 이유이기도 합니다.
단점은 관계형 데이터베이스만큼 어디서나 사용 가능하지 않으며 시스템에 phpredis PHP 확장이 설치되어 있어야 한다는 것입니다. 이 확장은 PHP와 함께 번들로 제공되지 않습니다. Redis에 이미 익숙하고 다른 목적으로 사용하고 있는 경우에만 ‘redis’ 드라이버를 사용할 가능성이 높습니다.
‘files’ 및 ‘database’ 드라이버와 마찬가지로 $config['sess_save_path'] 설정을
통해 세션의 저장 위치를 설정해야 합니다. 여기서 형식은 약간 다르고 복잡합니다.
phpredis 확장의 README 파일에서 가장 잘 설명되어 있으므로 링크를 드립니다:
경고
CodeIgniter의 Session 라이브러리는 실제 ‘redis’ session.save_handler를
사용하지 않습니다. 위 링크의 경로 형식**만** 참고하세요.
가장 일반적인 경우 간단한 host:port 쌍으로 충분합니다:
$config['sess_driver'] = 'redis';
$config['sess_save_path'] = 'tcp://localhost:6379';
Memcached 드라이버¶
참고
Memcache는 잠금 메커니즘을 노출하지 않으므로 이 드라이버의 잠금은 최대 300초 동안 유지되는 별도의 값으로 에뮬레이션됩니다.
‘memcached’ 드라이버는 가용성을 제외하면 모든 속성에서 ‘redis’ 드라이버와 매우 유사합니다. PHP의 Memcached 확장은 PECL을 통해 배포되며 일부 Linux 배포판에서 쉽게 설치할 수 있는 패키지로 제공됩니다.
이 외에도 Redis에 대한 의도적인 편견 없이 Memcached에 대해 말할 것이 많지 않습니다 - 캐싱에 일반적으로 사용되는 인기 있는 제품으로 속도로 유명합니다.
그러나 Memcached가 보장하는 유일한 것은 Y초 후에 만료되도록 값 X를 설정하면 Y초가 지난 후에 삭제된다는 것입니다(반드시 그 시간 이전에 만료되지 않는다는 보장은 없습니다). 이런 일은 매우 드물게 발생하지만 세션 손실을 초래할 수 있으므로 고려해야 합니다.
$config['sess_save_path'] 형식은 여기서 상당히 간단하며 host:port 쌍입니다:
$config['sess_driver'] = 'memcached';
$config['sess_save_path'] = 'localhost:11211';
보너스 팁¶
선택적 weight 매개변수를 세 번째 콜론으로 구분된(:weight) 값으로 사용하는
다중 서버 설정도 지원되지만 신뢰할 수 있는지 테스트하지 않았음을 알려드립니다.
이 기능을 (자신의 책임 하에) 실험하려면 여러 서버 경로를 쉼표로 구분하면 됩니다:
// localhost는 여기서 더 높은 우선순위(5)를 부여받으며
// 가중치가 1인 192.0.2.1과 비교됩니다.
$config['sess_save_path'] = 'localhost:11211:5,192.0.2.1:11211:1';
사용자 정의 드라이버¶
자체 사용자 정의 세션 드라이버를 만들 수도 있습니다. 그러나 일반적으로 이것은 쉬운 작업이 아니며 올바르게 수행하는 데 많은 지식이 필요합니다.
세션이 일반적으로 어떻게 작동하는지뿐만 아니라 PHP에서 특별히 어떻게 작동하는지, 기본 저장 메커니즘이 어떻게 작동하는지, 동시성 처리 방법, 교착 상태 방지 방법(잠금이 없어서가 아니라), 그리고 마지막으로 잠재적인 보안 문제를 처리하는 방법을 알아야 합니다. 이것은 결코 간단하지 않습니다.
간단히 말하면 - 이미 순수 PHP에서 그 방법을 모른다면 CodeIgniter 내에서도 시도해서는 안 됩니다. 경고했습니다.
세션에 일부 추가 기능만 추가하려면 기본 Session 클래스를 확장하는 것이 훨씬 더 쉽습니다. 라이브러리 만들기 문서를 읽어 방법을 알아보세요.
이제 요점으로 - CodeIgniter용 세션 드라이버를 만들 때 따라야 하는 세 가지 일반 규칙이 있습니다:
드라이버 파일을 application/libraries/Session/drivers/아래에 배치하고 Session 클래스에서 사용하는 명명 규칙을 따르세요.
예를 들어 ‘dummy’ 드라이버를 만들려면 application/libraries/Session/drivers/Session_dummy_driver.php에
Session_dummy_driver클래스 이름을 선언해야 합니다.
CI_Session_driver클래스를 확장합니다.이것은 몇 가지 내부 헬퍼 메소드가 있는 기본 클래스입니다. 정말 필요한 경우 다른 라이브러리처럼 확장 가능하지만 방법을 설명하지 않겠습니다… CI에서 클래스 확장/재정의가 어떻게 작동하는지 잘 알고 있다면 이미 방법을 알고 있습니다. 그렇지 않다면 처음부터 그렇게 하지 말아야 합니다.
SessionHandlerInterface 인터페이스를 구현합니다.
참고
SessionHandlerInterface는 PHP 5.4.0부터 제공됩니다. 더 오래된 PHP 버전을 실행하는 경우 CodeIgniter가 자동으로 동일한 인터페이스를 선언합니다.링크는 이유와 방법을 설명합니다.
따라서 위의 ‘dummy’ 드라이버 예시를 기반으로 다음과 같은 결과가 됩니다:
// application/libraries/Session/drivers/Session_dummy_driver.php:
class CI_Session_dummy_driver extends CI_Session_driver implements SessionHandlerInterface
{
public function __construct(&$params)
{
// 이것을 잊지 마세요
parent::__construct($params);
// 설정 및 기타 초기화
}
public function open($save_path, $name)
{
// 저장 메커니즘 초기화 (연결)
}
public function read($session_id)
{
// 세션 데이터 읽기 (존재하는 경우), 잠금 획득
}
public function write($session_id, $session_data)
{
// 세션 데이터 생성 / 업데이트 (존재하지 않을 수 있음!)
}
public function close()
{
// 잠금 해제, 연결 / 스트림 / 등 닫기
}
public function destroy($session_id)
{
// close() 메소드 호출 및 현재 세션 데이터 삭제 (순서가 다를 수 있음)
}
public function gc($maxlifetime)
{
// 만료된 세션 데이터 지우기
}
}
모든 것을 올바르게 수행했다면 이제 sess_driver 설정 값을 ‘dummy’로 설정하고 자체 드라이버를 사용할 수 있습니다. 축하합니다!
클래스 레퍼런스¶
- class CI_Session¶
- userdata([$key = NULL])¶
- 매개변수:
$key (
mixed) – 세션 항목 키 또는 NULL
- 반환:
지정된 항목 키의 값 또는 모든 userdata의 배열
- 반환 형식:
mixed
특정
$_SESSION항목의 값을 가져오거나 키가 지정되지 않은 경우 모든 “userdata” 항목의 배열을 가져옵니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다. 대신
$_SESSION에 직접 접근하세요.
- all_userdata()¶
- 반환:
모든 userdata의 배열
- 반환 형식:
array
모든 “userdata” 항목이 포함된 배열을 반환합니다.
참고
이 메소드는 더 이상 사용되지 않습니다. 대신 매개변수 없이
userdata()를 사용하세요.
- get_userdata()¶
- 반환:
$_SESSION에 대한 참조- 반환 형식:
array
$_SESSION배열에 대한 참조를 반환합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
- has_userdata($key)¶
- 매개변수:
$key (
string) – 세션 항목 키
- 반환:
지정된 키가 존재하면 TRUE, 없으면 FALSE
- 반환 형식:
bool
$_SESSION에 항목이 존재하는지 확인합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
isset($_SESSION[$key])의 별칭이므로 대신 그것을 사용하세요.
- set_userdata($data[, $value = NULL])¶
- 매개변수:
$data (
mixed) – 세션 데이터로 설정할 키/값 쌍의 배열 또는 단일 항목의 키$value (
mixed) – $data가 키인 경우 특정 세션 항목에 설정할 값
- 반환 형식:
void
$_SESSION슈퍼글로벌에 데이터를 할당합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
- unset_userdata($key)¶
- 매개변수:
$key (
mixed) – 설정 해제할 세션 데이터 항목의 키 또는 여러 키의 배열
- 반환 형식:
void
$_SESSION슈퍼글로벌에서 지정된 키를 설정 해제합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
unset($_SESSION[$key])의 별칭이므로 대신 그것을 사용하세요.
- mark_as_flash($key)¶
- 매개변수:
$key (
mixed) – flashdata로 표시할 키 또는 여러 키의 배열
- 반환:
성공 시 TRUE, 실패 시 FALSE
- 반환 형식:
bool
$_SESSION항목 키(또는 여러 개)를 “flashdata”로 표시합니다.
- get_flash_keys()¶
- 반환:
모든 “flashdata” 항목의 키를 포함하는 배열
- 반환 형식:
array
“flashdata”로 표시된 모든
$_SESSION의 목록을 가져옵니다.
- unmark_flash($key)¶
- 매개변수:
$key (
mixed) – flashdata로 표시 해제할 키 또는 여러 키의 배열
- 반환 형식:
void
$_SESSION항목 키(또는 여러 개)의 “flashdata” 표시를 해제합니다.
- flashdata([$key = NULL])¶
- 매개변수:
$key (
mixed) – Flashdata 항목 키 또는 NULL
- 반환:
지정된 항목 키의 값 또는 모든 flashdata의 배열
- 반환 형식:
mixed
“flashdata”로 표시된 특정
$_SESSION항목의 값을 가져오거나 키가 지정되지 않은 경우 모든 “flashdata” 항목의 배열을 가져옵니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다. 대신
$_SESSION에 직접 접근하세요.
- keep_flashdata($key)¶
- 매개변수:
$key (
mixed) – 유지할 flashdata 키 또는 여러 키의 배열
- 반환:
성공 시 TRUE, 실패 시 FALSE
- 반환 형식:
bool
다음 요청을 통해 지정된 세션 데이터 키를 “flashdata”로 유지합니다.
참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
mark_as_flash()메소드의 별칭입니다.
- set_flashdata($data[, $value = NULL])¶
- 매개변수:
$data (
mixed) – flashdata로 설정할 키/값 쌍의 배열 또는 단일 항목의 키$value (
mixed) – $data가 키인 경우 특정 세션 항목에 설정할 값
- 반환 형식:
void
$_SESSION슈퍼글로벌에 데이터를 할당하고 “flashdata”로 표시합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
- mark_as_temp($key[, $ttl = 300])¶
- 매개변수:
$key (
mixed) – tempdata로 표시할 키 또는 여러 키의 배열$ttl (
int) – tempdata의 수명 값 (초)
- 반환:
성공 시 TRUE, 실패 시 FALSE
- 반환 형식:
bool
$_SESSION항목 키(또는 여러 개)를 “tempdata”로 표시합니다.
- get_temp_keys()¶
- 반환:
모든 “tempdata” 항목의 키를 포함하는 배열
- 반환 형식:
array
“tempdata”로 표시된 모든
$_SESSION의 목록을 가져옵니다.
- unmark_temp($key)¶
- 매개변수:
$key (
mixed) – tempdata로 표시 해제할 키 또는 여러 키의 배열
- 반환 형식:
void
$_SESSION항목 키(또는 여러 개)의 “tempdata” 표시를 해제합니다.
- tempdata([$key = NULL])¶
- 매개변수:
$key (
mixed) – Tempdata 항목 키 또는 NULL
- 반환:
지정된 항목 키의 값 또는 모든 tempdata의 배열
- 반환 형식:
mixed
“tempdata”로 표시된 특정
$_SESSION항목의 값을 가져오거나 키가 지정되지 않은 경우 모든 “tempdata” 항목의 배열을 가져옵니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다. 대신
$_SESSION에 직접 접근하세요.
- set_tempdata($data[, $value = NULL])¶
- 매개변수:
$data (
mixed) – tempdata로 설정할 키/값 쌍의 배열 또는 단일 항목의 키$value (
mixed) – $data가 키인 경우 특정 세션 항목에 설정할 값$ttl (
int) – tempdata 항목의 수명 값 (초)
- 반환 형식:
void
$_SESSION슈퍼글로벌에 데이터를 할당하고 “tempdata”로 표시합니다.참고
이것은 이전 애플리케이션과의 이전 버전 호환성을 위해서만 유지되는 레거시 메소드입니다.
- sess_regenerate([$destroy = FALSE])¶
- 매개변수:
$destroy (
bool) – 세션 데이터 삭제 여부
- 반환 형식:
void
세션 ID를 재생성하고 선택적으로 현재 세션 데이터를 삭제합니다.
참고
이 메소드는 PHP의 기본 session_regenerate_id() 함수의 별칭입니다.
- sess_destroy()¶
- 반환 형식:
void
현재 세션을 삭제합니다.
참고
이것은 호출하는 마지막 세션 관련 함수여야 합니다. 그 후에는 모든 세션 데이터가 손실됩니다.
참고
이 메소드는 PHP의 기본 session_destroy() 함수의 별칭입니다.
- __get($key)¶
- 매개변수:
$key (
string) – 세션 항목 키
- 반환:
요청된 세션 데이터 항목 또는 존재하지 않으면 NULL
- 반환 형식:
mixed
원한다면
$_SESSION['item']대신$this->session->item을 사용할 수 있게 하는 매직 메소드입니다.$this->session->session_id에 접근하려고 하면session_id()를 호출하여 세션 ID도 반환합니다.
- __set($key, $value)¶
- 매개변수:
$key (
string) – 세션 항목 키$value (
mixed) – 세션 항목 키에 할당할 값
- 반환:
void
$this->session속성으로 접근하여$_SESSION에 항목을 할당할 수 있게 하는 매직 메소드입니다:$this->session->foo = 'bar'; // 결과: // $_SESSION['foo'] = 'bar';