강좌

  • 웹서버
  • 아파치
  • 톰켓
HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
Apache2 Module 'mod_auth_form'
조회 : 8,212  



Apache2 Module 'mod_auth_form'



  특정 페이지에 접근을 제한하기 위해서 아파치의 기본 기능인 , Auth 기능을 사용한다.
.htaccess 파일을 생성하고, htpass파일을 만들고 그 파일에 사용자정보를 넣어 인증 받는 방법이다. 이 방법은 다음과 같은 문제점을 가지고 있다.

   1) 사용자를 만들거나, 변경하거나, 삭제할 때 쉘로 들어가서 만들어 준다.
   2) 사용자가 자신의 비밀번호를 바꾸려면 관리자를 통해야 한다.
사용자가 빈번히 추가/삭제되지 않는다면, 위 방법도 괜찮다.

내가 하고싶은 것은 다음과 같다.
  1) 기존에 회원 DB가 있어 그걸 연동하고 싶다.
  2) 기존 DB와 연결하면, 추가/삭제/사용자가 비밀번호 변경은 모두 해결된다.
내가 원하는 것을 해결하기 위해서 아파치 추가 모듈을 검색했다.
아주 좋은 모듈을 발견했다. mod_auth_form이다.

이는 다음과 같은 기능을 제공한다.

  1) MySQL을 통한 인증 제공
  2) 회원 테이블과, 세션 테이블이 분리되어 기존 회원 DB와 연동이 쉽다.
  3)
모듈자체에서 사용자 인증을 지원하지는 않고, php등의 스크립트로 구현해야 한다.
  4) 다른 모듈과 같이 기능을 On / Off 시킬 수 있다.
  5) 세션을 자동으로 리플레시 할 수 있다.


나는 본 강좌에서 공개용 게시판이면서 강력한 기능을 가진 '그누보드4'의 회원 DB와 연동해 보았다.





1. 설치
  1) 환경설정
      configure 를 제공하지만,.. 조금 어설프다. 다음과 같이 진행하였다.

 MYSQL_PREFIX=/usr/local/mysql APACHE2_PREFIX=/usr/local/apache  ./configure

위와같이 MySQL 의 경로와, Apache 경로를 위와같이 지정한다.

  2) 컴파일
    make

  3) 설치
    make install


이렇게 하면, 모듈이 설치된다.
mod_auth_form.so.1.1.5 설치되고
mod_auth_form.so -> mod_auth_form.so.1.1.5
이렇게 심볼릭링크된다.
  


2. 설정
 'httpd.conf' 파일을 열어서. 모듈을 로드 하는 부분을 추가한다.
LoadModule auth_form_module modules/mod_auth_form.so

적용시키고자 하는 디렉토리를 지정한다.

<Directory "/home/woo0/www/admin">
        AuthType Basic
        AuthName "Woo0.org Login"
        AuthFormMySQLHost       localhost
        AuthFormMySQLPort       3306
        AuthFormMySQLUsername   woo0
        AuthFormMySQLPassword   woo0password
        AuthFormMySQLDB woo0
        AuthFormSessionCookies On
        AuthFormPageLogin /woo0_login.html
        Require valid-user
</Directory>


위와같이 설정하면,
/home/woo0/www/admin 디렉토리 아래 부분에 대해서는 지정된,
경로로 이동하여 인증을 받은 후에 사용할 수 있게 된다.

예) www.woo0.org/admin/  --> www.woo0.org/woo0_login.html 페이지로 이동
     www.woo0.org/
woo0_login.html 페이지에서 인증을 받고, 쿠키가 생기고
    다시
www.woo0.org/admin/으로 이동 ..




3. 테이블 생성
   테이블 명 : sessions
   필드 1 :
VARCHAR (32): sid (PRIMARY KEY)
   필드 2 : VARCHAR (20): uid



4. 프로그램 작성
  1) 로그인 폼 프로그램 작성

woo0_login.html

<table>
       <caption>SU 통합 로그인</caption>
  <tr>
   <td>
        <form action="/woo0_login.php" method="post">
                ID : <input name="uid" type="text" maxlength="20"> <br>
                PASS : <input name="password" type="password" maxlength="20"><br>
                <input type="submit" value="Login">
        </form>
     </td>
   </tr>
