PHP3용 세션 – 1.개요

세셔너는 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() 멤버가 포함되어 있습니다. 이 함수만 수정하면 됩니다.

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에 저장된 세션변수를 가지고 복구하는 것이 바람직하다고 할 수 있습니다. 아래에는 이에 대한 예입니다.

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

(세션 변수 처리 개정) 이 문제가 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”를 지정하여 소스 컴파일을 할 상황이 되지 않는다면 세셔너의 소스를 약간 수정하여 사용하시기 바랍니다. 세셔너 소스코드를 살펴보면 아래와 같은 곳이 있습니다.

위의 코드에서 $GLOBALS[“HTTP_COOKIE_VARS”][$name]을 $GLOBALS[$name]으로 수정하세요. 전역배열변수 $HTTP_COOKIE_VARS[] 대신에 전역변수를 이용하는 방법입니다. 보안 측면에서 바람직하지는 않지만 찬밥 더운밥 가릴 수 없는 분들은 이렇게라도 사용하시기 바랍니다.

보안 문제로 전역변수를 사용하고 싶지 않다면 PHP_COOKIE_VARS를 사용하시기 전에 문서 최상단에 아래와 같이 php_track_vars 지시자를 사용하세요.

주의할 점은 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용이 제공되고 있으며 자세한 내용은 뒷장 “세셔너핸들러” 메뉴를 참조바랍니다.

답글 남기기