여기서 언급하는 클라이언트 세션이란 클라이언트 사이드 스크립트인 자바스크립트 변수의 사용범위를 현재페이지를 벗어나 모든 페이지에서 그 값을 유지할 수 있도록 하여, 홈페이지를 방문하는 사용자들에 대한 정보를 저장하는 수단이나, 서버 사이드 스크립트 변수와의 연동을 위해 사용하기 위한 기능입니다.
서버 세션 & 클라이언트 세션
세션관리는 어떤 기간동안 동일한 사용자로부터의 요청에 대한 상태를 유지하는 방법입니다. 세션이란 용어는 특정 웹사이트에 사용자가 머무르는 시간을 뜻합니다.

...... (중략) ......

세션관리는 웹페이지에 머무르는 한 사용자와 데이터를
묶는 방법을 뜻합니다.

...... (중략) ......

세션이란 용어가 한 사용자의 한번의 방문을 뜻합니다.

(출처: Session Handling with PHP 4, 저자:Tobias Ratschiller,
번역:김수희/ketchup@wowlinux.com)
위의 내용은 PHPSCHOOL.COM 강의실에 올라있는 김수희님의 번역물("Session Handling with PHP 4 번역판")에서 발췌한 내용입니다. 이 정의에서의 관점은 홈페이지에 접근한 사용자입니다. 홈페이지를 개발하는 프로그래머 관점에서 세션을 다르게 표현한다면, 세션 기능이란 서버 사이드 스크립트 변수의 사용범위(scope)를 현재 페이지에 한정하지 않고 여러 페이지로 확장시킨 것입니다. 즉 PHP의 전역변수의 사용범위가 현재 페이지 전체에 걸쳐 있지만 다른 페이지로 가면 현재의 전역변수의 내용은 없어집니다. 이러한 전역변수의 사용범위를 다른 중간 매체(데이터베이스 또는 파일 등)를 이용해 다른 페이지까지 확장시키는 것이지요.
그런데 지금까지 이러한 세션 기능이 서버 사이드 스크립트 측면(PHP 변수)에서만 전개되고 있는 것 같습니다. 관심을 클라이언트 쪽으로 돌려보지요. 클라이언트 사이드 스크립트 측면(보통 자바 스크립트 변수)에서 세션 기능을 구현하면 어떨까요?
클라이언트 사이드에서 홈페이지를 방문하는 사용자들에 대한 정보를 저장하는 수단으로 지금까지는 아마도 자바스크립트와 쿠키를 이용하였을 거라고 생각됩니다. 자바스크립트와 쿠키를 이용하는 방법은 "자바스크립트로 다이내믹 웹 페이지 디자인하기"라는 번역물 (권원상 역, 한빛미디어) P.139~160을 참조하세요.
여기서 구현한 "서버 & 클라이언트 세션 기능"은 서버 사이드 스크립트인 PHP를 이용하여 변수의 사용범위를 서버뿐만 아니라 클라이언트 사이드까지 (때에 따라서는 양쪽 모두) 확장시킨 것입니다.

Posted by 방글24
세셔너 0.2.5p1
  • prvSetSaveHandler() 함수 수정
    이것은 미니디비 0.2.2p1와의 충돌을 방지하기 위한 사전 작업입니다.
  • prvDecode() 함수 수정
    세셔너에서는 세션변수값이 빈문자열이면 자동으로 세션등록을 취소시켰는데 이것이 PHP4 세션함수와 다르게 동작합니다. PHP4와 동일하게 세션변수값을 unregister하지 않는 이상 어떠한 값이 있더라도 세션변수를 계속 유지되도록 수정하였습니다.
세셔너 0.2.5
  • session_set_cookie_param() 함수 관련 패치
세셔너 0.2.4
  • session_set_cookie_param() 함수 수정
  • session_save_path() 함수 수정
  • session_name() 함수 수정
세셔너 0.2.3
  • session_set_save_handler(), session_module_name(), session_encoding(), session_decoding() 함수 추가
  • 세셔너함수 0.2.2와 세셔너클래스 0.0.3 통합 => 세셔너 0.2.3
  • 세션함수와 세션핸들러의 분리
  • PHP3와 PHP4 공용 세셔너핸들러의 외장모듈 별도 제공(파일시스템용, 데이터베이스용, DBM/DMA용)
  • PHP3와 PHP4 공용 세셔너핸들러 함수 제공 - session_handler(), session_guests(), session_guest_list(), session_guest_data(), session_guest_decode(), session_event_path()
  • PHP3와 PHP4 공용 이벤트 핸들러 OnStart 및 OnEnd 제공
  • 세션명, 세션파일명 디폴트값을 PHP4 세션과 동일하게 변경(PHPSESSID, sess_......)
세셔너 0.2.2
  • session_get_cookie_params(), session_set_cookie_params(), session_cache_limiter() 함수 추가
세셔너 0.2.1
  • 세션변수의 인코딩/디코딩 부분에 버그가 있어 수정합니다
세셔너 0.2.0
이번 버전에서는 PHP 4.0.3을 참조하여 인터페이스를 결정하였습니다.
  • 세션변수의 인코딩/디코딩 부분 버그 수정
  • 보안 강화를 위해 세션ID와 함께 Client의 IP 주소 확인
  • session_register() 함수의 입력 인자의 변수형으로 배열 추가
  • session_name(), session_save_path(), session_id(), session_unset(), session_is_registered() 함수 추가
  • 내부 함수를 클래스/객체를 이용하여 호출하도록 소스코드 수정
  • $HTTP_SESSION_VARS[] 배열 제공
