수업소개
이번 수업에서는 세션을 이용해서 사용자를 식별하는 방법에 대해서 알아본다. 또 복수의 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