phpsource/회원인증2001. 1. 12. 14:34
세션함수(또는 세셔너) 및 쿠커를 이용하여 장바구니를 구현하였습니다.
PHP3에서 세션함수를 이용하기 위해서는 제가 공개한 세셔너-0.2.4을 문서상단에 포함하여 주세요. PHP4에서 사용할 때는 세셔너함수를 포함시키면 안됩니다.
쿠커(Cooker)용 장바구니에서는 PHP3와 PHP4에 관계없이 제가 공개한 쿠커-0.0.1을 문서상단에 포함하여 주세요.
장바구니 클래스 및 샘플 코드는 Tip&Tech&Download 게시판에 파일로 올려놓았습니다.
파일 구성
세셔너용
lib.sessioner.php - PHP3에서 세션함수를 사용하기 위한 라이브러리
class.carter4sessioner.php - 세셔너용 장바구니 클래스
class.article.php - 상품정보를 관리해주는 클래스
shopping.php3 - 쇼핑을 위한 쇼윈도우 샘플
cart.php3 - 장바구니를 보여주는 페이지 샘플
PHP4에서는 sessioner.php 파일이 필요없으며 cart.php3 및 shopping.php3 상단에 있는 세셔너 함수를 인클루드하는 부분을 삭제합니다.
[code php;gutter:false] require("./sessioner/lib.sessioner.php"); //<- PHP4에서는 삭제할 것 require("./cart/class.carter4sessioner.php"); require("./cart/class.article.php"); [/code]
쿠커용
class.cooker.php - 쿠커(Cooker; 쿠키정보 클래스)
class.carter4cooker.php - 쿠커용 장바구니 클래스
class.article.php - 상품정보를 관리해주는 클래스
shopping.php3 - 쇼핑을 위한 쇼윈도우 샘플
cart.php3 - 장바구니를 보여주는 페이지 샘플
쿠커를 사용하기 위해서는 PHP 버전에 관계없이 항상 문서 상단에 포함시켜야 합니다. class.article.php, cart.php3 및 shopping.php3 파일은 세셔너용과 동일합니다.
[code php;gutter:false] require("./cooker/class.cooker.php"); //<- PHP3, PHP4 모두에서 필요 require("./cart/class.carter4cooker.php"); require("./cart/class.article.php"); [/code]
장바구니 구조
장바구니는 세션함수를 이용하여 주문자가 주문처리하거나 로그아웃할 때까지 서버에 저장하도록 합니다.
ver 0.0.1
배열형태로 구성되었으며, 상품코드를 인덱스키로 하고, 주문수량이 값으로 저장되어 있습니다.
[code php;gutter:false] $Cart["A001"] = 4; // 상품코드 "A001"의 주문수량은 4개임 $Cart["A002"] = 2; // 상품코드 "A002"의 주문수량은 2개임 $Cart["B001"] = 3; // 상품코드 "B001"의 주문수량은 3개임 [/code]
ver 0.0.2
상품코드 및 상품색상에 의하여 분류할 수 있도록 2차원 배열로 구성되어 있습니다.
[code php;gutter:false] $CartData[상품코드][색상코드] = 주문수량 $CartData["A001"]["흰색"] = 4; // "A001" 흰색 상품의 주문수량은 4개임 $CartData["A002"]["갈색"] = 5; // "A002" 갈색 상품의 주문수량은 5개임 [/code]
장바구니 클래스(ver 0.0.2)
장바구니는 class.carter4sessioner.php(세셔너용), class.carter4cooker.php(쿠커용) 파일에서 클래스 Carter로 작성되어 있습니다. 생성자 매개변수로 장바구니로 이용할 세션변수명 또는 쿠키명을 지정할 수 있습니다. 생략하면 "PHP_CARTER_DATA"라는 이름을 사용합니다.
[code php;gutter:false] $cart = new Carter; // 장바구니 세션변수명 또는 쿠키명 = "PHP_CARTER_DATA" $cart = new Carter("mycart"); // 장바구니 세션변수명 또는 쿠키명 = "mycart" [/code]
쇼윈도우 화면
진열된 상품을 볼 수 있으며 이 화면에서 필요한 상품을 필요한 수량만큼 구매할 수 있습니다.
< 쇼윈도우 페이지 >
장바구니 보기 화면
쇼윈도에서 주문한 상품 리스트를 볼 수 있습니다. 이 화면 내에서 주문수량을 하나씩 추가하거나 줄일 수 있으며 필요없는 상품은 삭제할 수도 있습니다.
< 장바구니 보기 페이지 >

Posted by 방글24
phpsource/회원인증2000. 11. 21. 14:16