세셔너 0.0.3
  • Garbage Collection 기능의 버그 수정
  • $prvSessionGarbage 대신 기존의 $prvSessionInterval 에 지정된 시간에 따라 Garbage Collection 수행
  • fileatime() 함수와 PHPSES3LASTUSED 세션변수 대신 filemtime() 함수 사용
세셔너 0.0.2
  • Garbage Collection 기능 추가
  • session_destroy() 함수가 PHP4 세션함수와 다르게 동작하던 것을 수정
세셔너 0.0.1(최초 공개 버전) - 2000.10.24
  • session_start(), session_destroy(), session_register(), session_unregister() 함수 제공

'phpsource > 캐시&세션&쿠키' 카테고리의 다른 글

{클라이언트 세션}2.클래스 구성  (0) 2000.11.21
{클라이언트 세션}1.개요  (0) 2000.11.21
{PHP3용 세션}3.사용방법  (0) 2000.10.14
{PHP3용 세션}2.세셔너함수  (0) 2000.10.14
{PHP3용 세션}1.개요  (0) 2000.10.14
Posted by 방글24
사용방법
PHP4 세션함수와 사용방법이 동일합니다. 단, 이러한 세셔너 함수를 사용하기 위해서는 웹문서의 머리말에 세셔너 파일 및 세셔너핸들러 파일을 적절히 포함시켜야 합니다.
세셔너 파일
사용자 인터페이스로 볼 때에 PHP4 세션함수에서는 볼 수 없는 유일한 부분입니다. lib.sessioner.php는 세셔너함수를 사용하기 위해서 가장 먼저 포함하여야 하는 세셔너 파일입니다. 이 파일에 각종 세션함수들이 정의되어 있습니다. 향후 여러분이 사용하고 있는 웹서버의 서버사이드 스크립트를 PHP3에서 PHP4로 업그레이드 되었을 때 이 부분만 삭제하면 나머지 소스코드는 전혀 수정하지 않아도 PHP4 세션 기능을 그대로 사용할 수 있습니다.
PHP3 - 내장 모듈(파일시스템)
[code php;gutter:false] <?php

require("./sessioner/lib.sessioner.php");

session_start();

.
.
.

?> [/code]
PHP4 - 내장 모듈(파일시스템)
[code php;gutter:false] <?php

session_start();

.
.
.

?> [/code]

Posted by 방글24
제공되는 세셔너 함수
세셔너 0.2.3부터는 PHP4에서 제공되는 모든 세션 함수를 제공합니다. 세셔너 함수의 사용방법은 PHP4 세션함수와 동일합니다. 그러니 자세한 내용은 PHP4 Manual을 참조하세요. 여기서는 PHP4 Manual에 없거나 차이나는 부분만 언급합니다.
세션함수 PHP4 세셔너 기능
session_start PHP 4 0.0.1 세션 데이터 초기화
session_destroy PHP 4 0.0.1 세션에 등록된 모든 데이터 제거
session_name PHP 4 0.2.0 세션명 획득/설정
session_module_name PHP 4 0.2.3 세션모듈명 획득/설정
session_save_path PHP 4 0.2.0 세션저장패스 획득/설정
session_id PHP 4 0.2.0 세션ID 획득/설정
session_register PHP 4 0.0.1 현세션에 변수 등록
session_unregister PHP 4 0.0.1 현세션에 등록된 변수 삭제
session_unset PHP 4.0b4 0.2.0 세션변수 해제
session_is_registered PHP 4 0.2.0 등록 여부 확인
session_get_cookie_params PHP 4.0RC2 0.2.2 세션 쿠키 매개변수 획득
session_set_cookie_params PHP 4.0b4 0.2.2 세션 쿠키 매개변수 설정
session_decode PHP 4 0.2.3 문자열을 세션변수화
session_encode PHP 4 0.2.3 세션데이터를 문자열화
session_set_save_handler PHP 4.0b4 0.2.3 사용자정의 세션저장함수 설정
session_cache_limiter PHP 4.0.3 0.2.2 캐시리미터 획득/설정
session_register()
PHP3에서는 가변길이 인수 리스트(variable_length argument list)를 지원하지 않기 때문에 session_register() 함수의 인수는 하나만 지정할 수 있습니다. 여러 개의 세션 변수를 지정하려면 session_register() 함수를 반복하여 사용하세요. 이 방법은 PHP4용 세션함수에서도 사용되는 방법입니다.
[code php;gutter:false] session_register("a", "b"); [/code]
< PHP4용 세션함수만 가능한 방법 >
[code php;gutter:false] session_register("a");
session_register("b"); [/code]
< 세셔너와 PHP4용 세션함수 모두 가능한 방법 >
세셔너 0.2.0 부터는 배열형식으로 여러 개의 세션변수를 등록할 수 있습니다. 이 방법은 PHP4용 세션함수에서도 사용되는 방법입니다.
[code php;gutter:false] session_register(array("a","b")); [/code]
< 세셔너와 PHP4용 세션함수 모두 가능한 방법 >
session_name()
세션명(session name)은 쿠키에 저장된 세션ID를 참조하기 위해 쿠키변수명으로 사용합니다. 세셔너에서는 기본적으로 세션명이 PHP4 세션과 마찬가지로 "PHPSESSID"로 설정되어 있습니다. 버전 0.2.3 이전에서는 세션명이 "PHPSES3ID"였습니다.
[code php;gutter:false] //
// 클라이언트에서 전달해 온 세션ID를 참조하기 위해 세션명 사용
//
$session_id = $HTTP_COOKIE_VARS[$session_name];

