본문 바로가기

Web Programming

Codeigniter 로 만드는 로그인 세션 관리 Controller

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

제목은 거창한데 내용은 그렇게 복잡하지 않다. 다만 이 방법보다 더 나은 방법도 많겠지만 간편하게 적용할 수 있는 방법이기에 함께 공유를 해본다. 먼저 웹사이트를 구축하는데 필요한 가장 기본적이고 중요한 것중에 하나가 로그인 처리이다. 어느 웹 어플리케이션이든 대부분 로그인 처리에 있어서 DB와 Sesssion 을 사용하여 이를 검증하고 저장하는 방법을 선택한다. 방법 자체가 신선하거나 하지는 않지만 기본적인 개념을 확립하는데 정말 많은 도움이 된다. 예전에 ASP.NET MVC3 라는 기술을 이용해서 웹사이트를 개발할때 사용했던 방법인데 이를 Codeigniter 에 맞추어서 변형 시켜 보았다. 전제를 MVC 구조의 웹 프로그래밍을 한다고 볼때 Controller 마다 세션에 대한 검사를 하거나 정보들을 파악하는 것은 비슷한 코드가 너무 반복되는 문제가 있다. 이런 로직들은 하나의 클래스로 묶어서 재사용을 하는 방식이더라도 역시 그러하다. 그래서 찾아보자는 키워드는 아래와 같았다.


  1. Controller 의 메소드 마다 전 처리 (호출전에 선행하여 처리할 수 있는 방법) 하는 것이 있는가?
  2. 세션 검사를 해주는 라이브러리가 있는가?
  3. 로그인과 관련해서 다들 어떻게 처리를 해주고 있는가?


구글링을 하면 여러가지 방법들이 존재했고 저마다 다른 방식이지만 유사한 방식을 사용하고 있었다. 다소 답답한것(?) 이라면 세션에 사용자 정보를 어떻게 담고 그 생명주기나 관리에 대한 측면의 내용들은 상당히 많은데 '로그인' 이라는 이슈에서는 다소 내용이 부족한 감이 있었다. 개인적인 생각으로는 Sourceforge.net 이나 Github 같은 곳을 통해서 어떤 방식으로 다들 구축했는지를 살펴보는게 더 도움이 될 수 있을 것이다.



ASP.NET 의 컨트롤러는 이렇게 구성했다


위의 경우처럼 객체지향 프로그래밍의 다형성과 재사용성을 극대화하여 꼼수를 부려보았다. 이는 위에서 찾아본 키워드 세가지 중에 1번을 충족시키는 방법이다. 2, 3번은 선례를 조사하여 적용할려는 방법이었다면 1번은 문제점에 대한 근본적인(?) 해결 방법 중 하나였다. 생성자를 적극 활용하는 방법 인데, 상속이라는 형태안에서 상속을 받은 자식 클래스들의 생성자에서는 강제적으로 부모의 생성자를 호출하기 때문에 마치 전처리를 구현한 것과 같이 처리할 수 있었다. AbstractSessionController 라는 녀석의 생성자에 Session 정보에 담겨있는 사용자 정보를 검사하는 로직을 넣어게 되면 모든 컨트롤러마다 이런 세션 검사를 적용할 수 있다. 다만 로그인을 하도록 도와주는 AuthenticationController 는 그럴 필요가 없다.


이렇게 CodeIgniter 에서도 로그인을 검사하기 위한 형태로 컨트롤러를 구성해 보았다.






아직 전부 파악은 안되고 있지만 Codeigniter 에서는 CI_Controller 라는 것을 항상 상속받아서 컨트롤러를 만들고 있다. 이는 아무래도 라이브러리나 헬퍼들을 로딩하는 데 있어서 필수적이기 때문이 아닐까 생각해보고 있지만 단정 지을순 없다. 예전의 기억을 더듬어서 PHP 에서도 로그인 체크를 쉽게 거쳐갈 수 있도록 위와 같이 구성했다. 세세한 권한 처리까지는 더 추가적인 개발이 필요하지만 로그인 되어있는 사용자인지 아닌지에 대해서는 어떻게 해야할지가 명확해 졌고, 혹여나 로그인의 판단 기준이나 추가적인 분기점이 발생해도 상위의 MY_Controller 만을 수정함으로서 해결되도록 유연성을 확보하였다. 로그인 정보를 체크하는 로직은 매우 짧디 짧다.


<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');
/**
 * Codeigniter Controller 를 사용함에 있어서 로그인 세션을 검사하기 위한 공통의 클래스
 *
 * @author Mr. Tint
 * @access default
 */
class MY_Controller extends CI_Controller {
    function __construct() {
        parent::__construct();
        // Layout 라이브러리 로드
        $this -> load -> library('layout', 'layouts/layout_main');
        $currentSession = $this -> session;
        // user_id 정보다 없는 경우는 접속 안한 것으로 간주함
        if (!$currentSession->userdata['logged_in']) {
            header("Location: " . base_url());
        }
    }

}


지속적인 로그인 체크에 대한 오버헤드에는 불필요한 경우 LoginController 처럼 MY_Controller 를 사용하지 않는 형태가 되면 된다. 이러면 세션 검사가 특별히 필요 없는 녀석이 되니 안심이다. 위와 같은 방법 말고도 여러 방법이 있겠지만 간단하고 이해하기 쉬운 측면에서는 이만한걸 아직.. 찾지를 못했다..


로그인 처리야말로 뭔가 어렵게 느껴지면서도 생각보다는 쉬운 방법인데.. 겁먹지 말아야 겠다. (아직도 겁남..)