메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

PHP: 세션 추적- 1부

한빛미디어

|

2001-06-08

|

by HANBIT

11,068

By W. J. 길모머(W. J. Gilmore), 역 한빛 리포터 1기 이상훈 요즘 들어 각광 받고 있는 e-CRM이니, personalization이니 하는 말들은 들었지만, 실제 적용분야에서는 어떤 식으로 쓰일까 궁금하던 참에 웹사이트 방문자의 세션을 추적하는 기능을 소개한 기사를 만나게 되어 반가운 마음으로 번역해 보았다.
웹사이트에 대한 방문자 정보를 수집, 분석, 처리하는 일은 웹이라는 새로운 매체를 보는 가장 매력적인 관점 중 하나이다. 이러한 정보로 제품과 서비스에 관심이 있는 방문자의 패턴을 분석할 수 있을 뿐만 아니라, 개개의 방문자에 맞춘 서비스를 제공할 수 있다는 여러 장점이 있다. 예를 들어, 자신의 특정 페이지가 프랑스어 사용자들에게 가장 있기가 있다는 것을 알게 되며, 자동적으로 이러한 사용자를 인식해서 프랑스어로 된 환영 메시지를 제공할 수도 있는 것이다. 이러한 형태의 맞춤 서비스는 큰 인기를 얻고 있다. weather.com의 경우에는 방문자가 보고 싶어 하는 것만을 볼 수 있게 한다. 이것은 매우 환영할 만한 점이다. 필자는 날씨에 매우 관심이 있어 사이트의 여러 곳을 뒤지면서 시간을 낭비하지 않고 보고 싶은 모든 것을 단 하나의 화면에서 볼 수 있는 이 사이트에 자주 들린다. 또한 사이트를 돌아볼 때 내 성향에 따라 각각의 페이지에 대한 맞춤서비스를 제공하므로, 내가 특별히 선택하지 않은 영역에 대한 자료도 다음 방문 때 제공받기도 한다. 이 글에서는 PHP의 세션 추적(session-tracking) 기능을 이용하여 각자의 맞춤 웹사이트를 어떻게 만드는가를 설명한다. PHP의 세션 추적 기능은 사용하기 쉽고 맞춤형 웹 애플리케이션 개발에 매우 유용하다. 기능 구현에 들어가기 전에 몇 가지 기본적인 개념부터 짚고 가자. 설정 PHP 4.0버전에 처음 도입된 세션 추적 기능은 PHP의 고유한 기능으로서 PHP 배포판 외의 부가적인 패키지가 필요 없다. 필자는 윈도우와 비(非)윈도우 서버에서 광범위한 세션을 사용했는데, 호환성에 관해선 아무 문제 없었다. 그러나 이 훌륭한 기능을 사용하기로 결정했다면 몇 가지 설정에 관한 쟁점을 기억해야 한다. 이 글에서는 이러한 쟁점들에 대해 설명하고, 후반부에서 유용한 다른 쟁점들을 설명하도록 하겠다. PHP의 세션 관리 기능 설정은 "Session"이라는 적절한 제목으로 php.ini 파일에 자리잡고 있다. 현재 19가지의 설정 항목이 있는데, 그 중 몇 가지는 아주 중요하다. 여기에서는 이에 대해 설명할 것이다.

session.save_handler (files | mm | user)
PHP는 일반 파일(files), 공유메모리(mm), 사용자 정의 함수(user)라는 세 가지 세션 정보를 저장하고 검색하는 기능을 지원한다. 이 중에서 파일에 저장하는 방법이 흔히 쓰이는데, 이 방법이 기본값으로 정의 되어 있기 때문이다. 파일을 이용하는 경우는 충분한 기능을 지원하지만, 세션 저장 파일은 아주 빨리 커지고, 실제로 사이트를 방문하는 사람에 비례해서 더욱더 빨리 커질 수도 있다는 점을 명심해야 한다. 공유메모리를 사용하면 가장 빨리 저장할 수 있지만, 쉽게 지워질 수 있기 때문에 일시적이다. 사용자 정의 함수를 사용하는 것은 가장 유연한 방법이지만 가장 어렵기도 하다. 이 방법은 세션 정보를 PHP가 지원하는 오라클이나 MySQL 같은 데이터베이스에 저장할 수 있도록 맞춤형 저장, 검색 관리자를 만든다. 이러한 방법을 사용할 때는 각각의 경우에 맞게 파일, 공유메모리, 사용자 함수와 같은 session.save_handler를 적절하게 설정해야 한다. 이 글에서는 기본 설정인 파일을 쓰는 방법으로 설명해 나갈 것이다.