//
// 클라이언트로 세션ID를 전달하기 위해 세션명 사용
//
SetCookie($session_name, $session_id, 0, "/"); [/code]
session_name() 함수는 현재 설정되어 있는 세션명을 얻거나 새로운 세션명을 설정할 때 사용할 수 있습니다. 공개된 세션명 "PHPSESSID" 등을 사용하는 것보다는 세션 정보를 조금 더 안전하게 보호할 수 있도록 하려면 세션명을 자신만이 알 수 있는 이름으로 변경하는 것이 바람직합니다. 그래야 세션정보를 훔치려는 장난꾼이 좀 더 고생하겠지요. 훔치려고 작정했으면 언젠가는 훔치기야 하겠지만......
session_name() 함수는 session_start() 또는 session_register() 함수보다 이전에 실행하여야 새로이 지정된 세션명으로 쿠키를 맛있게 굽거나 꺼내옵니다.
[code php;gutter:false] $previous_name = session_name("%&%*)37#^%8Yd^&"); // 나만 아는 세션명으로 변경
$current_name = session_name();
session_start();
echo "The previous session name was $previous_name\n";
echo "The current session name is $current_name\n"; [/code]
session_save_path()
세셔너는 기본적으로 서버의 /tmp 디렉토리에 세션 파일을 저장합니다. 이 때 파일명은 접두어 "sess_"로 시작합니다. /tmp 디렉토리를 살펴보면 아시겠지만 PHP4용 세션함수에서 사용하는 세션 파일명도 "sess_"로 시작하지요. 세셔너 버전 0.2.3 이전에서는 "ses3_"로 시작하였습니다.
서버 디렉토리 /tmp는 서버에 계정을 가지고 있는 모든 회원이 공용으로 사용할 수 있는 임시 디렉토리로 전혀 보안이 되지 않습니다. 즉, 회원이면 누구든지 /tmp 디렉토리에 있는 세션 파일의 내용을 훔쳐볼 수 있습니다. 또한 서로 다른 웹사이트에서 개별적으로 사용하게 되는 세션파일이 뒤썩이게 되지요. 이와 같이 서버를 다수가 공유하여 사용하는 경우에는 세션 파일이 저장되는 디렉토리를 자신만 접근할 수 있는 곳으로 변경할 필요가 있습니다. 이럴 때 필요한 함수가 session_save_path()입니다. 이 함수는 session_start() 또는 session_register() 함수보다 이전에 실행하여야 새로운 저장장소에 세션파일이 저장됩니다.
[code php;gutter:false] $previous_path = session_save_path("/home/hwooky/sessioner");
$current_path = session_save_path();
session_start();
echo "The previous session save path was $previous_path\n";
echo "The current session save path is $current_path\n"; [/code]
세션 파일의 저장장소를 변경할 때는 변경된 디렉토리의 소유자 또는 퍼미션을 재설정해 주셔야 합니다. chown 사용법 또는 chmod 사용법은 리눅스 쉘 Manual을 참조하세요.
session_id()
세셔너는 기본적으로 md5(uniqid(""))에 의해 생성된 32바이트의 세션ID를 이용합니다. 만약 쿠키에 저장하는 장바구니와 같은 정보의 ID를 간단하게 회원ID로 지정한다면 이같은 경우는 쿠키정보를 훔치려는 분들의 수고(?)을 상당히 덜어주게 됩니다. 될 수 있으면 이런 분들이 상상할 수도 없는, 실험해 볼 수도 없는 ID를 사용하는 것이 좋겠지요. md5(uniqid("")) 보다 더 나은 방법이 있다면 그 방법에 의해 세션ID를 지정할 수가 있습니다. 이것을 가능하게 하는 함수가 session_id()입니다.
session_id() 함수는 session_start() 또는 session_register() 함수보다 이전에 사용해도 되고 이 후에 사용해도 관계없습니다. 그러나 PHP4 세션함수의 경우를 보면 session_start() 또는 session_register() 함수보다 뒤에서 사용하게 되면 쓸모없는 세션파일이 또 하나 생겨서 session save path 디렉토리에 쓰레기가 쌓이게 됩니다. 그러니 가능하면 session_name()와 session_save_path() 함수와 같이 session_start() 또는 session_register() 함수 이전에 사용하는 것이 좋습니다.
[code php;gutter:false] $previous_id = session_id("1234567890"); // 세션ID를 이렇게 지정하면 안되겠죠?
$current_id = session_id();
session_start();
echo "The previous session id was $previous_id\n";
echo "The current session id is $current_id\n"; [/code]
session_unset()
session_destroy() 함수를 사용하여 세션 데이터를 지워주더라도 전역변수로 저장되어 있는 세션변수는 계속 남아 있게 됩니다. 버전 0.0.3 이전에서는 이러한 세션변수를 없애기 위해서는 unset()을 이용하거나 아래와 같이 널문자로 지워주어야 합니다.
[code php;gutter:false] session_destroy();
$bank = ""; // $bank가 현재 세션에 등록된 변수라고 가정하면 [/code]
그러나 버전 0.2.0에서는 session_unset() 함수를 이용하여 세션변수를 삭제할 수 있습니다. session_unset() 함수는 전역변수로 남아있는 세션변수를 깨끗이 없애주는 함수입니다. 주의할 것은 session_destroy() 함수를 사용하기 전에 지정해 주어야 한다는 것입니다. session_unset() 함수는 현재 세션에 등록된 정보를 이용하여 삭제하여야 하는데 session_destroy() 함수를 실행하면 현재 세션에 등록된 정보가 모두 삭제되어 버리기 때문에 session_unset() 함수가 정상적으로 동작하지 않습니다.
[code php;gutter:false] session_unset(); // 우선 세션변수(전역변수)를 완전히 삭제
session_destroy();// $HTTP_SESSION_VARS[], 세션파일 등 세션데이터를 삭제 [/code]
session_set_save_handler()
세션데이터를 파일시스템이 아닌 데이터베이스와 같은 다른 저장 모듈을 이용하기 위해서는 사용자가 세션 핸들러 함수를 정의하고 이 함수들을 session_set_save_handler() 함수를 이용하여 등록하여야 합니다. 세셔너에서는 버전 0.2.3부터 session_module_name()와 session_set_save_handler()를 제공합니다.
PHP4 세션함수는 디폴트로 세션 데이터를 읽고 저장하기 위한 저장 매체로 파일시스템(모듈명="files")을 사용합니다. 파일시스템을 이용한 방법은 공유메모리를 이용한 방법(모듈명="mm")과 함께 PHP4에 내장하여 제공되고 있습니다. 공유메모리에 의한 세션 구현은 제가 공유메모리에 대한 경험이 없어 세셔너에서는 제공되지 않습니다. 향후 기회가 되면 세셔너에서도 공유메모리를 이용한 세션을 구현해 보고 싶습니다. PHP4에서 "mm" 모듈을 디폴트로 사용하시려면 PHP.INI 파일의 session.save_handler 지시자를 이용하여 "mm" 모듈로 변경해 보세요(저는 사용해 보지 못함).
"files"와 "mm" 모듈은 PHP4에 내장되어 제공되기 때문에 사용하기가 편하지만 나름대로 단점도 가지고 있어 보통 데이터베이스를 이용하여 세션을 구현하는 경우가 많습니다. PHP4에서 제공되지 않는 저장 매체를 이용하기 위해서는 session_set_save_handler() 함수를 이용하게 됩니다. session_set_save_handler() 함수는 새로운 저장매체로부터 세션 데이터를 읽고 저장하기 위한 사용자 정의 함수를 인자로 받게 됩니다. 이와 같이 사용자가 직접 정의하여 세션을 구현하는 방법(모듈명="user")을 이용하면 세션 데이터를 다양하게 활용할 수 있고, 다양한 정보를 end-user에게 제공할 수 있습니다.
session_set_save_handler() 함수를 이용하여 세션 데이터의 저장 매체(MySQL 등)를 확장하는 방법에 대하여는 관련 웹사이트를 검색하시면 부지기수로 얻을 수 있으니, 관심있는 분은 찾아보세요. 이러한 문서들을 참고하시거나 제가 제공하는 세셔너핸들러를 참조하시면 여러분도 그리 어렵지 않게 새로운 저장 매체로 변경할 수 있을 것입니다.
session_module_name()
현재의 세션모듈명을 얻거나 새로운 모듈로 설정할 수 있는 함수입니다. 내장모듈("files", "mm")로 변경할 때는 모듈명을 입력인자로 지정하면 되지만 외장모듈("user")로 변경할 때는 session_module_name() 함수를 사용할 필요가 없으며 session_set_save_handler() 함수를 이용하여 사용자정의 세션저장함수를 재설정하여 주세요. 그러면 현재 모듈명이 "user"로 자동 변경됩니다. 또한 session_destroy() 함수를 실행하면 이전에 사용되었던 사용자정의 세션저장함수에 대한 정보가 사라져 버리기 때문에 이때도 session_set_save_handler() 함수를 이용하여 사용자정의 세션저장함수를 재설정하여 주세요. 세셔너가 공유메모리를 이용한 "mm" 모듈을 제공하지 않기 때문에 session_module_name()을 이용하여 새로운 모듈로 설정할 일이 없을 것입니다. 사실 session_module_name()에 대한 메커니즘에 대하여는 저도 정확히 파악하고 있지 못하기 때문에 상황에 따라 문제가 발생할 수 있습니다.
[code php;gutter:false] $mn1 = session_module_name();
session_set_save_handler("open", "clase", "read", "write", "destroy", "gc");
$mn2 = session_module_name();

