phpsource/회원인증2000. 10. 10. 15:35
PHP를 이용한 HTTP 인증(HTTP authentication with PHP)
HTTP 인증 방법에는 PHP 스크립트를 통하지 않고도 웹서버 아파치를 통해(.htaccess 파일을 통해) 디렉토리 별로 인증을 수행할 수 있으나 이 방법은 웹 프로그래밍을 벗어나는 분야로 여기서는 고려하지 않겠습니다. 여기서는 단지 PHP 스크립트를 이용한 HTTP 인증 만을 다루고자 합니다.
PHP를 이용한 HTTP 인증은 아파치 모듈로 사용될 때만 동작합니다. 아파치 모듈의 PHP 스크립트에서 Header()라는 함수를 사용하면 브라우저에게 사용자명과 비밀번호를 입력받는 윈도우를 띄우도록 하는 "인증 요구(Authentication Required)" 메시지를 보내게 됩니다. 일단 방문자가 사용자명과 비밀번호를 입력하면, 사용자명, 비밀번호, authentication type의 값을 가지는 $PHP_AUTH_USER, $PHP_AUTH_PW, $PHP_AUTH_TYPE의 3개의 변수를 가지고 해당 URL(PHP 스크립트를 포함한)이 다시 불리워집니다. 현재 authentication type은 "Basic"만이 지원됩니다. client authentication을 사용하여 그 입력된 값을 출력하는 예제가 아래에 있습니다.
< HTTP 인증 화면 >
[code php;gutter:false] <?php function authentication() { Header("WWW-authenticate: basic realm=\"회원 확인\""); Header("HTTP/1.0 401 Unauthorized"); $str = "<HTML>\n" . "<BODY>\n" . "<SCRIPT language=\"javascript\">\n" . "<!--\n" . " alert('회원전용 서비스를 받으시려면 먼저 회원으로 가입하세요.')\n" . " history.back()\n" . "//-->\n" . "</SCRIPT>\n" . "</BODY>\n" . "</HTML>"; echo($str); exit; } if (!isset($PHP_AUTH_USER)) { // // 인증창에 값을 입력하지 않은 경우 다시 인증창을 띄운다. // authentication(); } else { // // 여기에서 회원 인증을 한다. // ...... 회원 인증을 위한 소스 코드 삽입 ...... if (회원인증에 성공했으면?) echo("<META http-equiv='refresh' content='0; url=회원전용페이지.php'>"); else if (회원인증에 실폐했으면?) authentication(); // 다시 인증창을 띄운다. } ?> [/code]
< HTTP 인증에 실패할 때 나타나는 에러메시지 >
위의 출력 결과는 익스플로러에서 실행시킨 결과이며, 넷스케이프에서는 약간 다르게 동작될 것입니다. 인증이 되지 않으면 아래와 같이 계속 인증할 것인지 아니면 취소할 것인지를 입력받습니다. 다시 인증을 시도한다면 사용자로 하여금 계속 사용자이름과 비밀번호를 입력하게 합니다.
< HTTP 인증에 실패할 때 나타나는 에러메시지 >
로그인 과정에서의 회원 인증
로그인 입력 양식에서 로그인 버튼을 클릭하게 되면 로그인을 처리하기 위한 스크립트가 동작합니다. 먼저 회원인증을 수행하여 회원인증 결과에 따라 회원인증ID를 발급하게 되고 회원이 요청한 페이지로 이동하게 됩니다. 이와 같이 로그인 입력 양식에 회원ID와 비밀번호를 입력하는 단계부터 회원인증ID를 발급하게 되는 단계까지가 로그인 과정입니다. 로그인 정보 입력 단계에서 회원ID와 비밀번호가 입력되고 이 정보가 웹서버에 보내지면 이 순간부터 웹서버는 회원 인증을 위해 $PHP_AUTH_USER/$PHP_AUTH_PW를 회원 정보 테이블에 있는 회원 ID/비밀번호와 비교하는데 사용하게 됩니다. 로그인 양식을 통해 입력된 방문자의 회원ID 및 비밀번호를 회원 데이터베이스에서 검색하여 등록된 회원인지 여부를 확인하는 기능입니다. 만약 방문자가 입력한 회원ID와 비밀번호가 회원 데이터베이스에 등록되어 있지 않는 경우에는 요청된 서비스를 거부하고 다시 회원ID와 비밀번호를 입력할 것을 요구할 수도 있고, 아니면 등록된 회원이 아니라고 생각하여 회원 가입 과정으로 넘어가게 할 수도 있습니다. 동일한 아이디와 비밀번호가 존재하면 해당 방문자가 회원인 것이 확인되므로 회원인증ID를 발급한 후 회원이 요청한 페이지로 이동합니다. 아래는 회원 데이터베이스를 MySQL로 구성한 HTTP 인증의 예를 나타내었습니다.
[code php;gutter:false] <?php function authentication() { Header("WWW-authenticate: basic realm=\"회원 확인\""); Header("HTTP/1.0 401 Unauthorized"); $str = "<HTML>\n" . "<BODY>\n" . "<SCRIPT language=\"javascript\">\n" . "<!--\n" . " alert('회원전용 서비스를 받으시려면 먼저 회원으로 가입하세요.')\n" . " history.back()\n" . "//-->\n" . "</SCRIPT>\n" . "</BODY>\n" . "</HTML>"; echo($str); exit; } /* **************************************** 회원 정보 테이블의 생성 및 회원정보 입력 **************************************** CREATE TABLE members ( userid varchar(20) not null PRIMARY KEY, password varchar(16) not null ); INSERT INTO members VALUES('user1', 'test'); INSERT INTO members VALUES('user2', 'test'); INSERT INTO members VALUES('user3', 'test'); */ function get_record($userid) { global $Host, $User, $Password, $Database, $Table; mysql_connect($Host, $User, $Password) or die('SQL server에 연결할 수 없습니다.'); mysql_select_db($Database) or die('DataBase를 연결할 수 없습니다.'); $query = mysql_query("SELECT * FROM ".$Table." WHERE userid='$userid'"); $rec = mysql_fetch_array($query); mysql_free_result($query); mysql_close(); return $rec; } $Host = "localhost"; //'DB 호스트명 입력'; $User = "xxxxxxxxx"; //'DB 사용자ID 입력'; $Password = "xxxxxxxxx"; //'DB 비밀번호 입력'; $Database = "xxxxxxxxx"; //'DB명 입력'; $Table = "members"; //'회원 정보 테이블명 입력' if (!isset($PHP_AUTH_USER)) { // // 인증창에 값을 입력하지 않은 경우 다시 인증창을 띄운다. // authentication(); } else { // // 여기에서 회원 인증을 한다. // $record = get_record($PHP_AUTH_USER); if ("" == $record || $record[password] != $PHP_AUTH_PW) authentication(); // 회원인증에 실폐했으면 다시 인증창을 띄운다. // 회원 인증에 성공 session_register("record"); // 회원인증ID를 발급하기 위한 부분으로 // 여기서는 세션 함수를 이용하였다. echo "회원 인증에 성공\n;"; // 회원전용 페이지로 이동 } ?> [/code]
< 예제 : login.php >
회원인증ID를 발급하기 위해 세션 함수 대신에 쿠키를 이용한다면 session_register("record"); 부분을 아래와 같이 수정하면 됩니다.
[code php;gutter:false] SetCookie("member_user", $PHP_AUTH_USER, 0, "/"); SetCookie("member_pw", $PHP_AUTH_PW, 0, "/"); [/code]

Posted by 방글24