session.save_path (path/to/directory)
이 지시자는 파일을 저장할 위치를 명시해 주므로, session.save_handler를 파일로 설정했을 때만 유효하다. 이 파일은 브라우저를 통해서 볼 수 없도록 document root 외의 다른 곳으로 지정하는 것이 좋다. 덧붙여서 이 디렉토리는 PHP를 동작하는 유저가 쓸 수 있도록 권한 설정을 해야 한다.

session.auto_start (0 | 1)
이 지시자는 세션 관리를 자동으로 시작할 것인지를 결정한다. 사이트의 모든 섹션에 세션을 쓸 일은 거의 없으므로 기본값은 0이다. 그러나 이 값을 1로 설정하면 자동으로 세션을 지원한다. 일반적으로는 PHP의 세션 관리 전략과 기능에 대해 학습할 필요 없이, 19개의 설정 지시자 중 위 세 가지만으로도 충분히 구현할 수 있다. 세션 전파 기본적으로 세션은 방문자가 웹사이트를 탐색하는 시간대로 정의할 수 있다. PHP는 각 방문자의 세션을 각 방문자에 고유 세션 확인(SID)번호를 할당해서 행적을 추적한다. SID는 다양한 방법으로 만들 수 있지만, PHP는 기본적으로 fc94ad8b1ee49ef79c713ee98ac1fcc4와 같이 SID를 만든다. SID를 이용해서 사용자를 추적하는 방법에는 다음의 두 가지가 있다
  • 쿠키의 연속된 검색과 저장
  • SID변수를 포함한 URL의 재기록
쿠키 사용 물론, 쿠키는 사용자의 세션간 지속상태를 파악하는 가장 쉬운 방법이라서 사용자를 추적하는 데 자주 사용된다. 그러나 사용자가 쿠키를 지원하지 않도록 브라우저를 설정할 수도 있고, 쿠키를 지원하지 않는 브라우저를 사용할 수도 있다는 점을 알아 두어야 한다. 세션과 쿠키를 사용하고자 할 때 반드시 살펴 보아야 할 php.ini의 설정 지시자가 몇 가지 있는데, 각각에 대해 살펴 보자.

session.use_cookies (0 | 1)
SID를 저장할 때 쿠키를 쓸 것인가를 지정한다. 0은 쿠키를 쓰지 않는 것이고, 1은 쿠키를 사용하도록 한다.

session.name (Default: PHPSESSID)
SID에 저장될 쿠키의 이름을 지정한다. 기본값은 PHPSESSID이다.

session.cookie_lifetime (Default: 0)
쿠키가 처음 생성되고 얼마동안 유효할 것인가를 초단위로 지정한다. 기본값은 0인데, 세션이 끝날 때 쿠키 값은 없어진다.
	
session.cookie_path (Default: /)
쿠키가 유효한 도메인 경로를 지정한다. 기본값은 / 이다.

session.cookie_domain (Default: null)
쿠키가 유효한 도메인을 지정한다. 기본값은 null이며, 위의 경우에는 공백으로 나타난다. sesion.use_cookies가 활성화되었을 때는 set_cookie() 같은 cookie-setting 함수를 호출하지 않아도 된다. PHP의 세션 관리 기능이 자동으로 이를 처리하기 때문이다. URL 재기록 URL을 SID에 기록하는 것은 쿠키를 사용하는 것에 비해 조금 불편해 보이지만, 항상 쿠키를 사용할 수는 없으므로 더 안전한 방법이기도 하다. SID는 URL에 수동 혹은 자동으로 첨부될 수 있다. 수동으로 SID를 첨부하려면 다음과 같이 SID의 URL안에 SID 전체 참조(global reference)를 추가하면 된다.

