방문자공용변수 라이브러리와 애플리케이셔너의 공통점
방문자공용변수 라이브러리와 애플리케이셔너 모두 MS의 ASP에서 사용되는 Application 객체에서와 같이 웹애플리케이션에서 모든 방문자가 공유하게 되는 변수(즉, 방문자공용변수)를 사용할 수 있게 해 줍니다.
변수의 사용범위(scope)
방문자공용변수 라이브러리에서는 변수를 pageglobal, pagemember, pagestatic 키워드를 사용하여 페이지 단위로 사용범위(scope)를 지정할 수 있도록 작성되어 있지만, 애플리케이셔너에서는 변수의 사용범위를 페이지 단위로 지정할 수 없으며 그 사용범위가 모든 페이지에 걸쳐있게 됩니다. 이는 마치 방문자공용변수 라이브러리에서 변수를 pageglobal로 설정한 것과 같습니다.
변수의 정보 은폐(information hiding)
편리함을 생각한다면 애플리케이셔너가 우수하겠지만 정보 은폐라는 측면에서 보면 방문자공용변수 라이브러리가 훨씬 뛰어나다고 할 수 있습니다. 예를 들면, 방문자공용변수 라이브러리에서는 동일한 이름의 변수명을 가지고 복수의 페이지에서 서로 다른 의미로 사용할 수 있으나, 애플리케이셔너에서는 이것이 불가능하지요. 개발자가 알아서 각 페이지에서 사용하고 있는 애플리케이션 변수명에 대하여 유지 관리할 책임이 따르게 됩니다.

Posted by 방글24
클래스 구성
class.message.php : 에러 메시지 처리 클래스
class.mysql.php : MySQL 데이터베이스 관리 클래스
class.webpage.php : 웹페이지 관리 클래스
class.userglobal.php : 방문자공용변수 관리 클래스
PUBLIC 멤버함수
방문자공용변수 사용범위 지정자 관련 함수
[code php;gutter:false] function webpage_static_id($pageid="");
function webpage_member_id($pageid=""); [/code]
방문자공용변수 충돌 회피 관련 함수
[code php;gutter:false] function uglobal_lock();
function uglobal_unlock(); [/code]
방문자공용변수 처리(읽기, 쓰기, 삭제) 관련 함수
[code php;gutter:false] function uglobal($pageid, $name, $value="");
function uglobal_unset($pageid, $name); [/code]
예제 파일 구성
아래의 예제는 실제 홈페이지에 적용할 수 있는 완성된 프로그램이 아니고, 단지 웹애플리케이션 변수가 어떻게 동작하는지를 보여주기 위한 실험적인 프로그램이니 참고만 하세요.
class.message.php : 에러 메시지 처리 클래스
class.mysql.php : MySQL 데이터베이스 관리 클래스
class.webpage.php : 웹페이지 관리 클래스
class.userglobal.php : 방문자공용변수 관리 클래스

inc.baseinfo.php : 데이터베이스 호스트명, 사용자명, 비밀번호, 디비명을 얻기 위한 함수가 정의
common.php : 모든 페이지에서 공용으로 쓰이는 변수와 함수가 정의된 인클루드 파일
uglobal.php : 방문자공용변수 동작실험 시작 페이지
page1.php : 페이지 #1
page2.php : 페이지 #2
page3.php : 페이지 #3