session_start();

if ($init) {
session_unset();
session_destroy();
$mn3 = session_module_name();
session_set_save_handler("open", "clase", "read", "write", "destroy", "gc");
$mn4 = session_module_name();
} [/code]
session_encode()와 session_decode()
인코딩은 현 세션에 등록되어 있는 세션 데이터(session_register 함수로 등록한 세션변수 및 세션변수에 할당된 값)를 세션파일(또는 세션디비 테이블)에 저장되는 형태의 문자열(예를 들어 access_userid|s:6:"sikkal";access_passwd|s:4:"1234";result_id|b:0;)로 변환시키는 함수입니다.
디코딩은 access_userid|s:6:"sikkal";access_passwd|s:4:"1234";result_id|b:0;와 같이 저장된 문자열을 가지고 세션 데이터(세션페이지에서 사용가능한 변수 형태)로 변환하는 함수입니다.
PHP4와 세셔너의 외부저장매체(파일 등)에 저장된 세션데이터는 하나의 문자열 구조이며, 반면에 메모리에 저장된 세션데이터는 각각의 변수마다 따로따로 저장됩니다. 이와 같이 세션데이터는 그 위치에 따라 서로 다른 구조를 가지고 있어서 상호간의 데이터를 변환할 필요가 있습니다. 이 역할을 하는 것이 session_encode()와 session_decode() 함수입니다. 이 함수들은 사용자가 외부저장매체에 저장되어 있는 문자열 구조의 세션데이터를 직접 다룰 필요가 있을 때에 요긴하게 사용할 수 있을 것입니다. 그런데 PHP4와 세셔너에서 외부저장매체(파일 등)에 저장된 세션데이터를 비교하면 양쪽의 구성 내용이 서로 상이하여 호환성이 없습니다. 사실 세션이라는 것이 각 사용자별, 사용시간별로 서로 독립적으로 작용하는 것이기 때문에 문자열 구조의 세션데이터를 동일한 구조로 설계할 필요가 없다고 보여집니다. 세셔너 자체에서도 ver 0.2.0부터 문자열 구성 내용이 이전 버전과 달리 변경되었습니다(버그때문에). 그러나 만약 문자열 구조의 세션데이터를 직접 다루어야 하는 경우라면 session_encode()와 session_decode() 함수를 이용하여야 하는데 세셔너 함수에서 이를 제공하게 되면 PHP4와 세셔너함수 사이에 호환성이 없어지기 때문에 세셔너를 제작하게 된 목적이 애매하게 되어 제공할 수가 없네요. 세셔너 0.2.3부터 제공되는 session_encode()와 session_decode() 함수는 제한적으로 PHP4 세션함수와의 호환성을 유지합니다. 저장모듈에 저장된 문자열 형태의 세션데이터를 직접 다루지 않고 세셔너함수를 통해서만 세션데이터를 다룬다면 호환성에 전혀 문제가 없습니다. 제가 Tip&Tech&Download 게시판에 공개한 "로그인 사용자 리스트 구하는 방법(세션함수 이용)"과 "동일ID로 다중접속하려는 것을 방지하는 방법(세션함수 이용)"을 보시면 PHP4와 호환성을 유지하면서 session_encode()와 session_decode() 함수를 어떻게 사용할 수 있는지 알 수 있습니다.
당장 세셔너를 PHP4와 동일한 구조로 설계하지 않았느냐고 궁금해 하실지도 모르겠으나 PHP4와 동일한 구조로 설계하는 것이 간단하게 몇 줄의 코딩으로 해결될 것이 아니기 때문이지요. 즉, 코드가 훨씬 복잡해집니다. 소스 코드를 가능하면 간결하게 하고자(사실은 제 실력이 딸려서) PHP4와는 다른 구조를 택하게 되었지요.
"http://www.codelib.co.kr"의 HOME 》Class & Func 》Session&Cookie 에 보면 "session var names (세션변수추출) 0.2" 라는 공개자료가 있는데 이를 이용하여 약간만 수정하면 session_decode() 함수를 구현할 수 있을 것입니다. 관심있는 분은 참조하시길......
session_encode()와 관련된 또 다른 문제는 메소드와 관련된 것입니다. 세션 변수값을 파일과 같은 저장 매체에 저장하려면 serialize() 함수로 직렬화시켜야만 합니다. PHP4용 세션함수도 내부적으로 이 함수를 사용하지요. 그런데 객체의 경우, 정확하게 이야기하면 메소드의 경우는 PHP4부터 지원됩니다. 따라서 PHP3에서는 메소드를 세션에서 사용할 수가 없습니다. 이 문제는 세셔너에서도 동일하게 적용됩니다. 즉, PHP3에서 동작되는 세셔너는 메소드를 세션 관리할 수 없습니다. serialize() 함수와 객체에 관련된 기술적인 정보는 "핍클래스 홈페이지 >> 객체에 관련된 정보 >> Serialize/Unserialize" 메뉴를 참조하세요.
session_get_cookie_params(), session_set_cookie_params()
(0.2.4 이하 버전에 버그 존재 -> 0.2.5에서 수정)세셔너가 세션ID를 전달하기 위해 쿠키를 이용하기 때문에 내부적으로 SetCookie() 함수를 사용하게 됩니다. 여러분이 아시다시피 SetCookie() 함수에 입력되는 매개변수로는 총 6개가 있습니다. 이 중에 첫번째 매개변수가 쿠키명이고, 두번째 매개변수가 쿠키값입니다. 나머지 4개가 쿠키와 관련된 정보들인데 마지막 매개변수인 보안 정보를 제외하고는 session_get_cookie_params()와 session_set_cookie_params() 함수를 통해 3가지 매개변수에 관련된 정보를 획득/설정할 수 있습니다. 이 정보는 쿠키의 만료 시간, 쿠키의 유효 디렉토리, 쿠키의 유효 도메인 정보입니다. SetCookie() 함수와 관련된 정보는 관련 웹사이트 또는 서적을 참조하시기 바랍니다.
[code c;gutter:false] void session_set_cookie_params(int lifetime [, string path [, string domain]])
int setcookie(string name
, string value
, int expire
, string path
, string domain
, int secure) [/code]
여기서 한가지 주의할 점이 있습니다. session_set_cookie_params() 함수의 첫번째 매개변수 lifetime과 setcookie() 함수의 세번째 매개변수 expire는 시간을 나타내는 것은 같지만 의미하는 바는 차이가 납니다. session_set_cookie_params() 함수의 첫번째 매개변수 lifetime은 쿠키의 생존시간을 초로 나타낸 것이며, 반면에 setcookie() 함수의 세번째 매개변수 expire는 타임스탬프로 지정한 것입니다. 예를 들어 현재시간을 기준으로 1시간 후까지 유효한 쿠키를 생성할 때 세션함수와 setcookie() 함수에 지정하여야 하는 값은 아래와 같습니다.
[code php;gutter:false] session_set_cookie_params(3600);
setcookie("mycookie", "cookie_value", time()+3600); [/code]
session_set_cookie_params() 함수에서는 위와 같이 현재시간을 기준으로 쿠키가 생존하는 시간을 초로 지정하게 됩니다. 그러면 세션함수 내부에서 쿠키를 생성할 때 setcookie("mycookie", "cookie_value", time()+$lifetime) 와 같이 현재시간을 첨부하여 setcookie() 함수로 넘기게 됩니다. 이러한 내용은 PHP4 소스코드 session.c에 정의된 php_session_send_cookie()를 살펴보면 알 수 있습니다. 세셔너 0.2.4 이하의 버전에서는 이 문제와 관련된 버그가 있었습니다.
참고로 setcookie() 함수에서 지정하여야 하는 타임스탬프는 1970년 1월 1일 이후 시간을 초로 표시한 시간입니다. 쿠키 매개변수와 관련하여 세셔너에서 기본으로 설정되어 있는 값은 아래와 같습니다.
매개변수명 기본값 동작
쿠키의 생존시간 0 사용자가 브라우저를 종료할 때 쿠키가 없어짐
쿠키의 유효 디렉토리 "/" 서버상에 있는 모든 디렉토리
쿠키의 유효 도메인 "" 쿠키를 설정한 서버의 도메인
위에서와 같이 세션 ID는 쿠키로 저장되는데 이 쿠키 변수명은 PHPSESSID입니다. 반면에 PHP4용 세션함수에서는 PHPSESSID입니다.
session_cache_limiter()
아마도 제일 머리 아픈 것 중에 하나가 캐시(cache) 문제일 것입니다. 다양한 사용 환경에서 다양하게 발생하는 캐시 문제는 해결하기도 쉽지 않습니다. 자신이 캐시에 대하여 완벽하게 대처했다고 생각했어도 막상 실험해보면 생각한대로 동작하지 않는 것이 바로 캐시이지요. 그래서 각종 Q&A 게시판에 단골로 등장하게 됩니다. session_cache_limiter() 함수를 구현하기 위해서는 header() 함수를 이용하면 되겠지만 캐시에 관련된 주제가 그리 간단한 것이 아니라서 접근하기가 매우 조심스럽습니다. 캐시 문제에 대하여는 앞으로 시간이 되면 하나의 주제(메뉴)로 다루어야 될 것 같습니다. 그 후에 이 함수 구현에 대하여 고려하는 것이 순서같네요. 제 Q&A 게시판에서도 캐시 문제로 올려진 자료가 있으니 관심있는 분은 검색하여 보시기 바랍니다.
(추가) 세셔너함수 0.2.2부터 session_cache_limiter() 함수를 제공합니다. 캐시리미터에 관한 기술적인 정보는 제 홈페이지 "후키라이브러리>>캐시리미터" 메뉴를 보시면 상세히 기술되어 있습니다.
예약어
예약된 클래스명
세셔너함수에서 클래스를 정의할 때 사용하고 클래스명들은 아래와 같습니다.
sessStaticAbstract : 추상화된 클래스 정의(최상위 클래스)
sessStaticVars : 세션ID 및 전역변수를 관리하기 위한 클래스
sessStatic : 모든 세셔너가 공용으로 사용된 클래스의 마지막 파생 클래스로
내장 모듈("files")이 정의되어 있는 클래스
위의 모든 클래스는 sessStaticAbstract를 최상위 클래스로 하여 순차적으로 상속받아 정의되어 있습니다.
예약된 전역변수
세셔너 내부에서 사용하기 위해 예약된 객체변수 $sessStatic는 아래와 같이 세셔너 파일 내에서 기본적으로 생성되어 있는 객체입니다.
[code php;gutter:false] $sessStatic = new sessStatic; [/code]
예약된 전역함수
세셔너 내부에서 정의되어 있는 클래스에서 소멸자를 사용할 수 있도록 sessDestructorExec()라는 함수가 아래와 같이 정의되어 있습니다.
[code php;gutter:false] function sessDestructorExec() {
global $sessStatic;
$destructor = "_".$sessStatic->Classname;
$sessStatic->$destructor();
} [/code]

