코드이그나이터4 컨트롤러 다루기 - 6 - 세션 다루기

고은연·2021년 3월 9일
1

이번 챕터의 코드는 https://github.com/koeunyeon/ci4/tree/session 에서 확인하실 수 있습니다.

세션 다루기

세션은 서버에 저장되는 정보 조각입니다. 데이터베이스에 저장되는 영구적인 데이터가 아니라, 각 사용자(클라이언트)별로 관리되는 정보를 담을 때 사용합니다.

세션이 가장 많이 쓰이는 예시로는 로그인을 들 수 있습니다. 각 클라이언트마다 서로 다른 로그인 정보를 유지하기 위해 주로 세션을 사용합니다.

기술적으로 말하면 세션은 열쇠를 가진 사물함과 비슷합니다. 서버는 클라이언트마다 "세션 키"라고 부르는 열쇠를 발급합니다. 세션 키는 클라이언트별로 모두 다르게 발급하는데, 클라이언트가 서버에 요청할 때 세션 키를 함께 전달하면 서버는 세션 키로 서버의 정보를 찾아서 사용하게 됩니다.

이제 코드 이그나이터에서 세션을 다루는 방법을 알아보겠습니다. Sample 컨트롤러에 아래의 메소드를 추가합니다.
/app/Controllers/Sample.php

public function session_exist() // (1)
{
    $session = session(); // (2)
    $is_session_exist = $session->member_id != null; // (3)
    return $is_session_exist ? "세션 값이 존재합니다." : "세션 값이 없습니다."; // (4)
}

public function session_set() // (5)
{
    $session = session();
    $session->member_id = "3"; // (6)
    return "세션이 설정되었습니다.";
}

public function session_get() // (7)
{
    $session = session();
    $session_value = $session->member_id; // (8)
    return  $session_value === null ? "세션 값이 없습니다." : "세션 값은 $session_value 입니다." ;
}

public function session_remove() // (9)
{
    $session = session();
    $session->remove('member_id'); // (10)
    return "세션값이 삭제되었습니다.";
}

코드를 확인해 보겠습니다.
(1) session_exist 메소드는 세션이 있는지 확인하는 엔드포인트 메소드입니다.

(2) 코드이그나이터4에서 세션을 객체처럼 다루기 위해서는 session() 헬퍼 함수를 사용합니다.

코드이그나이터4의 세션은 4가지의 저장 방법을 지원합니다. 파일, 데이터베이스, 멤캐시드, 레디스입니다. 파일이 기본값이고, 나머지는 다른 시스템을 이용합니다. 하지만 어떤 것을 선택하든간에 (준비하는 과정과 설정이 다른 것을 제외한다면) 동일한 인터페이스로 세션에 접근해서 사용할 수 있습니다.

원래 PHP에서 세션을 다루기 위해서는 아래와 같이 했었죠.

if (isset($_SESSION) === false){
    session_start();
}

이는 PHP의 세션이 전역으로 로드되는 단순 파일이기 때문입니다. 코드이그나이터4에서도 파일로 저장하는 방법을 선택한다면 저장 방법이 비슷해집니다. 유의해야 할 것은 서로 다른 저장 방법(세션 드라이버)간에 데이터 공유는 불가능하다는 것입니다.

만약 정석적으로 세션을 사용하고 싶다거나, 설정에 따른 세션을 로드하고 싶다면 아래와 같이 사용할 수 있습니다.

$session = \Config\Services::session($config);

(3) 세션에 특정 키가 존재하는지 확인하고 싶으면 $session->키이름 != null인지 확인하면 됩니다. 배열과는 다르게 $session객체는 키가 설정되어있지 않다고 해서 오류를 내뱉지 않고 그냥 null을 리턴합니다.

(4) 세션이 존재한다면 "세션값이 존재합니다."를 보여주고, 세션이 없다면 "세션값이 존재하지 않습니다."라는 메세지가 나오게 됩니다.

(5) session_set() 메소드는 세션을 설정하는 기능을 확인하기 위한 엔드포인트 메소드입니다.

(6) 세션에 값을 설정하는 방법도 객체를 다루는 방법과 동일합니다. $session->키 = 값 형태로 사용합니다.