Posted by 방글24
방문자공용변수란?
페이지 내에서 사용할 수 있는 변수를 사용범위(scope)를 가지고 분류하면 전역변수(global), 정적변수(static), 클래스의 데이터멤버(var), 지역변수 등이 있습니다. 이 중에 지역변수는 논외로 하고 나머지 전역변수, 정적변수, 데이터멤버는 페이지 내에서만 사용되는 변수(이하 "일반변수")들이며 따라서 다른 페이지로 이동되면 그 값이 소멸되기 때문에 페이지 상호간에 그 값이 전달, 유지되지 않습니다. 반면 방문자공용변수는 다른 페이지가 이동하더라도 그 값을 계속 유지된 상태로 사용할 수 있습니다.
다른 한편, 페이지에 접근하는 방문자 측면에서 볼 때의 변수의 사용범위를 살펴보면, 여러 방문자가 동일한 페이지에 접근하여 이 페이지에 있는 동일한 변수에 접근하더라도 각 방문자가 인식하는 변수는 서로 전혀 상관이 없습니다. 사용범위가 단일 방문자로 제한되지요. 이를 위한 변수가 세션변수인데 이에 대한 것은 PHP3에서도 이미 많이 다루어져 있고 PHP4에서는 기본 내장함수로 제공되고 있으므로 이를 이용하면 될 것입니다.
위에서 살펴본 바와 같이 현재의 일반변수는 그 사용범위가 단일페이지와 단일방문자로 정해져 있으며, 단일페이지 내에서도 그 값이 유지되지 않습니다. 따라서 웹 상에서 전체페이지, 전체방문자가 공유해야 하는 데이터를 다루기에는 적합하지 않습니다. 이러한 제한을 극복하고자 현재 다른 매체를 이용하여(파일, 공유메모리, 데이터베이스 등) 공유하고자 하는 데이터를 페이지 및 방문자 상호간에 주고받지요. 예를 들어 페이지에 접근하는 방문자수를 보여주기 위한 카운터를 보면, 이 카운터는 실제로는 단일페이지에서 사용하지만 전체방문자가 공유하는 데이터라고 할 수 있습니다.
이와 같이 전체 또는 복수페이지가 공유해야 하는 데이터는 아마 수도 없이 많이 있을 것입니다. 이는 사용범위가 전체 또는 복수페이지 확장할 수 있는 변수의 존재가 필요하다는 것을 의미하지요. ASP에서도 Application 객체를 가지고 모든 방문자들에게 읽히고 전체페이지에서 다루어지는 변수를 정의하여 사용할 수 있지요. 여기서는 좀더 발전하여 ASP Application에서 정의할 수 있는 전체페이지 & 전체방문자에 적용되는 변수뿐만 아니라 임의로 정하는 복수페이지, 단일페이지를 서로 혼합되어 적용할 수 있는 방문자공용변수를 정의하고, 선언하고, 사용하고, 삭제하기 위한 기능을 하는 함수를 클래스를 이용하여 작성하였습니다.
방문자공용변수 사용범위(scope)
방문자공용변수 사용범위 지정자에 지정할 수 있는 키워드에는 pageglobal, pagemember와 pagestatic이 있습니다.
pageglobal : 모든 웹페이지에서 사용하는 변수를 지정할 때 사용하는 지정자로 데이터베이스 테이블 pageid 필드에 "pageglobal" 라고 저장됩니다.
pagemember : 정해진 복수 페이지에서만 사용되는 변수를 생성하기 위한 지정자로 데이터베이스 테이블 pageid 필드에는 클래스 clsWebpage의 멤버함수인 webpage_member_id()로 지정된 현재 페이지의 멤버 ID가 저장됩니다.
pagestatic : 지정된 한 장의 웹페이지에서만 접근할 수 있는 변수를 지정할 때 사용하는 지정자로 데이터베이스 테이블 pageid 필드에는 클래스 clsWebpage의 멤버함수인 webpage_static_id()로 지정된 현재 페이지의 고유한 "페이지 ID"값이 저장됩니다.
방문자공용변수 값 유지관리 메커니즘
데이터베이스에 저장되어 있는 방문자공용변수들은 uglobal_lock() 멤버함수가 실행될 때 테이블로부터 그 값을 읽어들여 방문자공용변수값을 복원시킵니다. 반대로 uglobal_unlock() 멤버함수가 실행될 때 메모리 상에 데이터를 읽어 데이터베이스 테이블에 저장시킵니다.
방문자공용변수를 위한 데이터베이스 설계
방문자공용변수들은 페이지 이동에 관계없이 그 값을 계속 유지할 수 있어야 하는데, 값을 유지하기 위해 페이지 종료할 때 MySQL 데이터베이스의 정해진 테이블에 방문자공용변수 값을 저장한 후 다른 페이지를 읽어들일 때 데이터베이스 테이블로부터 저장된 값을 읽어 들여와 해당 방문자공용변수의 값을 원래대로 복원시켜줍니다. 이 때 사용되는 데이터베이스 테이블명이 저장된 데이터멤버에 접근할 수 멤버함수는 uglobal_db_table() 입니다. 테이블명의 초기 값은 "admin_uglobal"로 설정되어 있습니다. 그리고 테이블 스키마는 아래와 같습니다.
[code sql;gutter:false] CREATE TABLE 테이블명 (
pageid varchar(32) not null,
value blob not null,
PRIMARY KEY (pageid)
); [/code]
필드명 pageid : "pageglobal", "페이지 멤버 ID" 또는 "페이지 ID"가 저장됩니다.
필드명 value : 변수명과 변수 값이 저장됩니다.