Posted by 방글24
세셔너는 PHP3용 세션입니다. 세셔너는 방문자별로 세션을 생성하여 각 방문자에 대한 정보를 별도로 저장할 수 있도록 하기 위해 작성되었습니다.
세셔너?
세셔너는 PHP3에서 동작되는 세션함수
session_start()와 같은 세션 함수가 PHP4 스크립트부터 제공되기 시작했다는 것은 알고 계실겁니다. 세션 함수가 PHP 스크립트에 내장되어 있기 때문에 인증, 퍼미션, 사용자 로그인에 따른 세션값, 페이지 관리 등을 보다 빠르고 편하게 할 수 있게 되었습니다. 문제는 현재(2000년10월 현재)까지는 아직 PHP3 스크립트로 동작되는 웹서버가 많이 있다는 것이지요. 현재 PHP3에서 세션관리를 하기위해 쿠키를 이용하거나 아니면 PHPLIB와 같은 별도의 라이브러리를 사용하여 웹사이트를 운영하고 있지만 이러한 방법과 PHP4 세션 함수는 호환성이 없으며, 향후 PHP4로 바뀌게 되면 다시 작성하여야 합니다. 세셔너는 PHP4의 세션함수의 인터페이스를 그대로 가져와 PHP3에서 동작하도록 작성된 것입니다. 따라서 현재 웹호스팅받고 있는 서버가 아직 PHP3를 돌리고 있다면 세션관리를 위해 세셔너를 사용한다면 향후 PHP4로 바뀌더라도 여러분의 코드를 거의(세셔너를 인클루드하는 부분을 제외하고는 전혀) 손대지 않고도 업그레이드할 수 있습니다.
세션ID
PHP4에서의 세션함수에서는 세션ID 관리를 사용자 시스템의 쿠키로 저장될 수도 있고, URL의 매개변수로 전달될 수도 있습니다. 그러나 세셔너함수에서는 현재(ver 0.2.0)까지는 쿠키 만을 지원하고 있습니다. URL 매개변수로 세션ID를 전달하기 위해서는 약간의 자바 스크립트 코드 또는 FORM 태그를 사용하여야 하는데...... PHP4의 세션함수에서처럼 스크립트 자체가 지원한다면 모를까 매 페이지마다 이런 코드를 삽입하여야 한다는 것이 다소 부담스럽네요. 향후 필요하다고 생각되면 쉽게 추가할 수 있도록 소스 코드를 모듈화 시켜놓았으니 필요한 분은 우선 이 부분을 수정하여 사용하세요. 세션ID를 관리하는 모듈은 "sessStaticVars"라는 클래스이며, 이 클래스에는 아래와 같이 prvGetID() 멤버가 포함되어 있습니다. 이 함수만 수정하면 됩니다.
[code php;gutter:false] class sessStaticVars extends sessStaticAbstract {
.
.
.
function prvGetID($name, $cookie) {
if (!($id = $GLOBALS["HTTP_COOKIE_VARS"][$name])) {
$id = md5(uniqid(""));
SetCookie($name, $id, $cookie["lifetime"], $cookie["path"], $cookie["domain"]);
}
return $id;
}
.
.
.
} [/code]
prvGetID() 멤버는 클라이언트로부터 서버로 세션ID를 전달하는 역할을 하며, 만약 현재 쿠키 이름으로 전달되는 세션ID가 없다면 setcookie() 함수를 이용하여 새로운 쿠키를 만들게 됩니다. 이 과정에서 서버로부터 클라이언트로 세션ID를 전달하게 됩니다. prvGetID() 멤버의 입력 인자로 전달되는 $name에 저장되어 있는 세션명(기본값으로 "PHPSESSID"가 설정되어 있음)을 이용하여 세션ID를 받아 되돌려 줍니다. 두번째 입력 인자인 $cookie는 연관배열이며, 배열요소에는 $cookie["lifetime"], $cookie["path"], $cookie["domain"]가 있으며 각각 쿠키의 만료 시간, 쿠키의 유효 디렉토리, 쿠키의 유효한 도메인 정보를 의미합니다. URL 매개변수를 이용할 때는 대부분 필요없는 정보가 될 것입니다. prvGetID() 멤버에서는 반드시 세션ID를 되돌려 주어야 세셔너의 다른 부분이 정상적으로 동작합니다.
세션변수의 복구
PHP4에서는 php.ini에 있는 지시자 track_vars, gpc_globals 또는 register_globals의 설정 상태에 따라 세션변수들이 어떻게 복구되는가가 결정됩니다.
지시자 상태 복원수단 초기값
track_vars ON 연관배열 $HTTP_STATE_VARS 또는
$HTTP_SESSION_VARS
O
OFF - -
gpc_globals 또는
register_globals
ON 전역변수 O
OFF - -
gpc_globals 또는 register_globals는 PHP4 버전에 따른 차이로 현재(2000.12.21) 기준으로 최종버전인 4.0.3(12월19일 4.0.4가 발표되었지만 12월21일 현재 Manual의 업데이트가 이루어지지 않아 4.0.4는 제외)에서는 register_globals가 사용되고 있습니다. 같은 이유로 4.0.3에서는 $HTTP_STATE_VARS 대신에 $HTTP_SESSION_VARS가 사용되고 있습니다.
세셔너 0.2.0부터는 전역변수 및 $HTTP_SESSION_VARS를 모두 지원합니다. 따라서 보안을 좀더 고려한다면 session_start() 함수를 실행한 직후에 전역변수보다는 $HTTP_SESSION_VARS에 저장된 세션변수를 가지고 복구하는 것이 바람직하다고 할 수 있습니다. 아래에는 이에 대한 예입니다.
[code php;gutter:false] <?php