(7) session_get() 메소드는 세션에 있는 값을 가지고 오기 위한 엔드포인트 메소드입니다.

(8) 세션의 값을 읽기 위해서는 세션객체->키이름으로 가지고 옵니다. 완전히 일반 PHP 객체와 사용법이 동일합니다.

(9) 세션 삭제를 테스트하기 위한 엔드포인트입니다.

(10) 세션의 삭제를 위해서는 세션객체->remove(키이름) 형식으로 세션을 삭제합니다. 만약 세션 객체에 키 이름이 없더라도 코드이그나이터는 오류나 예외 등을 내보내지 않고 아무일도 하지 않은 채 메소드의 실행을 끝냅니다.


세션이 잘 동작하는지 확인해 보겠습니다.

  1. http://localhost:8080/sample/session_exist URL로 세션이 존재하는지 확인해 봅니다. 만약에 처음 접속한다면 "세션 값이 없습니다. " 메세지를 보게 될 것입니다.
  2. 이제 세션에 값을 넣어보겠습니다. http://localhost:8080/sample/session_set URL에 접속하세요. "세션이 설정되었습니다. " 메세지가 보입니다.
  3. 다시 한번 세션이 존재하는지 확인해 볼까요? http://localhost:8080/sample/session_exist 주소에 재접속합니다. 이번에는 "세션 값이 존재합니다. " 메세지가 나옵니다.
  4. 세션 값이 있는 지 확인했으니, 세션의 값을 가져와 보겠습니다. http://localhost:8080/sample/session_get URL에 접속합니다. "세션 값은 3 입니다. " 메세지가 보이죠?
  5. 이제 세션 값을 삭제하겠습니다. http://localhost:8080/sample/session_remove URL에 접속합니다. "세션값이 삭제되었습니다. " 메세지가 출력됩니다.
  6. 정말 삭제되었는지 이번에는 세션 값을 가져오는 엔드포인트로 점검해 보겠습니다. http://localhost:8080/sample/session_get URL에 접속합니다. "세션 값이 없습니다. " 가 나오면 성공입니다.

참고로 코드이그나이터4 세션의 기본 쿠키 이름은 ci_session입니다. 클라이언트가 웹 브라우저일 때 클라이언트 쿠키에 ci_session=클라이언트별_세션키 형태로 세션 키가 관리된다는 뜻입니다.
이 설정은 App/Config/App.php의 185라인에서 관리합니다. 중요 코드만 잠깐 살펴보겠습니다.
App/Config/App.php

public $sessionDriver            = 'CodeIgniter\Session\Handlers\FileHandler'; // (1)
public $sessionCookieName        = 'ci_session'; // (2)
public $sessionExpiration        = 7200; // (3)
public $sessionSavePath          = WRITEPATH . 'session'; // (4)
public $sessionMatchIP           = false; // (5)

(1) 세션 드라이버가 기본값인 FileHandler로 되어 있네요.
(2) 언급한 대로 세션 키를 교환하는 쿠키 이름은 ci_session입니다.
(3) 세션은 특정 시간 내에 재사용이 일어나지 않으면 파기됩니다. 단위는 "초"이므로 분으로 환산하면 7200 / 60 = 120분입니다. 즉, 로그인에 세션을 사용한다고 해 보면 120분 내에 페이지에 다시 접근하지 않으면 자동 로그아웃된다는 의미죠.
(4) 세션이 저장되는 경로입니다. WRITEPATH는 코드이그나이터4의 경로 중 /writable/을 나타냅니다. 즉, 세션은 /writable/session 디렉토리에 저장됩니다.

세션에 대해 더 자세히 알고 싶다면 한국어 메뉴얼 http://ci4doc.cikorea.net/libraries/sessions.html을 참고하시거나, 혹시라도 한국어 메뉴얼의 업데이트가 늦을 경우 공식 메뉴얼 (영어) https://codeigniter4.github.io/userguide/libraries/sessions.html 를 참고하세요.

profile
중년 아저씨. 10 + n년차 백엔드 개발자. 스타트업과 창업, 솔로프리너와 1인 기업에 관심 많아요.

0개의 댓글