<a href="configure.php?<?=SID?>">Go to the configuration page</a>
믈론, 일일이 SID를 추가하면 불편하므로 -enable-trans-id 옵션을 주어 PHP를 컴파일하면, 자동적으로 URL에 SID가 첨부된다. 컴파일 옵션을 제대로 주었다면 ?는 자동적으로 URL에 추가될 것이다. 이제 세션 추적을 시작해 보자! 이제 여러분은 사용자 세션을 만들고 싶을 것이다. 지금부터는 여러분만의 세션 지향 애플리케이션을 제작하는 데 기초를 제공할 몇 가지 예를 소개할 것이다. 리스트 리스트 1에서는 SID가 어떻게 생성되고 세션 변수들이 다음 사용을 위해 어떻게 저장되는가를 보여 준다. 사용자가 직접 배경색을 고를 수 있도록 한다고 생각해 보자. 그에 따라 배경색 정보가 저장되고 이 정보는 사이트의 다른 페이지에서 사용될 것이다. 여기에서는 간단한 리스트를 만들기 위해서 $bgcolor 변수에 "#8080ff"를 직접 입력했으며, 사용자의 브라우저가 쿠키를 지원하도록 설정되어 있다고 가정한다. 리스트 1: 세션을 새로 만들고 세션 변수를 저장하는 스크립트

<?
// create a new session
session_start();

// register a session-variable
session_register("bgcolor");

// Assign a value to the session-variable
$bgcolor = "#8080ff";
?>
<html>
<head>
<title>Session Example #1</title>
</head>

<body bgcolor="<?=$bgcolor?>" text="#000000" link="#000000" vlink="#000000" alink="#000000">

Welcome to a session-enabled page! The background color on the next page will be set to a stylish blue.<p>
<a href = "1-2.php">Go to another session-enabled page</a>.
</body>
</html>
리스트 1의 링크를 클릭하면 다음과 같은 리스트 2가 나타난다. 리스트 2는 쿠키를 설정한 후, 그로부터 SID를 가져올 수 있음을 보여준다. 또한 이 스크립트는 세션 변수인 $bgcolor를 가져와서 색상코드와 그에 따른 배경색도 보여준다. 리스트 2: 세션 변수를 전달하는 리스트 스크립트

<?
// Resume session created in Listing 1-2
session_start();
?>
<html>
<head>
<title>Session Example #1</title>
</head>

<body bgcolor="<?=$bgcolor?>" text="#000000" link="#808040" vlink="#606060" alink="#808000">

<?
// Retrieve SID from cookie.
print "Your SID is $PHPSESSID <br>";

// Display the value of the $bgcolor variable.
print "The persistent background color is: $bgcolor.";
?>

</body>
</html>
session.cookie_lifetime을 3600초로 설정했다면, 사용자가 주어진 세션 시간 동안 페이지를 방문한 횟수와 상관없이 배경색과 SID는 처음 리스트 1에 접근했을 때부터 1시간 동안 유지된다. 세션 변수 삭제 세션 변수를 삭제해야 할 때가 있다. 이것은 session_unregister() 함수를 쓰면 간단히 구현할 수 있다. 예를 들어, 사용자가 리스트 1에서와 같이 #8080ff로 자동적으로 설정되는 배경색을 거부하고 기본 배경색인 하얀 바탕을 표시한다고 가정하자. 리스트 2를 다시 작성해서 이 기능이 작동하는가를 보자. 리스트 3: 세션 변수를 확인하고 삭제하기

<?
session_start();
?>
<html>
<head>
<title>Session Example #1</title>
</head>

<?
if ($seenform == "y") :

 if ($deletecolor == "y") :
   session_unregister("bgcolor");
 endif;

endif;

if (! session_is_registered("bgcolor")) :
  session_register("bgcolor");
  $bgcolor="white";
endif;

?>

<body bgcolor="<?=$bgcolor?>" text="#000000" link="#808040" vlink="#606060" alink="#808000">

<?
print "Your SID is $PHPSESSID <br>";
print "The persistent background color is: $bgcolor <br>";

if (! $seenform) :

  $form = <<<Form
  <form action="1-3.php" method="post">
  <input type="hidden" name="seenform" value="y">
  Do you like this background color?<br>
  <input type="radio" name="deletecolor" value="y">No<br>
  <input type="radio" name="deletecolor" value="n">Yes<br>
  <input type="submit" value="Submit">
  </form>
  Form;

  echo $form;