require("./sessioner.php");
//
//앞페이지에서 세션변수 $a가 등록되었다고 가정합니다.
//
session_start();

$a = $HTTP_SESSION_VARS["a"]; // 보안을 위해 추가된 부분
$a++;
echo $a;

?> [/code]
세셔너에서 세션변수에 관련하여 한가지 주의할 점은 $HTTP_SESSION_VARS를 가지고 변경된 값은 다음 페이지에서 업데이트되지 않습니다. 따라서 세션변수 값을 변경하여 다음 페이지로 전달할 때는 반드시 전역변수를 이용하여 값을 변경하여 주십시요. PHP4 공식 문서에서는 이와 관련하여 애매한 입장을 보이고 있는 것 같습니다. 즉, 아직 확정되지 않은 인터페이스라고 생각하시는 것이 편할 것입니다. 향후 명확한 입장이 나오겠죠. 사실 둘 다(전역변수 및 $HTTP_SESSION_VARS) 업데이트가 가능하게 되면 세션값이 애매해지는 결과가 나오게 되지요. 아마 곤란할 것입니다.
[code php;gutter:false] //
// 다음 세션 페이지에 가면 count값이 증가되어 있지 않음
//
$HTTP_SESSION_VARS["count"]++;

//
// 다음 세션 페이지에 가면 count값이 증가되어 있음
//
$count++; [/code]
(세션 변수 처리 개정) 이 문제가 PHP 4.1.0으로 업그레이드되면서 해결되었습니다. register_globals 설정을 ON으로 하게되면 $HTTP_SESSION_VARS['foo']와 $foo가 동일한 기억장소를 접근할 수 있도록 참조(reference)로 처리되었습니다. 명쾌한 해결방법이네요.
쿠키 사용을 위한 PHP 설치 옵션
세셔너가 세션ID 관리를 사용자 시스템의 쿠키로 저장하기 때문에 쿠키로부터 세션ID 값을 읽어드려야 합니다. 그런데 쿠키로부터 전달받은 값이 서버 설치 옵션에 따라 전역변수로 받을 수도 있고 전역배열변수 $HTTP_COOKIE_VARS[]로 받을 수도 있습니다. 세셔너함수에서는 내부적으로 $HTTP_COOKIE_VARS[]를 이용하여 세션ID 값을 전달받도록 작성되어 있습니다.
그런데 $HTTP_COOKIE_VARS[]을 언제나 사용할 수 있는 것은 아니고, PHP를 서버에 설치할 때 지정한 옵션에 따라 달라지지요. $HTTP_COOKIE_VARS[]와 관련된 서버 세팅은 두가지입니다. 하나는 소스 컴파일할 때 "--enable-track-vars"라는 설정옵션을 지정하여야 합니다. 두번째는 "--enable-track-vars"를 지정하여 소스 컴파일을 하더라도 php.ini 파일에 있는 track_vars 지시자에 의해 $HTTP_COOKIE_VARS[]를 Enable 할 수도 있고 Disable 할 수도 있습니다. 아래와 같이 track_vars 지시자를 Enable 하십시요.
php.ini의 내용중
================