Posted by 방글24
방문자공용변수 개요
MS의 ASP에서 사용되는 Application 객체에서와 같이 웹애플리케이션에서 모든 방문자가 데이터를 공유할 수 있는 변수를 등록하여 다룰 수 있도록 작성된 프로그램입니다.
웹애플리케이션?
웹애플리케이션은 웹 상에서 실행되는 파일들로 구성되며, 일반적으로 같은 디렉토리 상에 저장되어 있는 파일로 구성됩니다. 이러한 웹애플리케이션에서 동작되는 변수는 모든 사용자들이 공유하게 됩니다. 이와 같이 웹애플리케이션에서 동작되는 변수(이하 방문자공용변수)들은 여러 사람이 공유하다보니 단일 사용자만 사용하는 변수(정적변수, 전역변수, 세션변수 등)와는 다소 그 특성이 다르다고 할 수 있습니다.
방문자공용변수로 사용되는 가장 대표적인 경우가 카운터라고 할 수 있습니다. 현재 PHP에서 카운터를 구현할 때에 데이터베이스 테이블을 이용하거나 아니면 파일 액세스를 통해 그때그때 상황에 따라 개발하고 있어 다소 번거로운 면이 있다고 볼 수 있습니다. 만약 모든 사용자가 공유할 수 있는 방문자공용변수를 서버 사이드 스크립트인 PHP가 지원해 준다면 아주 간단히 카운터를 만들 수 있겠으나 그렇지 못한 것이 현실인 것 같습니다. 반면에 ASP에서는 Application 객체를 이용하면 카운터를 보다 간단히 구현할 수 있겠지요.
PHP에서도 모든 사람이 공유해야하는 데이터를 구현하기 위해 그때그때 번거롭게 데이터베이스나 파일을 다루기보다는 미리 방문자공용변수를 다룰 수 있는 라이브러리를 작성하여 이를 이용하면 어떨까 하는 생각에 방문자공용변수를 다룰 수 있는 함수를 클래스를 이용하여 만들어 보았습니다. 클래스 내부적으로는 방문자공용변수를 데이터베이스 테이블에 기록하고 필요에 따라 읽어들이고 있지요. 완벽한 기능을 가지지는 못했지만 좀 더 보완한다면 충분히 사용할 가치가 있다고 생각합니다.
방문자공용변수 충돌 회피의 필요성
방문자공용변수를 사용할 때는 한가지 주의할 점이 있는데, 방문자공용변수를 모든 방문자가 공유하다보니 이 변수를 한 방문자가 다루고 있는 순간에는 다른 방문자가 접근할 수 없도록 막아야 합니다. 그러지 않으면 방문자공용변수에 저장되는 데이터 결과를 전혀 신뢰할 수 없게 되지요.
카운터를 예를 들어보면, 이 카운터는 모든 방문자가 공유하게 됩니다. 한 방문자가 이 카운터를 읽어올 때 "100"이 저장되어 있었다면 이 값에 "1"을 더하여 카운터 값을 "101"로 수정하게 될 겁니다. 수정된 카운터 값을 저장하기 직전에 다른 방문자가 방문하여 카운터 값을 읽게 되면 아직 수정되기 전이기 때문에 "100"을 읽어들일 것이고 이 방문자도 "100"에 "1"을 더하여 카운터 값을 "101"로 수정하여 저장하려고 할 것입니다. 따라서 두 방문자가 모두 접근하더라도 카운터 값의 최종 결과는 "101"이 될 것이고 이 값은 실제 상황과 다른 신뢰할 수 없는 값이 되어 버릴 것입니다.
이런 현상을 방지하기 위해서는 방문자공용변수는 그 변수의 값을 다루기 전에 다른 방문자가 접근할 수 없도록 제한할 필요가 있고, 방문자공용변수를 더 이상 사용할 필요가 없을 때는 제한을 풀어주어 다른 사용자가 방문자공용변수를 사용할 수 있도록 할 필요가 있습니다. 이 역할을 수행하는 멤버함수가 uglobal_lock(), uglobal_unlock() 함수입니다.
[code php;gutter:false] .
.
.
$obj = new clsUserglobal($host, $user, $pass, $base);