</table>


  1) 로그인 처리 프로그램
woo0_login.php
<?php
function genID($seed, $length)
{
        $ID = "";
        srand($seed);
        for($i = 0; $i < $length; $i++)
        {
                $chtype = rand(1, 3);
                switch($chtype)
                {
                case 1: // 0-9
                        $ID .= chr(rand(48, 57));
                        break;
                case 2: // A-Z
                        $ID .= chr(rand(65, 90));
                        break;
                case 3: // a-z
                        $ID .= chr(rand(97, 122));
                        break;
                }
        }
        return $ID;
}
function create_session($mysql, $uid, $password)
{
        //
        // Build list of existing SIDs
        //
        $result = mysql_query("SELECT sid FROM sessions",$mysql);
        $num_rows = mysql_num_rows($result);
        while($num_rows > 0){
                $row = mysql_result($result,$num_rows-1,0);
                $sids[$row["sid"]] = TRUE;
                $num_rows--;
        }

        //
        // Generate SID (making sure it is unique)
        //
        $max_attempts = 500000;
        $seed = crc32($password);
        do
        {
                $sid = genID($seed + time(), 32);
                $max_attempts--;
        } while(isset($sids[$sid]) && $max_attempts > 0);
        if($max_attempts <= 0) // NOT GOOD
        return FALSE;
        //
        // Create the session: set the UID and SID in both the client's cookies and
        // the MySQL session table.
        //
        mysql_query("INSERT INTO sessions (sid, uid) VALUES ('$sid', '$uid')",$mysql);
        setcookie("uid", $uid, time() + 964224000);
        setcookie("sid", $sid, time() + 964224000);
        return TRUE;
}
$uid = $_POST["uid"];
$password = $_POST["password"];
$mysql =  mysql_connect("localhost", "woo0", "woo0password") or die("DB서버 연결에 실패하였습니다!");
$status = mysql_select_db("woo0",$mysql);
if(!$status) {
   $errNO = mysql_errno($mysql); $errMSG = mysql_error($mysql);
   echo("서버의 staff 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>");
   exit;
}

$result =  mysql_query("SELECT mb_password FROM g4_member WHERE mb_id='$uid'",$mysql);
$real_password = @mysql_result($result,0,0);
$result =  mysql_query("SELECT password('$password')",$mysql);
$in_password = mysql_result($result,0,0);
if($in_password == $real_password){
        create_session($mysql, $uid, $real_password);
        header("Location: /
admin/");
}else{
   echo "인증할 수 없습니다.!!";
}

mysql_close($mysql);
?>


위와 같이 프로그램을 작성하면, 된다.^^



5. 마치며
  mod_auth_form을 적용시켜서 활용하는데 기대 이상으로 괜찮은 성능을 보이며, 편리하다. 좋은 공개 소프트웨어를 만들어준 제작자에게 감사하며, 본 강좌를 마무리 하도록 하겠습니다.
  본 강좌에 잘못된 점이나, 개선점이 있으면 doly골뱅이superuser.co.kr으로 메일 한통 바랍니다.





참고 문헌 :
  http://comp.uark.edu/~ajarthu/mod_auth_form/
테스트 환경:
  SULinux 1.5 / Apache 2.0.59 / MySQL 5.0.45

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1578


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
도리
도리(Doly)
(주)수퍼유저 기술이사 (CTO)
리눅스마스터 1급,2급 추천교재(2014년) 집필
리눅스마스터 1급,2급 전문위원(출제)(한국정보통신진흥협회, 2005년~)
SULinux 1.0, 1.5, 2.0, 2014 개발 총괄(sulinux.net, 1998년~)
SSU,LSCP,LSMP,CCMT외 다수 오픈소스 프로젝트 개발 및 운용 (lscp.sf.net외,2009년~)
리눅스 대량 시스템 구축 및 관리(5,000대리눅스 서버 구축 및 관리 경험, 2000년~)

E-Mail : doly골뺑이superuser.co.kr
소개 : 하루 하루 최선을 다합시다!!