track_vars = On ; enable the $HTTP_*_VARS[] arrays, where * is one of
; ENV, POST, GET, COOKIE or SERVER.
만약 여러분의 서버가 "--enable-track-vars"를 지정하여 소스 컴파일을 할 상황이 되지 않는다면 세셔너의 소스를 약간 수정하여 사용하시기 바랍니다. 세셔너 소스코드를 살펴보면 아래와 같은 곳이 있습니다.
[code php;gutter:false] class sessStaticVars extends sessStaticAbstract {
.
.
.
function prvGetID($name, $cookie) {
if (!($id = $GLOBALS["HTTP_COOKIE_VARS"][$name])) {
$id = md5(uniqid(""));
SetCookie($name, $id, $cookie["lifetime"], $cookie["path"], $cookie["domain"]);
}
return $id;
}
.
.
.
} [/code]
위의 코드에서 $GLOBALS["HTTP_COOKIE_VARS"][$name]을 $GLOBALS[$name]으로 수정하세요. 전역배열변수 $HTTP_COOKIE_VARS[] 대신에 전역변수를 이용하는 방법입니다. 보안 측면에서 바람직하지는 않지만 찬밥 더운밥 가릴 수 없는 분들은 이렇게라도 사용하시기 바랍니다.
보안 문제로 전역변수를 사용하고 싶지 않다면 PHP_COOKIE_VARS를 사용하시기 전에 문서 최상단에 아래와 같이 php_track_vars 지시자를 사용하세요.
[code php;gutter:false] <?php_track_vars?>
<?php
.
.
.
?> [/code]
주의할 점은 php_track_vars 지시자가 PHP3에서만 제대로 동작되며, PHP4부터는 php_track_vars 지시자를 사용하지 않습니다. PHP4에서 track_vars 의 설정값이 "1"일 때에 php_track_vars 지시자를 사용하게 되면 아래와 같은 에러가 발생합니다.
Warning: <?php_track_vars?> is no longer supported
- please use the track_vars INI directive instead in ...... on line ???
PHP 4.0.3부터는 track_vars가 자동적으로 (항상) ON 상태입니다. 따라서 PHP 4.0.3부터는 php.ini의 track_vars의 설정 상태에 관계없이 php_track_vars 지시자를 사용하면 무조건 위와 같은 에러가 발생합니다. 하지만 세셔너가 PHP3에서만 사용되니까 관계없겠죠?
세션데이터 저장매체
PHP4 세션 핸들링은 기본적으로 임시디렉토리("/tmp")에 세션데이터를 파일형태로 저장하게 됩니다. 웹사이트 규모가 커지게 되면 파일형태로 세션데이터를 관리하는 것은 적절하지 않을 수도 있습니다. 이와 같이 내장된 세션 핸들링 방법 대신에 데이터베이스와 같은 저장매체를 이용한 세션 핸들링을 사용자가 정의하여 사용할 수 있습니다.
세셔너는 PHP4 세션에 해당하고, 여기에 내장된(기본적으로 제공된) 세션 핸들링을 이용하면 PHP4 세션과 마찬가지로 임시디렉토리("/tmp")에 세션데이터를 파일형태로 저장하게 됩니다.
세셔너 0.2.3부터 제공되는 세셔너핸들러는 세셔너와 PHP4 세션함수 모두에서 동일하게 적용되는 사용자 정의 세션 핸들링입니다. 세셔너핸들러 0.0.1에는 파일시스템용, 데이터베이스용, DBM/DBA용이 제공되고 있으며 자세한 내용은 뒷장 "세셔너핸들러" 메뉴를 참조바랍니다.

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