$obj->uglobal_lock();

$all_page_hits = $obj->uglobal("pageglobal","all_page_hits")+1;
$obj->uglobal("pageglobal", "all_page_hits", $all_page_hits);

if (0 == ($all_page_hits % 10))
$history = "";
else
$history = $obj->uglobal("pageglobal", "history");

$history .= "[".$obj->webpage_static_id()
. "/히트수][a]=$all_page_hits";
$obj->uglobal("pageglobal", "history", $history);

$obj->uglobal_unlock();
.
.
. [/code]

Posted by 방글24
클래스 구성
- class.string.php : 문자 처리 클래스
- class.htmltagext.php : HTML 태그 처리 클래스
- class.sessionclient.php : 서버 & 클라이언트 세션 관리 클래스
PUBLIC 멤버함수
클래스를 이용하여 작성되었으며 사용되는 멤버함수는 아래와 같습니다.
- ses_start()
- ses_register()
- ses_unregister()
- ses_destory()

- tagext_head()
- tagext_body()
- submit_anchor()
ses_start() 함수는 세션기능을 시작하는 함수로 클래스의 생성자로 자동 수행하므로 사용자가 임의로 수행할 필요는 없습니다.
ses_register() 함수는 서버 사이드 또는 클라이언트 사이드 또는 양쪽 모두에서 사용하기를 바라는 세션변수를 등록하기 위한 함수입니다.
ses_unregister() 함수는 더 이상 사용되지 않는 세션 변수를 삭제합니다.
ses_destory() 함수는 세션을 강제로 종료하기 위한 함수입니다.
세션 관련 함수는 이미 나온 PHP3용 세션 라이브러리 또는 PHP4 세션 함수의 기능과 거의 유사하니 이해하는데는 어려움이 없을 겁니다. 세션 관련 함수를 제외한 나머지 세 가지의 함수는 서버&클라이언트 세션 기능을 구현하기 위한 보조함수들로 필히 사용되어야 합니다. 각 함수별로 기능을 간단히 살펴보면,
tagext_head() 함수는 "<HEAD> ...... </HEAD>" 태그를 작성해 주는 함수로 이 함수 내에서 자바스크립트와 PHP 스크립트를 연결하는데 필요한 자바스크립트 함수 및 변수 처리 부분이 작성되어 있습니다.
tagext_body() 함수는 "<BODY> ...... </BODY>" 태그를 작성해 주는 함수로 이 함수 내에서 자바스크립트와 PHP 스크립트를 연결하는데 필요한 <FORM> 태그 및 <INPUT> 태그가 작성되어 있습니다.
submit_anchor() 함수는 <A> 태그를 대신하는 함수로 submit하기 전에 tagext_body()에서 작성된 <INPUT> 태그의 값을 설정하고 serialize하기 위한 자바스크립트 함수 goHref()를 호출하는 역할을 합니다. 자바스크립트 함수 goHref() 함수는 tagext_head() 함수 내에 작성되어 있습니다.
예제 파일 구성
아래의 예제는 실제 홈페이지에 적용할 수 있는 완성된 프로그램이 아니고, 단지 클라이언트 세션이 어떻게 이루어지는지를 보여주기 위한 실험적인 프로그램이니 참고만 하세요.
- common.php : 모든 페이지에서 공용으로 쓰이는 변수와 함수가 정의된 인클루드 파일
- sess.php : 세션 시작 페이지
- page1.php : 페이지 #1
- page2.php : 페이지 #2
- page3.php : 페이지 #3
- page4.php : 페이지 #4
- sess_end.php : 세션 종료 페이지
다운로드
(수정:2010.1.12) 관련 파일을 이곳에서 다운로드 받으세요.

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

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

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

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

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

(출처: 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