특정 회원만 사용할 수 있는 인증페이지를 작성하는 방법에 대한 예제입니다.
이 예제는 이전의 "세션라이브러리 예제"와 동일한 예제로, 변경된 것은 세션 라이브러리 대신에 세셔너클래스를 사용하여 세션 관리를 합니다. 인터페이스는 거의 동일합니다. 소스 코드는 대폭적으로 수정하였습니다.
회원 정보 테이블의 구조(MySQL의 경우)
[code sql;gutter:false] CREATE TABLE Members ( userid varchar(20) not null PRIMARY KEY, password varchar(16) not null ); [/code]
회원 정보 테이블에 저장된 회원 정보(MySQL의 경우)
이전 버전에서 사용하던 회원 정보가 변경되었습니다. 각 회원 정보를 아래와 같이 다시 생성해 주십시요.
userid password
user1 test
user2 test
user3 test
[code sql;gutter:false] INSERT INTO Members VALUES('user1', 'test'); INSERT INTO Members VALUES('user2', 'test'); INSERT INTO Members VALUES('user3', 'test'); [/code]
웹사이트 구성도
< 웹사이트 구성도 >
홈페이지에서 로그인 정보(사용자 ID, 비밀번호)를 입력합니다. 로그인 정보를 전송받은 웹서버는 회원 정보 테이블에 저장된 회원 정보와 비교하여 회원임이 판명되면 회원인증ID를 발급하고, 회원이 아니라면 다시 로그인 정보를 입력하도록 요구합니다. 이 프로그램에서 $access_userid에 로그인 할 때 입력된 사용자 ID를 설정하는 것으로 회원인증ID를 발급합니다. 회원 전용 페이지(페이지 #1, #2, #3, #4)에서는 $access_userid를 확인함으로써 로그인 과정을 거친 회원임을 알 수 있으며 따라서 별도의 인증 과정없이 회원 전용 서비스를 제공하게 됩니다.
회원 전용 페이지 서두에는 현재 페이지의 퍼미션 등급과 퍼미션 회원ID를 아래와 같이 설정합니다.
[code php;gutter:false] $permission_user = "user1"; $permission_type = "owner"; [/code]
위와 같이 $permission_type에 "owner"을 설정하면 특정 회원에게만 제공되는 페이지로 이 때는 반드시 $permission_user에 회원ID를 지정하여야 합니다. 위와 같은 경우는 회원ID가 "user1"인 회원에게만 허용된 페이지입니다. 만약 로그인에 성공한 모든 회원에게 페이지 접급을 허용하려면 아래와 같이 $permission_type에 "login"을 설정하면 됩니다. 이 때는 $permission_user를 지정할 필요가 없습니다.
[code php;gutter:false] $permission_type = "login"; [/code]
페이지 구성 및 회원별 접근 제한
예제 프로그램에서는 페이지 #1, #2, #3는 퍼미션 등급이 "owner"으로 설정되어 있고, 페이지 #4는 "login"으로 설정되어 있습니다.
페이지 구성 접근이 허용된 회원
홈페이지
(로그인 정보 입력)
모든 방문자
페이지 #1 로그인한 "user1" 회원
페이지 #2 로그인한 "user2" 회원
페이지 #3 로그인한 "user3" 회원
페이지 #4 로그인한 모든 회원
예제 #1과 예제 #2
예제 #1은 로그인후에 오른쪽에 사용자목록이 나타나고 이 목록에서 사용자페이지를 선택할 수 있습니다. 반면 예제 #2는 사용자목록 없이 로그인 하면 바로 자신의 페이지로 넘어가도록 하였습니다. 예제 #2는 원하시는 분이 있어 추가하였습니다. 소스는 Tip&Tech&Download 게시판에 등록되어 있습니다.
버전 0.2.0에서는 세셔너함수 0.2.1을 이용하여 작성되었습니다. 세셔너함수를 인클루드하는 부분만 삭제하면 PHP4의 세션함수를 이용하여 동작합니다.

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:53
전체 구성
< 회원전용 웹사이트의 동작 >

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:49
로그아웃을 통한 세션 정보 삭제
방문자는 로그아웃을 통하여 쿠키 또는 세션 변수에 저장된 세션 정보(회원인증ID 및 기타 정보)를 삭제합니다.
쿠키값을 삭제하는 방법
로그아웃할 때 쿠키정보를 삭제하려면 아래와 같이 합니다.
[code php;gutter:false] if ($HTTP_COOKIE_VARS["member_id"]) { SetCookie("member_id"); SetCookie("member_name"); SetCookie("member_email"); SetCookie("member_homepage"); } [/code]
또는,
[code php;gutter:false] if ($HTTP_COOKIE_VARS["member_id"]) { SetCookie("member_id","",time()); SetCookie("member_name","",time()); SetCookie("member_email","",time()); SetCookie("member_homepage","",time()); } [/code]
세션변수를 삭제하는 방법
로그아웃할 때 아래와 같이 session_destroy() 함수를 이용하여 세션 정보를 삭제합니다.
[code php;gutter:false] session_destroy(); [/code]
로그아웃을 통하지 않고 종료하는 경우의 보안 문제
로그아웃을 하지 않고 현재의 회원전용 웹사이트를 떠나게 된다면 서비스 받는 동안에 생성된 각종 세션 정보들이 그대로 쿠키 또는 세션 변수에 남아 있게 됩니다. 이와 같이 회원이 이러한 세션 정보를 삭제하지 않고 컴퓨터가 있는 자리에서 떠났을 때 회원이 아닌 다른 사람이 동일한 컴퓨터를 통하여 회원의 정보를 엿볼 수 있을 것입니다. 보안상 심각한 문제가 발생하는 것이지요. 그런데 일반적으로 보면 대부분의 방문자들은 로그아웃을 하지 않고 다른 웹사이트로 떠나게 됩니다. 회원 전용 웹사이트 개발자는 이런 경우에 발생할 수 있는 보안 문제에 대해서도 적절히 대처하여야 합니다. 이를 해결하는 방법으로 세션 변수의 지속시간이라는 것을 사전에 설정하게 됩니다. 즉, 회원전용 웹사이트에 마지막으로 접속한 후 일정시간동안 접속이 없으면 자동으로 세션 정보를 삭제하는 기능입니다. 이 지속시간은 보통 20분으로 설정하게 되는데 서버 관리자나 웹사이트 관리자가 필요에 따라 임의 설정하게 됩니다.
일정시간이 경과한 후에 자동으로 세션 정보 삭제
대부분의 방문자는 사용이 불편하다는 이유로 로그아웃을 거치지 않고 회원전용 웹사이트를 떠나게 됩니다. 이 때에는 이미 발급된 회원인증서 관련 정보들이 웹서버와 방문자 PC에 그대로 남아 있게 됩니다. 이것은 회원 정보 보안에 문제가 될 수 있으므로 방문자가 로그아웃을 거치지 않고 떠났다 하더라도 회원이 서비스를 종료하였는지를 판단하여 로그아웃 과정을 대신에 자동으로 수행하여야 합니다. 방문자가 회원전용 웹사이트를 마지막으로 접근한 이 후에 일정시간이 지나면 방문자가 회원전용 웹사이트를 떠났다고 판단하는 것이 좋습니다. 20분정도 지나도록 접속이 없으면 종료처리하는 것이 보통입니다.
때에 따라서는 세션 정보를 데이터베이스에 저장하는 경우도 있을 겁니다. 이런 경우는 데이터베이스 레코드에 생성되는 시간을 저장할 수 있는 필드를 추가한 후 이 필드에 세션 정보가 생성되거나 갱신되는 시간을 저장합니다. 이 후에 임의의 세션에서 이 테이블에 접근할 때 각 레코드가 만들어진 시간을 확인해서 갱신한 지 일정시간이 지난 레코드를 삭제해 주면 됩니다.
[code php;gutter:false] $table = "session_info"; $lifetime = 20; // 세션 지속 시간을 분단위로 지정 $sql = "DELETE FROM $table" . " WHERE lastused < DATE_SUB(NOW(), INTERVAL $lifetime MINUTE)"; mysql_query($sql); [/code]
HTTP 인증을 통한 로그인을 하였을 때 로그아웃의 문제
HTTP 인증을 통한 로그인을 하게 되면 $PHP_AUTH_USER을 얻게 되고 이를 통해 사용자 인증을 하게 되는데, $PHP_AUTH_USER 인증값은 브라우저를 종료하기 전까지는 계속 그 값이 유지하게 됩니다. 따라서 명시적으로 로그아웃을 할 수 없게 됩니다.

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:47
회원전용 페이지에서의 동작
< 회원전용 페이지에서의 동작 >
회원전용 웹사이트에 접근하는 방문자가 있을 때에 해당 서비스를 제공하기 전에 서비스를 요청한 방문자의 회원인증ID를 발급받았는지를 검사함으로써 방문자의 회원인지 여부를 판단합니다. 보통 회원인증ID는 쿠키 또는 세션 변수에 담겨서 넘어오기 때문에 이 쿠키 또는 세션 변수에 정당한 값이 저장되어 있을 경우에는 이미 로그인을 거쳐 회원으로 인증된 방문자임을 알 수 있으므로 이 방문자가 요청한 서비스를 즉시 제공하여야 합니다. 그러나 설정된 값이 없는 경우에는 아직 로그인을 거치지 않은, 확인되지 않은 방문자이므로 이 방문자가 요청한 서비스를 실행하지 않고 대신에 로그인 양식을 출력하여 아이디와 비밀번호를 입력하도록 요구합니다.
일단 로그인 과정에서 회원 인증에 성공하여 회원인증ID를 발급받게 되면 회원전용 웹사이트에서 제공하는 모든 서비스를 이용할 수 있게 됩니다. 따라서 회원전용 페이지에서는 우선 방문자가 회원인증ID를 발급받았는지를 확인하여야 하며, 발급받은 방문자에게만 서비스를 제공합니다. 만약 회원인증ID를 가지고 있지 않다면 로그인 과정으로 이동합니다.
쿠키를 통해 회원인증ID가 전달된 경우
아래와 같이 로그인에 성공하여 쿠키 변수 $member_id(회원인증ID)에 회원 정보 테이블에 등록된 회원ID가 저장되어 전달되었다고 가정합니다. 쿠키 변수 $member_id 값이 설정되어 있으면(즉, 회원인증ID가 발급되었으면) 이 방문자는 정식회원이라고 인증되어 서비스를 제공합니다. 이 과정이 회원전용 웹페이지에서 수행되는 회원 인증 방법입니다.
세션 함수를 통해 회원인증ID가 전달된 경우
아래와 같이 로그인에 성공하여 세션 변수 $member_id(회원인증ID)에 회원 정보 테이블에 등록된 회원ID가 저장되어 전달되었다고 가정합니다. 세션 변수 $member_id 값이 설정되어 있으면(즉, 회원인증ID가 발급되었으면) 이 방문자는 정식회원이라고 인증되어 서비스를 제공합니다. 이 과정이 회원전용 웹페이지에서 수행되는 회원 인증 방법입니다.
[code php;gutter:false] <? //==================================== //쿠키를 통해 회원인증ID가 전달된 경우 //==================================== //--------------------------------- //로그인 과정에서의 회원인증ID 발급 //--------------------------------- SetCookie("member_id",$id,0,"/"); //--------------------------------- //회원전용 웹페이지에서의 회원 인증 //--------------------------------- if ($HTTP_COOKIE_VARS["member_id"]) { // 로그인을 정상적으로 하였다면 // // 여기에서 회원전용 서비스 제공 // } else { // // 로그인을 하지 않고 페이지에 접근하려면 먼저 로그인 페이지로 보냄 // <META http-equiv='refresh' content='0; url=로그인.php'>; } //==================================== //세션 함수를 통해 회원인증ID가 전달된 경우 //==================================== //--------------------------------- //로그인 과정에서의 회원인증ID 발급 //--------------------------------- session_register("member_id"); $member_id = $id; //--------------------------------- //회원전용 웹페이지에서의 회원 인증 //--------------------------------- session_start(); if ($member_id) { // 로그인을 정상적으로 하였다면 // // 여기에서 회원전용 서비스 제공 // } else { // // 로그인을 하지 않고 페이지에 접근하려면 먼저 로그인 페이지로 보냄 // <META http-equiv='refresh' content='0; url=로그인.php'>; } ?> [/code]
회원정보를 수정하려는 회원에게 제공되는 서비스
회원 인증ID를 발급받은 방문자가 받을 수 있는 서비스 중에 하나가 신규 가입할 때 등록했던 자신의 회원 정보를 변경하는 것입니다. 로그인한 회원 중에서 회원정보를 변경하려는 회원은 회원정보 변경 프로그램을 통하여 자신의 정보를 수정할 수 있도록 합니다. 이 때 프로그램을 구현하기에 따라서는 가입할 때 등록된 모든 정보를 변경할 수 없도록 변경할 수 있는 회원정보를 일부 제한할 수 있습니다.

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:42
FORM 태그를 이용한 인증
입력 양식을 통해 직접 사용자 ID와 비밀번호를 입력받아 이 데이터를 웹서버로 보냅니다. 비밀번호는 INPUT 태그 형식을 'password'로 지정하여 보안을 유지합니다.
< 로그인 정보 입력 화면 >
[code html;gutter:false] <FORM name=getID method='post' action='login.php'> <TABLE width='350' border='0' cellpadding='0' cellspacing='6' bgcolor='#DBF09F'> <TR> <TD align='center' height='30' colspan='2'> <B>사용자 로그인</B> </TD> </TR> <TR> <TD align='right'> 사용자ID </TD> <TD> <INPUT type='text' name='login_user' size='15'> </TD> </TR> <TR> <TD align='right'> 비밀번호 </TD> <TD> <INPUT type='password' name='login_pw' size='15'> </TD> </TR> <TR> <TD align='center' height='30' colspan='2'> <INPUT type='submit' value='로그인'> </TD> </TR> </TABLE> </FORM> [/code]
로그인 과정에서의 회원 인증
로그인 입력 양식에서 로그인 버튼을 클릭하게 되면 로그인을 처리하기 위한 스크립트가 동작합니다. 로그인 처리 결과에 따라 회원인증ID를 발급하게 되고 회원이 요청한 페이지로 이동하게 됩니다. 이와 같이 로그인 입력 양식에 회원ID와 비밀번호를 입력하는 단계부터 회원인증ID를 발급하게 되는 단계까지가 로그인 과정입니다. 로그인 정보 입력 단계에서 회원ID와 비밀번호가 입력되고 이 정보가 웹서버에 보내지면 이 순간부터 웹서버는 회원 인증을 위해 $login_user/$login_pw를 회원 정보 테이블에 있는 회원 ID/비밀번호와 비교하는데 사용하게 됩니다. 로그인 양식을 통해 입력된 방문자의 회원ID 및 비밀번호를 회원 데이터베이스에서 검색하여 등록된 회원인지 여부를 확인하는 기능입니다. 만약 방문자가 입력한 회원ID와 비밀번호가 회원 데이터베이스에 등록되어 있지 않는 경우에는 요청된 서비스를 거부하고 다시 회원ID와 비밀번호를 입력할 것을 요구할 수도 있고, 아니면 등록된 회원이 아니라고 생각하여 회원 가입 과정으로 넘어가게 할 수도 있습니다. 동일한 아이디와 비밀번호가 존재하면 해당 방문자가 회원인 것이 확인되므로 회원인증ID를 발급하기 위한 단계로 넘어갑니다.
[code php;gutter:false] <?php function authentication() { echo " <FORM name=getID method='post' action='login.php'> <TABLE width='350' border='0' cellpadding='0' cellspacing='6' bgcolor='#DBF09F'> <TR> <TD align='center' height='30' colspan='2'> <B>사용자 로그인</B> </TD> </TR> <TR> <TD align='right'> 사용자ID </TD> <TD> <INPUT type='text' name='login_user' size='15'> </TD> </TR> <TR> <TD align='right'> 비밀번호 </TD> <TD> <INPUT type='password' name='login_pw' size='15'> </TD> </TR> <TR> <TD align='center' height='30' colspan='2'> <INPUT type='submit' value='로그인'> </TD> </TR> </TABLE> </FORM> "; } /* **************************************** 회원 정보 테이블의 생성 및 회원정보 입력 **************************************** 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 (!$HTTP_POST_VARS["login_user"] || !$HTTP_POST_VARS["login_pw"]) { // // 인증창에 값을 입력하지 않은 경우 다시 인증창을 띄운다. // authentication(); } else { // // 여기에서 회원 인증을 한다. // $record = get_record($HTTP_POST_VARS["login_user"]); if ("" == $record || $record[password] != $HTTP_POST_VARS["login_pw"]) authentication(); // 회원인증에 실폐했으면 다시 인증창을 띄운다. else { // 회원 인증에 성공 session_register("record"); // 회원인증ID를 발급하기 위한 부분으로 // 여기서는 세션 함수를 이용하였다. echo "회원 인증에 성공\n"; // 회원전용 페이지로 이동 } } ?> [/code]
< 예제 : login.php >
회원인증ID를 발급하기 위해 세션 함수 대신에 쿠키를 이용한다면 session_register('record'); 부분을 아래와 같이 수정하면 됩니다.
[code php;gutter:false] SetCookie('member_user', $HTTP_POST_VARS["login_user"], 0, '/'); SetCookie('member_pw', $HTTP_POST_VARS["login_pw"], 0, '/'); [/code]

Posted by 방글24
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
phpsource/회원인증2000. 10. 10. 15:30
로그인이란?
로그인이란 웹사이트 방문자가 회원전용 웹사이트에 접속해 서비스 사용에 대한 허가를 얻는 것을 말합니다. 이를 로그온(log on)이라고도 합니다.
로그인 과정
로그인 과정은 앞서 설명한 회원 인증 과정을 말하며, 회원 전용 웹사이트에 접근한 방문자가 회원인지 아닌지를 확인합니다. 회원 가입 과정을 통해 정상적으로 회원으로 가입한 정식 등록 회원은 가입할 때 신청한 회원ID와 비밀번호를 입력하여 방문자가 정식 등록된 회원인지를 확인하는 로그인 절차를 거쳐야 합니다. 정식 회원으로 확인되면 회원 전용 웹사이트에 들어갈 수 있는 회원인증ID를 회원에게 부여합니다. 그러면 회원은 이 회원인증ID를 가지고 방문자가 요청한 회원 전용 페이지에서 별도의 로그인 절차를 다시 거치지 않고도 서비스를 받을 수 있게 되는 것입니다.
< 로그인 과정 >
로그인 정보 입력
회원이 웹사이트에 들어오면 우선 자신의 회원ID와 비밀번호를 입력합니다. 이러한 회원ID와 비밀번호를 입력하도록 로그인 양식을 출력해 주는 기능입니다. 이와 같이 로그인 정보를 입력하는 방법으로는 HTTP 인증을 통한 방법이 있고 입력양식(FORM 태그)을 이용하는 방법이 있습니다.
중복 로그인 방지
이미 로그인하여 사용하고 있는 회원이 로그아웃 과정을 거치지 않고 로그인 페이지에 다시 접근하려는 경우, 또는 회원 A가 로그아웃을 하지 않고 떠난 상태에서 동일한 브라우저로 회원 B가 로그인 하려는 경우에 이를 방지하기 위한 기능입니다. 어떠한 경우에서도 이미 로그인되어 있는 상태에서는 다시 로그인하지 않도록 하여야 할 겁니다.
로그인 되어 있는 상태에서 다시 로그인 페이지로 접근하였다면 아래와 같이 로그아웃을 할 것인지 아니면 계속 회원전용 서비스를 받을 것인지를 선택하도록 합니다.
로그인 과정에서 세션 함수를 통해 아래와 같이 회원인증ID 발급되었다면
[code php;gutter:false] session_register("member_id"); $member_id = $id; [/code]
로그인 페이지에서는 회원인증ID가 발급되어 있는 상태인지를 확인한다.
[code php;gutter:false] session_start(); if ($member_id) { // // 이미 로그인을 통해 회원인증이 되어 있으므로 중복 로그인이 되지 않도록 함 // echo " 회원님은 이미 로그인하셨습니다.\n;\n; 1. 로그아웃 하시겠습니까? -> <A HREF='logout.php'>로그아웃 페이지</A>로 이동합니다.\n;\n; 2. 계속 서비스를 이용하시겠습니까? -> <A HREF='membersite.php'>회원전용 페이지</A>로 이동합니다. "; exit; } else { // // 여기에서 로그인 과정을 삽입 // } [/code]

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:17
회원 가입 과정
회원 가입 과정은 방문자가 원하면 회원으로 가입할 수 있도록 하기 위한 회원 가입 프로그램입니다. 회원전용 웹애플리케이션을 구현하기 위해서는 회원만이 사용할 수 있는 서비스를 방문자가 요청했을 때 이 방문자가 정식으로 가입된 회원인지를 확인하는 절차를 거쳐야 합니다. 그러려면 우선은 가입되어 있는 모든 회원들의 정보를 저장하는 회원 데이터베이스(회원 정보 테이블)가 있어야 합니다. 회원 가입할 때 가입 양식을 통해 방문자가 입력한 각종 정보는 모두 이 회원 데이터베이스에 저장되는데 여기에 저장되어 있는 회원ID 및 비밀번호와 방문자가 로그인할 때 입력한 회원ID 및 비밀번호를 비교하여 서로 일치할 경우에만 회원전용 웹사이트의 서비스를 이용할 수 있는 자격을 가진 방문자로 인증을 받게 되는 것입니다.
< 회원 가입 과정 >
회원 정보 입력
회원 가입 양식을 출력하여 입력 양식을 통해 방문자로 하여금 가입에 필요한 회원 정보를 입력하도록 합니다. 입력받은 후 입력정보를 웹서버로 보냅니다. 가입할 때 요구되는 정보로는 회원ID, 비밀번호, 성명, 주민등록번호(또는 생년월일 및 성별), 전자우편주소, 홈페이지 주소, 직업, 자택주소, 직장주소 등이 있습니다.
< 회원 가입 양식 >
회원 정보 입력할 때 필요한 기능들
  1. ID 중복 확인
  2. 우편 번호 자동 입력
  3. 주소 자동 입력
  4. 필수 항목 입력 여부 검사
입력 정보 중에는 반드시 입력해야 하는 정보도 있고 입력하지 않아도 되는 것이 구분되어 있어야 하며 반드시 입력해야 하는 필수 입력 항목는 가입하려는 방문자에게 필수 입력 항목을 주지시켜주며, 이 값들을 정확하게 입력하지 않은 경우에는 가입 처리가 되지 않도록 합니다. 필수 입력 항목을 검사하는 방법에는 자바스크립트를 이용하여 클라이언트에서 검사하는 방법과 PHP 스크립트를 이용하여 서버상에서 검사하는 방법이 있습니다.
회원ID는 회원전용 웹사이트 내에서 각 회원들을 구분할 수 있는 식별자로 사용되며 따라서 동일한 아이디는 존재할 수 없습니다. 이에 따라 신규 가입할 때 가입자가 신청한 아이디가 다른 회원에 의해 이미 등록되어 있는지를 확인하는 ID 중복 확인 기능을 구현하여야 합니다.
또한 필요에 따라서는 가입자의 주소와 우편번호를 데이터베이스에서 검색하여 편리하게 입력할 수 있도록 우편번호와 주소에 대한 자동 입력 기능을 구현하는 것이 바람직할 것입니다.
회원 정보 기록
방문자가 입력한 정보를 회원 데이터베이스(회원 정보 테이블)에 저장하는 과정으로 이 과정에서는 방문자의 동작을 요구하지 않고 단지 서버상에서만 동작하게 됩니다.
회원 정보 기록할 때 필요한 기능들
  1. ID 중복 확인
  2. 주민등록번호 확인
  3. 필수 항목 입력 여부 검사
"ID 중복 확인" 및 "필수 항목 입력 여부 검사"를 위한 기능은 회원 정보를 입력할 때 처리할 수도 있고, 아니면 회원 정보를 데이터베이스에 기록하기 직전에 확인할 수도 있습니다.

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:16
세션(session)이란?
세션이란 용어는 방문자가 특정 웹사이트에 머무르게 되는 일정 시간을 뜻합니다. 앞장에서도 언급했었지만 문제는 HTTP는 상태를 유지하는 기능을 갖고 있지 못하므로 각각의 요청은 서로와 관련성을 갖지 못한다는 점입니다. 웹서버는 쉽게 각각의 방문자를 구분하지 못하고 특정 방문자의 세션에 대하여 알 수가 없습니다. FTP 또는 TELNET와 다르게 HTTP(Hyper Text Transfer Protocol)는 방문자의 상태를 계속 유지할 수가 없는 문서텍스트의 비순차적 검색을 위한 인터넷 프로토콜로 TCP/IP를 기반으로 하고 있으며 파일 단위의 요청, 연결, 송수신을 기본으로 하고 있습니다. 따라서 새로운 페이지를 요청할 때마다 새로운 접속이 이루어지며 이전페이지와 현재페이지의 관계가 지속되지 않습니다. 이에 따라 HTTP 프로토콜을 이용하게 되는 웹사이트에서는 웹페이지에 머무르는 특정 방문자가 머무르는 동안에 그 방문자가 가지고 있어야 하는 데이터를 묶는 방법이 필요하게 됩니다. 이 방법을 세션 관리라고 합니다. 결국 세션이란 특정 방문자가 특정 시간에 접근하는 기간을 똣하는 것으로, 로그인하는 순간부터 회원전용 서비스를 이용하는 시간을 거쳐 로그아웃할 때까지의 시간을 말합니다. 회원인증ID 발급부터 회원인증ID 삭제까지의 과정을 세션이라고 하며 이 과정에서 유지되어야 하는 정보를 세션정보라 할 수 있습니다.
< 세션 생성 및 소멸 >
그림에서 보면 전체 시간 중에 5명의 방문자가 웹사이트에 접속하여 로그인-로그아웃하기를 반복하여 총 8개의 세션이 발생한 후 소멸되었습니다. 동일 시간 대에 발생한 최대 세션수를 보면 4개로 나타나 있습니다. 이러한 세션 중에 유지되는 정보가 세션 정보이고, 이러한 정보가 저장되어야 하는 변수를 세션 변수라고 합니다. 그리고 세션과 세션을 구분하는데 필요한 식별자를 세션 ID라고 합니다.
세션 정보
회원인증ID를 통한 서비스를 제공받을 때에 대부분 한 페이지에서만 서비스를 받는 경우는 거의 없으며 대부분 2페이지 이상의 복수 페이지에서 받게 됩니다. 따라서 발급된 회원인증ID를 다른 페이지로 계속 전달할 필요가 있으며 이렇게 하여야 한번의 인증과정(로그인과정으로 회원인증ID를 발급하는 과정)만으로 방문자는 더 이상 자신을 인증하기 위해 회원ID와 비밀번호를 다시 입력할 필요가 없게 됩니다. 이와 같이 복수의 페이지에서 한번 발급된 회원인증ID를 유지하기 위한 방법이 필요하게 되며, 이러한 방법으로는 많은 경우가 쿠키 또는 세션함수를 이용하게 됩니다. 회원인증ID 외에도 서비스를 받는 동안 발생하는 각종 정보 중 그 값이 세션중에 계속 유지되어야 하는 세션정보에는 로그인 과정 중에 회원 데이터베이스에서 읽어온 회원정보, 쇼핑몰 사이트인 경우에는 장바구니, 통계 분석을 위해 수집되는 방문자 PC에 대한 정보 등이 있습니다. 이렇게 회원을 가입받고, 로그인하게 한다면 세션 정보를 이용해서 각각의 사용자들을 구별할 수가 있을 것입니다. 이 회원인증을 통해 우리는 각각의 사용자가 어떤 사람이냐에 따라 페이지 접근을 제한할 수도 있습니다. 세션 내에서 유지되어야 하는 세션 정보는 아래와 같이 분류될 수 있습니다.
회원정보(Member)  - 로그인할 때 회원 데이터베이스로부터 읽어 온 회원에 대한 정보
세션정보(Session) - 세션아이디(PK) 회원아이디.레벨.그리고 통계를 위한 자료들
회원선택정보         - 쇼핑몰에서의 장바구니 정보(제품아이디 세션아이디 수량 등),
                            회원제 강의실에서의 수강신청과목 등과 같이 회원이 서비스
                            받은 동안 선택하게 되는 정보, 방문자가 접근했던 페이지 이력 등
이 중에 회원선택정보에는 세션 내에서 뿐만아니라 동일 방문자(물리적 의미에서의)가 향후에 접근하게 되는 또 다른 세션에서도 유지할 필요가 있는 정보가 있으며, 이러한 정보는 세션이 종료되기 전에 데이터베이스 등을 이용하여 영구적으로(또는 반영구적으로) 보존하기 위한 대책을 강구하여야 합니다.
세션 관리
특정 방문자에 대한 세션 정보를 세션 내에서 유지하는 방법(즉, 페이지간 세션정보를 전달하는 방법)에는 아래와 같이 여러 가지가 있습니다.
  1. 쿠키를 이용하는 방법(PHP3 & PHP4)
  2. 세션함수를 이용하는 방법(PHP4)
  3. 쿠키와 데이터베이스를 이용하는 방법(PHP3 & PHP4)
  4. HTTP GET & POST Method(PHP3 & PHP4)
PHP3에서는 쿠키를 가장 많이 애용했을 겁니다. PHP4에서는 세션함수를 많이 이용할 거라고 추측됩니다. 그리고 PHP4가 발표되기 전에 사용되던 PHPLIB와 같은 세션라이브러리는 3번째 방법에 해당합니다. PHP3와 PHP4에서 모두 동작하기를 원하면서 다량의 정보를 전달할 필요가 있을 때에 3번째 방법이 가장 적합한 방법이 되겠지만 이 방법은 개발자가 손볼게 많은 것이 흠이지요. PHP4에서만 동작되어도 상관없다면 2번째 방법으로 개발하시는 것이 가장 좋을 듯합니다. 사용하기도 편하고 기본적으로 PHP 스크립트에 내장된 함수들이라 향후 호환성도 보장되고요. HTTP GET & POST 방식으로도 세션 관리를 할 수도 있지만, 이 방식을 사용하면 매페이지에서 모든 세션 정보를 계속 다음 페이지로 전달하여야 하는 문제가 있어 특별한 경우가 아니라면 별로 바람직하지 않습니다.
 
쿠키(Cookie)를 이용한 세션 관리
쿠키(cookie)는 세션정보를 서버가 아닌 방문자의 시스템(하드디스크)에 저장함으로써 서버쪽에서 해당 방문자를 다른 방문자와 구분하여 추적할 수 있도록 해 주는 것으로, setcookie() 함수를 이용하여 이러한 쿠키를 생성합니다. 본 문서에서는 setcookie() 함수에 대해서 별도로 기술하지 않겠습니다. 따라서 관련 웹사이트나 자료를 참고하여 setcookie() 함수에 입력되는 각 인자를 설정하여 주시기 바랍니다. 아래는 예를 들어 나타낸 인자들이므로 실제 상황에서는 다르게 설정될 수 있습니다.
[code php;gutter:false] SetCookie("member_id",$id,0,"/"); SetCookie("member_name",$db_name,0,"/"); SetCookie("member_email",$db_email,0,"/"); SetCookie("member_homepage",$db_homepage,0,"/"); [/code]
회원전용 서비스를 제공하는 페이지에서 세션정보를 이용하게 되는데 이 때 쿠키로 저장된 세션 정보를 읽어 오기 위해서는 보통 쿠키를 위한 배열변수인 $HTTP_COOKIE_VARS[]를 이용하게 됩니다. 만약 보안상의 문제를 무시하셔도 된다면 배열 $HTTP_COOKIE_VARS[] 대신에 $member_id와 같이 전역변수로써 처리하시는 것이 편할 것입니다.
[code php;gutter:false] echo $HTTP_COOKIE_VARS["member_id"]; echo $HTTP_COOKIE_VARS["member_name"]; echo $HTTP_COOKIE_VARS["member_email"]; echo $HTTP_COOKIE_VARS["member_homepage"]; [/code]
그리고 로그아웃할 때 아래와 같이 쿠키정보를 삭제합니다.
[code php;gutter:false] if ($HTTP_COOKIE_VARS["member_id"]) { SetCookie("member_id","",time()); SetCookie("member_name","",time()); SetCookie("member_email","",time()); SetCookie("member_homepage","",time()); } [/code]
쿠키값을 읽을 때 배열변수 $HTTP_COOKIE_VARS["cookie_name"] 대신에 전역변수 $cookie_name를 사용할 수도 있으나, test.php?cookie_name=val과 같이 GET 또는 POST 등과 같은 방법으로도 전역변수 $cookie_name의 값이 넘어 올 수 있으므로 보안상 별로 바람직하지 않습니다.
쿠키 기술은 넷스케이프 내비게이트에서 처음 사용됐으며, 뒤이어 MS 익스플로러에도 쿠키 기술이 탑재되었습니다. 현재 대부분의 웹브라우저는 쿠키 기능을 갖고 있습니다. 그런데 방문자가 쿠키를 받을 것인지 아닌지를 선택할 수 있는 기능도 포함되어 있기 때문에 만약 방문자가 쿠키를 받지 않도록 브라우저가 설정한다면 쿠키를 이용한 세션 관리는 불가능합니다. 따라서 개발자는 이 경우를 고려하여 웹사이트를 개발하여야 할 것입니다.
쿠키를 이용할 때 고려해야 할 또 한가지 중요한 것은 setcookie() 함수의 세번째 인자인 시간 설정에 관련된 문제입니다. setcookie() 함수로 설정되는 시간은 서버 시간을 기준으로 지정되지만 쿠키가 생성되고 소멸되는 시간은 방문자 시스템(클라이언트) 시간을 기준으로 수행됩니다. 따라서 서버와 클라이언트 시간 설정이 일치하지 않는다면(대부분은 아마 정확히 일치하지 않을 것입니다만) setcookie() 함수를 이용하여 쿠키를 클라이언트에 정확한 시간에 생성 및 소멸시키는 것은 매우 어려울 것입니다. 이 문제는 결국 로그인이 정상적으로 이루어지지 않는다는 문제와 같다고 할 수 있으므로 웹사이트 개발자는 쿠키를 사용할 때는 이 문제를 충분히 고려하여야 합니다.
세션 함수(PHP4 세션)를 이용한 세션 관리
쿠키는 방문자가 알지 못하는 사이에 방문자의 동의없이 신상정보를 방문자의 컴퓨터에 저장하고 이 정보를 제 3자에게 전달할 수 있습니다. 이 문제로 인해 개인의 프라이버시를 침해할 소지가 다분이 포함되어 있고, 또한 보안 문제도 나타나고 있는 것으로 보여집니다. 이러한 문제로 인하여 세션 상태를 웹브라우저가 아닌 웹서버에 기록할 필요성이 대두되어 이에 대한 방법으로 PHP 스크립트에서는 세션 함수를 제공하고 있습니다. 그러나 이러한 세션함수들은 PHP4에서 부터 지원되는 기능으로 PHP3에서는 지원되지 않기 때문에 현재(2000.10)까지는 아직 대다수를 차지하고 있는 PHP3 스크립트에서는 이용할 수 없는 문제가 있습니다.
PHP4 세션은 session_start() 함수로 시작할 수도 있고, session_register() 함수를 사용하여 세션 변수를 등록함으로써 시작될 수도 있습니다. session_start()는 페이지 맨 위에서 호출되며, 등록된 세션 변수를 스크립트에서 사용할 수 있도록 해주며, session_register() 함수는 새로운 세션 변수를 등록할 수 있도록 해줍니다. 세션이 시작되지 않았다 하더라도 session_register() 함수가 내부적으로 session_start()을 호출하기 때문에 특별히 session_stert() 함수를 명시할 필요가 없습니다. 세션함수는 PHP 스크립트에 내장되어 있기 때문에 인증, 퍼미션, 사용자 로그인에 따른 세션값, 페이지 관리 등을 보다 빠르고 편하게 할 수 있습니다.
아래와 같이 session_register를 이용하여 세션 정보를 등록합니다.
[code php;gutter:false] session_register("member_id"); session_register("member_name"); session_register("member_email"); session_register("member_homepage"); $member_id = $id; $member_name = $db_name; $member_email = $db_email; $member_homepage = $db_homepage; [/code]
회원전용 서비스를 제공하는 페이지에서 세션정보를 이용하게 되는데 이 때 서버에 저장된 세션 정보를 읽어 오기 위해서는 session_start()함수를 이용하게 됩니다.
[code php;gutter:false] session_start(); echo $member_id; echo $member_name; echo $member_email; echo $member_homepage; [/code]
그리고 로그아웃할 때 아래와 같이 session_destroy() 함수를 이용하여 세션 정보를 삭제합니다.
[code php;gutter:false] session_destroy(); [/code]
PHP을 설치할 때 특별히 설정값을 변경하지 않았다면 세션 변수의 지속시간은 0입니다. 따라서 브라우저를 닫는 순간에 세션은 종료되어 등록된 세션변수들은 모두 사라지게 됩니다.
쿠키와 데이터베이스를 이용한 세션 관리
PHP3 스크립트에서는 세션을 구현할 수 있는 함수가 별도로 제공되지 않았기 때문에 보통 쿠키를 이용하여 세션을 구현하였습니다. 또 다른 방법으로는 PHPLIB 라이브러리와 같이 데이터베이스를 이용하여 세션 기능을 구현하게 됩니다. 각 방문자를 구별해 주는 세션 ID는 PHP4 세션과 마찬가지로 쿠키 또는 GET/POST Method 등을 이용하게 되며, 세션 정보를 저장하기 위한 수단으로 사용되는 데이터베이스로는 MySQL, 오라클, 포스트그레스 등과 같이 우리가 알고 있는 대부분의 데이터베이스를 이용할 수 있습니다. PHPLIB는 이와 같이 다양한 도구를 이용할 수 있도록 작성되어 있어 확장성이 좋은 반면에 코드가 너무 복잡하고 이해하기도 쉽지않아 이를 이용하여 세션 기능을 구현한 경우는 그리 흔하지 않은 것 같습니다. 그래서 이를 축소하여 쿠키와 MySQL을 이용하여 세션을 구현하도록 한 축소판 세션 라이브러리(곽태환 님의 세션 라이브러리 또는 제 홈페이지에 있는 세션 라이브러리)도 일부 공개되고 있습니다. 각 라이브러리의 사용 방법은 라이브러리마다 서로 다르기 때문에 여기서는 사용 방법을 언급하지 않겠습니다. 그러니 궁금하시면 각 라이브러리를 참고하시기 바랍니다.
HTTP GET 방식을 이용한 세션 관리
세션 내의 페이지간에 세션 변수를 HTTP GET Method를 통해 지속적으로 전달하여 세션을 관리할 수 있습니다. GET Method로 변수값을 전달하는 방법으로는 아래와 같이 3가지 방법이 있습니다.
[code php;gutter:false] echo ("<SCRIPT>location.href='page.php3'</SCRIPT>") ; [/code]
< 1) 자바스크립트를 이용하는 방법 >
[code php;gutter:false] <?php Header("Location:page.php3") ; ?> [/code]
< 2) 헤더 함수를 이용하는 방법 >
[code php;gutter:false] echo ("<META http-equiv='refresh' content='0; url=./index.html'>") ; [/code]
< 3) 메타 태그를 이용하는 방법 >
GET 방식은 서버 또는 브라우저에서 변수와 그 값이 모니터링될 수 있기 때문에 보안에 문제가 있습니다. 이러한 문제로 회원인증ID가 노출되었다면 호기심 많은 일부 사용자가 아래와 같이 프로그램을 실행하여 회원전용 페이지에 로그인없이 접근할 수 있을 겁니다.
page.php3?member_id=$id&member_pw=$pw
HTTP POST 방식을 이용한 세션 관리
다음과 같이 FORM 태그를 이용하여 변수를 전달합니다.
[code php;gutter:false] echo (" <form name='fc' action='./php_pro.php' method='post' > <input name=fcurl type=hidden value='./basket.php'> <input name=fwr type=hidden value='smile'> </form> ") [/code]
이렇게 하면 POST 방식으로 변수를 보낼 수 있고 게다가 INPUT 태그만 추가하면 얼마든지 많은 양의 변수를 보낼 수 있습니다. 게다가 환경변수 HTTP_POST_VARS[] 배열을 사용하여 GET으로 넘어오는 모든 변수를 막으면 보안에도 어느정도 대비할 수 있습니다. 단점이라면 매 페이지마다(현재 페이지에서 세션 정보를 사용하지 않더라도) 위의 코드를 포함시켜 다음 페이지로 세션 정보를 계속 전달하여야 합니다. 코드가 복잡해지고 때에 따라서는 불필요한 코드가 추가되어야 하는 것이지요.

 

[code php;gutter:false] echo HTTP_POST_VARS["member_id"]; [/code]

Posted by 방글24