endif;
?>
</body>
</html>
이 간단한 리스트는 session_register() 함수로 세션 변수를 등록하고, session_unregister() 함수로 세션을 지우고, session_is_registered() 함수로 세션을 검증하는 작업의 역학관계를 보여준다. 쿠키에 세션 변수 저장하기 마지막으로 쿠키의 여러 가지 값을 어떻게 사용자의 PC에 저장하는가에 대해 살펴 보자. 어떤 브라우저는 특정 도메인에 대해 한번에 사용할 수 있는 쿠키 개수를 제한하기 때문에, 쿠키 이외의 다른 방법도 알아 둬야 한다. 모든 데이터를 인코딩한 다음 하나의 쿠키에 한 줄로 저장하는 방법이 있다. 놀라울 것도 없지만, 우리의 뛰어난 PHP 개발자들은 미리 그런 요구를 예측하고 session_endoce()라는 정확히 위의 기능을 구현한 함수를 만들어 두었다. 이 함수는 URL에 첨부하려는 변수명과 이에 대응하는 정보를 담은 단일 문자열을 반환한다. 다음의 리스트 4를 살펴보자 리스트 4: 세션 데이터를 단일 문자열로 인코딩하기

<?
session_start();
session_register("bgcolor");
session_register("name");
session_register("email");

$bgcolor = "#8080ff";
$name = "Daffy Duck";
$email = "daffy@duck.com";

$encoded_string = session_encode();

print "The encoded string is: $encoded_string";

?>
리스트 4를 실행하면 다음과 같은 결과가 나타난다. The encoded string is: bgcolor|s:7:"#8080ff";name|s:10:"Daffy Duck";email|s:14:"daffy@duck.com"; 이것은 하나의 쿠키에 직접 문자열을 저장할 수 있어 매우 편리하다. 한 가지 반드시 고려할 점은 전체 쿠키 사이즈인데, 대부분의 브라우저가 제공하는 쿠키 사이즈의 최대값은 5kb 정도이다. 사용자가 우연히 데이터를 지우는 경우에 대비해서 이 문자열은 데이터베이스에 저장하고 사용자의 PC에는 세션 ID만을 갖는 쿠키를 저장하거나, SID를 쿠키에 저장하고 인코딩된 문자열을 데이터베이스에 저장할 수도 있다. 사용자의 브라우저에 저장될 데이터는 그 중요성과 관련된 보안만 고려하면 된다. 또 다른 대안은 암호화된 문자열을 쿠키에 저장하고 검색할 때 암호를 해독하는 방법도 있다. 이러한 데이터를 가지고 무엇을 할 것인가와 상관없이, session_decode() 함수를 이용하면 세션 변수를 자동적으로 해독해서 복구할 수 있다. $encoded_string을 나중에 디코드하는 경우를 생각해보자

<?
session_decode($encoded_string);
?>
이 함수는 각각의 이름/값 쌍으로 디코딩할 뿐만 아니라 각각의 세션 변수를 만든다. 다음 기사 소개 이번 기사에서는 PHP의 고유한 세션 추적 기능을 소개했다. 일반적인 설정, (쿠키와 URL 재기록을 대비한) 사용전략과 PHP의 세션 함수들에 대한 자세한 설명도 곁들였다. 이러한 유용한 기능을 설명하기 위해서 특정한 경우, 어떻게 세션을 사용하는가에 대한 몇 가지 예도 제공했다. 세션 추적: 2부에서는 이러한 세션 관리의 소개를 확장해서 PHP의 session_set_save_handler()함수를 이용한 커스텀 세션 저장 함수를 사용하는 것을 중점으로 설명할 것이다. 세션 저장 함수는 세션 정보를 데이터베이스와 같은 특별한 저장 검색 매체를 쓰고자 할 때 특히 유용하다. 이 멋진 기능을 보여주기 위해, 일반 함수로 어떻게 MySQL 데이터베이스의 세션 저장 스키마와 연동할 수 있는지 보여 줄 것이다.
W. J. 길모어(W.J. Gilmore)는 1997년부터 PHP 애플리케이션을 개발하고 있으며, 가장 있기 있는 웹 개발 사이트에 글을 게재하고 있다. 2001년 1월에 출판된 "A Programmer"s Introduction to PHP 4.0"이라는 책을 저작한 바 있으며, Apress의 웹과 오픈 소스 기술의 부편집장을 맡고 있다. 이상훈님은 한빛 리포터 1기로 활동 중이며, IDE Korea라는 컨설팅 + 개발 업체에서 인터넷 개발 쪽을 맡고 있습니다.
TAG :
댓글 입력
자료실

최근 본 책0