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
phpsource/회원인증2000. 10. 10. 15:05
회원 인증이 필요한 웹사이트
회원 전용 웹사이트에서는 회원만이 웹사이트에 접근할 수 있도록 회원 인증을 수행하게 됩니다. 이러한 회원인증이 필요한 웹사이트로는 회원전용 BBS, 회원제 강의실, 쇼핑몰 등이 있을 겁니다.
동작 순서
회원전용 서비스를 받기 위해서는 가장 먼저 회원 가입을 통해 회원으로 등록하여야 하고, 회원 가입을 마친 등록자는 로그인 과정을 통해 자신을 회원으로 인증받게 됩니다. 여기서 인증이 성공적으로 이루어지면 그 방문자는 회원전용 웹페이지에서 제공하는 모든 서비스를 받을 수 있습니다. 서비스 받는 동안에 발생하는 각종 세션 정보들은 쿠키, 파일 또는 별도의 데이터베이스에 저장되고, 이러한 저장된 정보들은 세션 내의 다른 페이지 또는 또 다른 세션에서 필요에 따라 사용됩니다. 방문자가 더 이상 서비스 받기를 원치 않으면 로그아웃하여 사이트를 떠날 수도 있으나 대부분의 방문자는 로그아웃 과정을 거치지 않고 곧바로 떠나게 됩니다. 이와 같이 회원전용 웹사이트에서는 방문자와 웹애플리케이션 사이에는 일정한 상호작용을 통해 모든 동작이 적절히 이루어지게 됩니다. 최초 접근 단계부터 마지막으로 종료하는 단계까지를 도식적으로 나타내면 아래와 같은 과정을 거치게 됩니다.
< 회원전용 웹사이트의 동작 >
세션 상태 유지
인터넷의 기본 프로토콜인 HTTP(HyperText Transfer Protocol)를 사용하면, 웹 페이지에 대한 각각의 요구는 다른 요구들과 상관 관계없이 모두 독립적입니다. 즉, 현재 페이지에 대한 데이터를 모두 수신하게 되면 웹서버는 현재 접속된 브라우저에 대하여 자동으로 세션이 종료합니다. 다음에는 웹브라우저에서 모든 것이 처리되기 때문에 웹서버와의 관계는 완전히 끊어지게 됩니다. 즉, 웹서버와 웹브라우저는 파일 단위의 요청, 연결, 송수신을 기본으로 하고 있습니다. 그렇기 때문에 웹서버는 그 방문자에게 이전에 어떠한 페이지가 보내어졌는지에 관한 아무런 기록도 가지고 있지 않으며, 심지어 그 방문자가 이전에 방문했었는지 조차 알기 어렵습니다.
이러한 문제로 인하여 회원전용 웹사이트를 구성하는 복수페이지 내에서 공유하여야 하는 정보를 유지할 수가 없습니다. 따라서 회원전용 웹사이트를 개발하려면 이러한 웹사이트에 특정 방문자가 머무르는 시간(세션) 동안에 웹서버가 유지하여야 하는 데이터를 묶는 방법이 필요하게 됩니다. 이 방법을 세션 관리라고 하며 이와 같이 함으로써 여러 페이지로 구성된 웹사이트 내에서 필요한 정보를 유지할 수 있습니다. 마치 여러 개의 웹애플리케이션을 하나의 웹애플리케이션인 것처럼 속이는 것(?)이지요.
세션 상태 유지로 얻게 되는 이점
유지되어야 하는 세션 정보로는 개인 ID와 비밀번호, 방문자가 접속했던 페이지, 쇼핑몰의 경우에는 어떤 제품을 구입했는지 등이 있습니다. 이와 같은 정보는 방문자가 전에 방문했을 때 관심을 보인 서비스 부분을 확인할 수 있으므로 이에 따라 방문자 기호에 맞는 서비스를 제공할 수 있습니다. 회원전용 웹사이트를 개발하는 면에서보면 필수적인 것이라고 할 수 있습니다. 또한 방문자가 회원전용 웹사이트에 한번 로그인하면 동일 웹사이트의 다른 서비스 페이지에 접속하더라도 다시 ID와 비밀번호를 입력할 필요가 없습니다. 그러나 세션 상태가 유지되지 않는다면 방문자는 동일 웹사이트에서 다른 서비스 페이지를 방문할 때마다 회원정보를 계속 입력해야 하는 불편함이 있습니다. 따라서 회원제로 운영되는 웹사이트를 이용할 때는 방문자의 불편을 해소하는 차원에서도 세션 상태를 유지하는 것은 불가피합니다.

Posted by 방글24
phpsource/회원인증2000. 10. 10. 15:02
회원인증
요즘 새로이 나타나고 있는 웹사이트들을 살펴보면 회원만이 이용할 수 있는 곳이 부쩍 늘어나고 있습니다. 회원전용 BBS, 회원제 교육 프로그램 및 회원제 쇼핑몰 등이 거의 모두 회원제로 운영되고 있습니다. 이러한 회원 전용 웹사이트를 개발하기 위해서는 일반 웹사이트에서는 볼 수 없는 로그인을 통해 회원 인증(또는 사용자 인증)이라는 단계를 거쳐야 원하는 서비스를 제공받을 수 있습니다. 이 외에도 회원전용 웹사이트만이 고려해야 할 것이 상당히 많이 있습니다. 그러나 이러한 회원전용 웹사이트를 개발하는데 필요한 정보를 찾으려면 대부분 단편적인 것을 얻을 수는 있으나 이를 종합적으로 정리되어 있는 곳은 찾기 힘든게 현실인 것 같습니다. 따라서 새로이 회원전용 웹사이트를 개발하려는 개발자에게 다소나마 도움이 되고자 회원인증에 대한 자료를 정리해 보았습니다. 여기에 있는 내용은 새로운 내용이라기 보다는 대부분이 기존에 PHP 관련 정보를 제공하고 있는 웹사이트나 관련 서적에 있는 내용을 정리한 것이라 혹시 저작권과 관련된 문제가 발생할까 다소 염려스러우나 이러한 부분이 있다면 저한테 연락을 주시면 수정 또는 삭제하도록 하겠으니 해당 저작자 분들은 넓은 아량으로 이해하여 주시기 바랍니다.
인증이란?
인증은 방문자의 신원을 확인하는 것을 뜻하는 것으로 보안의 수단으로 사용되고 있습니다. 즉, 허가되지 않은 방문자가 부당하게 접근하는 것을 방어하기 위하여 사용되는 접근 제어 수단의 하나로 방문자가 웹사이트 이용 가능 목록(사용자가 등록되어 있는 데이터베이스)에 등록되어 있는 등록자와 같은 사람인지 판단하는 과정을 말합니다. 이를 Identification이라고도 합니다. 이러한 인증은 보통 전자상거래에서 본인의 여부를 확인할 때 사용하는 것으로 사용자 ID와 비밀번호를 통해 확인합니다. 이와 같이 웹사이트에 접근하는 방문자가 정당한 방문자임을 확인하는 것을 사용자 인증이라고 합니다. 본 문서는 회원전용 웹사이트를 개발할 때의 고려해야 할 인증 만을 대상으로 하겠으며 따라서 이러한 회원전용 웹사이트에서의 사용자 인증을 회원 인증이라고 부르겠습니다.
회원 인증 과정
회원전용 웹사이트로 처음 들어오는 새로운 방문자들은 우선 회원가입 프로그램을 통하여 자신을 회원 데이터베이스(회원 정보 테이블)에 신규 등록한 후 자신을 인증할 수 있도록 하며, 기존에 이미 회원으로 가입했던 방문자들은 단지 회원ID와 비밀번호 만을 입력하여 자신을 인증하게 됩니다. 인증이 성공적으로 이루어지면 그 방문자는 회원전용 웹사이트에서 제공하는 모든 서비스를 받습니다. 이러한 로그인 과정을 거쳐서 회원 인증을 받게 됩니다.
< 회원 인증 과정 >
회원인증ID
회원인증ID는 회원전용 페이지에 접근하기 위해 회원임을 증명하는 식별자(ID)이며, 이 인증ID는 로그인에 성공하게 되면 발급받게 됩니다. 로그인에 성공한 후부터 로그아웃할 때까지를 특정 세션이라고 한다면 회원인증ID는 이 특정 세션에서만 통용되는 식별자라고 할 수 있습니다. 일단 로그인 과정을 통해 회원인증ID를 발급받게 되면 이 인증ID에 의해 회원전용 웹페이지에서 제공하는 모든 서비스를 받을 수 있게 됩니다. 방문자가 더 이상 회원 서비스 받기를 원치 않으면 로그아웃할 것이고, 로그아웃 과정에서 회원인증ID가 삭제될 것 입니다.
회원 데이터베이스(회원 정보 테이블)
웹사이트를 회원제로 운영하기 위해서는 회원에 대한 정보가 필요하며 이러한 회원정보는 데이터베이스를 이용하여 회원정보테이블을 구성하게 됩니다. 회원 정보 테이블에 기록되는 회원 정보는 보통 회원 가입을 통하여 얻게 됩니다. 회원에 가입한 방문자는 향후 회원 전용 서비스를 받기 위해서는 회원 ID와 비밀번호만을 입력하여 입력된 정보와 회원 정보 테이블에 있는 정보를 비교하여 정식 회원임을 인증받게 되는 것입니다. 회원 인증을 하기 위해서는 이와 같이 회원 정보 테이블이 꼭 필요하게 되며, 이러한 회원 정보 테이블은 보통 MySQL과 같은 관계형 데이터베이스를 이용하게 되며, 이 테이터베이스에 회원 정보 테이블을 생성한 후 회원 정보를 등록, 수정, 삭제 및 확인하게 됩니다. 웹기반에서 회원관리를 하신다면 웹서버의 Real 계정으로 관리할 수 있겠지만 대부분의 방문자는 서버상에 계정이 없으므로 이러한 개인 사용자의 경우에는 회원 정보 테이블의 가상 계정(회원 ID)을 통하여 회원 인증을 하는 것이 보통입니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 19:56
FastTemplate 1.1.0
FastTemplate-1.1.0은 FastTemplate 클래스의 최종 버전으로 더 이상 버전업은 없습니다. 원본을 확인하시려면 이 곳(www.thewebmasters.net)을 클릭하시던지 아니면 아래 복사본을 참조하세요.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:48
비교항목
  • 용도
  • 수행속도
  • 소스코드 크기
  • 템플릿 파일 형식
  • 공개여부
  • A/S 수준
이 외에도 비교할 수 있는 항목으로는 가독성, 코드 작성의 편의성, 각 툴의 장단점 등이 있겠으나 이러한 항목은 개인에 따라 평가 결과가 전혀 다를 수 있기 때문에 여기서는 비교하지 않았으며, 필요하면 여러분이 직접 비교해 보고 "후키라이브러리 Q/A" 게시판에 의견을 주시기 바랍니다. 그러면 제가 나중에 그것을 기반으로 하여 정리하여 보겠습니다. VH layout은 공개용과 상용의 두 가지 버전이 있습니다. 여기서 비교하고 있는 버전은 공개용입니다.(제가 돈주고 사면서까지 실험할 수 없는 고로 이해하시길...)
수행속도
수행속도는 서버 상에서 스크립트가 시작되는 시간부터 종료되는 시간까지 소요되는 시간을 초단위로 나타내었습니다. 이 때 사용되는 벤치마킹용 함수는 FastTemplate 내에 포함된 클래스의 메소드 utime()을 이용했습니다. 아래에 각 툴 예제소스에 포함된 벤치마킹 소스를 나타내었습니다.
[code php;gutter:false] <?php function utime () { // Benchmarking $time = explode( " ", microtime()); $usec = (double)$time[0]; $sec = (double)$time[1]; return $sec + $usec; } $start = utime(); // 시작시간 // // 이 부분에 각 페이지툴의 예제 소스코드가 있습니다. // $end = utime(); // 종료시간 $runtime = $end - $start; // 소요시간 echo "Completed in $runtime seconds\n"; ?> [/code]
수행속도에 나타난 수치는 각 툴 사이의 상대적인 비교 값으로만 참조하시기 바라며, 또 한가지 주의할 것은 수행속도가 서버 상에서의 비교한 수치이기 때문에 실제 인터넷상에서 느끼는 속도하고는 전혀 다르다는 것을 이해해 주시기 바랍니다. 즉, 서버의 수행속도보다 네트워크의 전송속도가 훨씬 느린 게 현실이며, 최종 방문자가 느끼는 속도는 서버의 속도보다는 네트워크의 전송속도에 의해 거의 결정된다고 생각됩니다.
수행속도 측정은 두 가지 환경에서 실험했습니다. MySQL과 Apache는 두 환경에서 동일하고 PHP버전만 다릅니다.
  • 첫 번째 환경 - PHP 3.0.14
  • 두 번째 환경 - PHP 4.0.4
소스코드 크기
여기서 표기된 소스코드 크기는 페이지툴만 포함시킨 것으로, 사용자가 작성해야 하는 템플릿 파일 또는 PHP 코드는 제외시켰습니다. 따라서 페이지툴에 따라 템플릿 파일 또는 PHP 코드의 크기가 차이가 있을 수 있음을 염두에 두시기 바랍니다.
기타
VH layout 예제를 제외하고 나머지는 전부 제 홈페이지에서 생성되는 HTML 태그를 모델로 하여 예제를 작성하였습니다. VH layout은 함수로 복잡한 레이아웃 구조를 표현하기가 쉽지 않아 제 홈페이지의 HTML 소스 대신에 VH layout에서 받은 예제를 거의 그대로 하여 예제로 올렸습니다. FastTemplate에는 다이내믹 블록이라는 고급기능도 있으나 이를 사용하지 않고, 단순히 템플릿 변수를 치환하여주는 기능만을 사용하였습니다. 이런 저런 이유로 각 툴에 대한 예제 자체에 저의 편중된 시각이 의식적이든 무의식적이든(고의는 아니지만) 내재되어 있음을 염두에 두시고 아래의 비교 데이터를 참조하시기 바랍니다.
비교 데이터
구분 FastTemplate VH layout UnitTable 0.1.3 UnitTable 0.2.0 HTML
용도 템플릿툴 레이아웃툴 템플릿툴 + 레이아웃툴 -
수행속도(PHP3) 0.161sec 0.527sec 0.816sec 0.330sec 0.010sec
수행속도(PHP4) 0.096sec 0.254sec 0.310sec 0.164sec 0.002sec
소스코드 크기 16KB
(752라인)
23KB
(959라인)
25KB
(1030라인)
22KB
(770라인)
-
템플릿 파일 형식 HTML 태그
(file())
- 텍스트파일
(fopen())
텍스트파일
(file())
-
공개여부 공개용 공개용/상용 구분 공개용 -
A/S 수준? 책임감 있는 웹사이트라고 생각함 상용까지 제공하고 있으니 Upgrade가 잘 될 거라고 추측됨 전 아마추어예요. 따라서 A/S 보장 못해-앵 -
유닛테이블 0.1.3 對 0.2.0
위에서 비교한 유닛테이블의 수행속도는 MySQL용 미니디비 0.2.2를 기본으로 사용하였을 경우의 속도를 나타냅니다. 이 때의 유닛테이블 실행속도를 보면, 0.2.0버전이 0.1.3 버전에 비해 1.9배(PHP4)~2.5배(PHP3)가량 빠르게 향상되었습니다.

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:42
구성
< 유닛테이블을 DB Layer에 접속 >
유닛테이블 통일버전 0.1.3에서는 PHPLIB 및 MiniDB에 있는 각 데이터베이스 관련 클래스 파일을 동일한 방법으로 사용합니다. 따라서 각 DB Layer를 구성하는 클래스 파일을 인클루드 하는 방법만 익히시면 됩니다. 인클루드 부분을 제외한 나머지 모든 인터페이스는 이전 버전과 동일합니다.
각 DB Layer별로 지원되는 데이터베이스 및 클래스 파일
데이터베이스 MiniDB 0.1.1 PHPLIB 7.2
MSQL class.msql.php db_msql.php
MSSQL class.mssql.php db_mssql.php
MySQL class.mysql.php db_mysql.php
Oracle(OCI) class.oci8.php db_oci8.php
Oracle(ORA) class.oracle.php db_oracle.php
ODBC X db_odbc.php
PostgreSQL class.pgsql.php db_pgsql.php
SyBASE class.sybase.php db_sybase.php
PHPLIB의 라이브러리를 사용하면서 발생하는 문제는 해당 웹사이트의 게시판을 통해 문제점을 해결하세요. phpCLASS 홈페이지에서는 MiniDB에 대한 질문만 받습니다.
MiniDB를 사용하는 방법
[code php;gutter:false] <?php //====================================== // 객체 생성 부분 //====================================== require("./minidb-0.1.1/class.mysql.php"); require("./class.pageworks.php"); . . . $pw->parseprint($modify); ?> [/code]
위의 예는 MySQL에 대하여 나타내었습니다. 다른 데이터베이스는 상단 표를 참조하여 "class.mysql.php" 부분을 변경하여 주십시오.
PHPLIB를 사용하는 방법
[code php;gutter:false] <?php //====================================== // 객체 생성 부분 //====================================== require("./PHPLIB/db_mysql.php"); require("./class.pageworks.php"); . . . $pw->parseprint($modify); ?> [/code]
위의 예는 MySQL에 대하여 나타내었습니다. 다른 데이터베이스는 상단 표를 참조하여 "db_mysql.php" 부분을 변경하여 주십시오.

'phpsource > 템플릿' 카테고리의 다른 글

FastTemplate 1.1.0  (0) 2000.08.06
{유닛테이블}15.각 툴의 비교  (0) 2000.08.06
{유닛테이블}13.기본 메소드  (0) 2000.08.06
{유닛테이블}12.템플릿상수 & 변수  (0) 2000.08.06
{유닛테이블}11.데이터형식  (0) 2000.08.06
Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:19
void head(string key);
void head(string key, string val);
head()는 HEAD 태그 내에 필요한 정보를 지정할 때 사용하는 메소드이며, 첫 번째 매개변수 key에 지정할 수 있는 지정자는 title, author, keywords, description, css, cssfile, script, scriptfile입니다. 두 번째 매개변수 val을 지정하지 않으면 key에 해당하는 값을 읽어오는 것이고, val 매개변수를 지정하면 key에 해당하는 값을 변경하거나 추가하는 것입니다. val 매개변수를 지정했을 때 이미 지정된 값을 대신하여 지정되는 key는 title, author, keywords, description이고, 이미 지정된 값에 더하여 추가되는 key는 css, cssfile, script, scriptfile 입니다.
[code php;gutter:false] $pw = new clsPageworks($argv); $pw->head("title", "PHP Class Community"); $pw->head("author", "hwooky"); $pw->head("keywords", "php3,php4,php,class,클래스,상속,객체"); $pw->head("description", "어서 오시 와요"); $pw->head("script", "function warning() { alert('경고'); }"); $pw->head("css", ".td {font-size:9pt;line-height:1.2}"); $pw->head("cssfile", "./document.css"); $pw->head("scriptfile", "./dom.js"); [/code]
위와 같이 작성하였을 때에 생성되는 HTML 코드는 아래와 같습니다.
[code html;gutter:false] <TITLE>PHP Class Community</TITLE> <META http-equiv='content-type' content='text/html; charset=euc-kr'> <META name='author' content='hwooky'> <META name='keywords' content='php3,php4,php,class,클래스,상속,객체'> <META name='description' content='어서 오시 와요'> <LINK rel=stylesheet type='text/css' href='./document.css'> <SCRIPT language='javascript' src='./dom.js'></SCRIPT> <STYLE type=text/css> <!-- .td {font-size:9pt;line-height:1.2} //--> </STYLE> <SCRIPT language=javascript> <!-- function warning() { alert('경고'); } //--> </SCRIPT> [/code]
void body(string key);
void body(string key, string val);
body()는 BODY 태그 및 BODY 태그 하단에 필요한 정보를 지정할 때 사용하는 메소드이며, 첫 번째 매개변수 key에 지정할 수 있는 지정자는 attrib, onload, (spanid), (script), (enctype), (field) 등입니다. 지정자 attrib와 onload는 BODY 태그 자체의 정보를 지정하기 위한 것이고 나머지 spanid, script, enctype, field 등은 BODY 태그 하단에 삽입할 정보를 지정하기 위해 예약된 키워드들로 아직 내부 기능이 확정되지 않았습니다.
[code php;gutter:false] $pw->body("attrib", "topmargin=0 leftmargin=0 marginwidth=0 marginheight=0"); $pw->body("onload", "goHref()"); [/code]
위와 같이 작성하였을 때에 생성되는 HTML 코드는 아래와 같습니다.
[code php;gutter:false] <BODY topmargin=0 leftmargin=0 marginwidth=0 marginheight=0 onLoad='goHref()'> [/code]
void unittable(string dir_ut, array file_ut);
void unittable(string dir_ut, array file_ut, array static_var);
이 메소드의 첫 번째 매개변수는 템플릿이 저장되는 경로를 지정합니다. 두 번째 매개변수는 현재 페이지에서 사용하는 템플릿 파일명을 지정합니다. 세 번째 매개변수는 스태틱 템플릿 변수를 PHP 코드에서 지정할 때 사용합니다. 아래 예에서 "dir_home"는 템플릿 파일 변수정의영역에서 "$dir_home = ./.."와 같이 스태틱 템플릿 변수를 정의한 것과 동일한 결과를 얻을 수 있습니다. 스태틱 템플릿 변수를 지정하는 또 다른 메소드 staticvar()을 이용할 수도 있습니다.
[code php;gutter:false] $pw->unittable( ".", array( "test.ut" ), array( "dir_home"=>"./.." ) ); [/code]
void staticvar(void);
void staticvar(array static_var);
스태틱 템플릿 변수를 지정해주는 전용 메소드입니다. 지정할 변수가 많을 때는 unittable() 메소드보다는 staticvar() 메소드를 이용하는 것이 바람직하다고 생각합니다. 안을 들여다보면 둘 다 동일한 내부 메소드를 호출하고 있습니다.
[code php;gutter:false] $pw->staticvar( array( "dir_home" =>"./..", "dir_engine"=>"./engine", "dir_image" =>"./img", "dir_icon" =>"./icon" ) ); [/code]
void parse(void);
void parse(string modify);
템플릿 파일의 UTIS 형식의 데이터를 읽어들여 UTEA 형식의 데이터로 컴파일(?)한 후 데이터베이스 엔진으로 데이터를 전송합니다. 첫 번째 매개변수를 지정하면 템플릿 파일의 변경에 관계없이 강제적으로 중간코드를 다시 생성합니다. 그러나 첫 번째 매개변수를 생략하면 템플릿 파일이 변경되었을 때만 템플릿 파일을 해석하여 중간코드를 새롭게 생성해 줍니다. 매개변수의 값은 null 문자를 제외한 어떠한 문자(열)를 지정하여도 관계없습니다.
[code php;gutter:false] $pw->parse($modify); [/code]
void htmlprint(void);
메모리에 저장된 UTEA 형식의 데이터를 읽어들여 레이아웃 구조 및 다이내믹 변수 값을 해석하고 HTML 코드를 생성한 후 생성된 코드를 웹브라우저 화면에 보내줍니다.
[code php;gutter:false] $pw->htmlprint(); [/code]
void parseprint(void);
void parseprint(string modify);
parse() 메소드와 htmlprint() 메소드를 순차적으로 실행하여 줍니다. 따라서 parse() 메소드를 실행한 직후에 별다른 작업이 필요 없을 때는 parseprint() 메소드를 사용하면 좀 더 편하게 코딩할 수 있습니다.
[code php;gutter:false] $pw->parseprint($modify); [/code]

Posted by 방글24
phpsource/템플릿2000. 8. 6. 16:17
아래 그림에서와 같이 여러 페이지에서 단일 템플릿 파일을 이용하여 HTML 코드를 생성하는 경우를 예를 들어 템플릿상수 및 템플릿 변수를 설명하고자 합니다. 이 과정을 살펴보면 템플릿 파일은 하나이지만 나머지 PHP코드, 중간코드 UTEA 데이터는 각 페이지마다 별도로 보유하고 있습니다.
한 페이지가 작성되는 과정에서 존재하는 코드의 형태는 소스코드, 중간코드 및 HTML 코드의 세 가지입니다. 소스코드와 중간코드에는 값이 정해진 상수와 값이 정해지지 않고 변할 수 있는 변수가 존재하며, 최종 HTML 코드에는 상수만 존재할 수 있습니다.
< 코드의 형태 및 실행 메소드 >
템플릿상수
템플릿상수는 소스코드 단계에서부터 모든 페이지에서 동일한 값을 가지고 있어 값을 변경할 필요가 없는 데이터입니다.
템플릿 변수
템플릿 변수는 소스코드 단계에서부터 페이지마다 서로 다른 값을 가지고 있어 템플릿 파일에 변수의 형태로 데이터가 존재할 필요가 있는 값을 나타내는데 사용합니다. 이러한 템플릿 변수가 중간코드로 컴파일(?)되면서 두 가지 형태로 나누어지게 됩니다. 첫 번째 형태는 템플릿 파일에서 변수로 존재하던 값이 중간코드에서 상수로 바뀌게 되는 경우이고, 두 번째 형태는 중간코드에서도 계속 변수로 남아있게 되며, 중간코드에서 HTML 코드로 해석되는 단계에서 그 값이 지정되는 경우입니다. 첫 번째 형태를 스태틱 템플릿 변수, 간단히 줄여서 스태틱 변수라고 하고, 두 번째 형태를 다이내믹 템플릿 변수, 간단히 줄여서 다이내믹 변수라고 합니다.
스태틱 변수 및 다이내믹 변수의 용도
스태틱 변수와 다이내믹 변수의 용도를 구분해서 사용할 필요성에 대하여 아직 이해가 잘 되지 않겠지만, 이것은 응용하기에 따라서는 상당히 중요하면서도 필수적인 개념입니다. 한가지 예를 들어보죠. PHP 프로그래머라면 대부분 한번쯤은 게시판을 만들어보셨거나 아니면 최소한 남의 소스코드 정도를 분석해 보았을 것입니다. 게시판 요소 중에 글쓰기와 글수정 하기는 거의 동일한 레이아웃과 데이터를 가지고 있고 단지 몇몇 부분만 다르다는 것을 알고 있을 겁니다. 글쓰기 페이지와 글수정하기 페이지는 하나의 템플릿 파일로 구성할 수 있으며 이 때에 템플릿 파일에서 동일한 부분은 템플릿상수로 표현하고, 다른 부분은 스태틱 템플릿 변수로 표현하면 됩니다. 그러면 다이내믹변수는 무엇을 위해 사용하느냐 고요? 템플릿 상수와 스태틱 변수는 모두 하나의 페이지 내에서 보면 그 페이지에서는 고정된 데이터를 표현하는 것입니다. 그러면 현재 페이지에서 고정되지 않고 실행할 때마다 변경되어야 하는 데이터, 예를 들면 데이터베이스에서 읽어들인 현재 레코드의 값을 표현하는 것이 다이내믹 변수입니다.
다이내믹 템플릿 변수
스태틱 템플릿 변수는 PHP 스크립트의 변수와 같은 형태와 성질을 가지고 있는 것이고, 단지 사용범위(scope)가 템플릿 파일에 제한된다는 차이만 있는 것이니 이해하는데 별 어려움이 없을 것입니다. 그러나 다이내믹 변수는 앞장에서 모드지정자 value를 설명하면서도 언급하였지만 존재하는 형태가 PHP 코드의 변수뿐만 아니라 함수 또는 별도의 파일의 형태로도 존재할 수 있습니다. 다이내믹 변수로 지정할 수 있는 수단을 다시 한번 나열하면 아래와 같습니다.
  1. 디스크립션
  2. PHP의 전역변수
  3. PHP의 전역함수
  4. PHP 클래스의 프로퍼티
  5. PHP 클래스의 메소드
  6. 별도의 텍스트 파일
다른 것이야 이미 다 아는 것이고, 디스크립션은 새로운 개념이라 설명하겠습니다. 디스크립션은 중간코드 상에서 문자열의 형태를 가지고 있습니다. 그러면 문자열상수가 아니냐고요? 상수가 아닙니다. 형태는 상수형태를 띠고 있지만 중간코드에서 HTML 코드로 해석하는 단계에서 그 값이 다른 문자열로 변경될 수 있는 특징을 가지고 있습니다. 그래서 문자열상수라고 표현하지 않습니다. 그러면 문자열 변수가 아니냐고요? 변수가 아닙니다. 변수라면 특정 변수명으로 저장된 값에 접근할 수 있어야 하는데 그런 수단이 없습니다. 디스크립션의 값을 바꿀 수 있는 것은 특정함수를 통해서만 가능합니다. 이는 고급 메소드에 속하는 것으로 현재 그 인터페이스가 아직 정하여지지 않았으며 따라서 현재까지는 디스크립션 값을 바꿀 수 있는 공개된 방법이 없습니다.
템플릿상수 & 디스크립션
템플릿상수와 디스크립션을 구분하는 것은 쉽지 않습니다. 물리적인 면에서 보면 서로 중복되는 부분이 있습니다. 따라서 템플릿상수와 디스크립션을 명확히 구분할 수 있는 것은 논리적인 면에서 가능합니다. 템플릿 상수가 웹애플리케이션이 동작되는 처음부터 마지막 순간까지 그 값이 전혀 변하지 않는다면 디스크립션은 중간코드에서 그 값을 바꿀 수가 있습니다. 템플릿 파일(UTIS 데이터)에서 보면 템플릿상수와 디스크립션 데이터가 구분되지 않는 부분이 있습니다. 개발자가 중간코드에서 템플릿상수 값을 변경시키면 그 데이터는 디스크립션인 것입니다. 이러다 보니 유닛테이블에서는 사실 템플릿 상수라는 데이터 구조는 거의 없습니다. 대신 디스크립션이라는 데이터 구조를 가지고 템플릿상수를 표현합니다. 디스크립션이 템플릿상수를 포함하고 있는 좀 더 포괄적인 개념인 것이지요. 즉, 템플릿상수의 값이 절대 변할 수 없다면, 디스크립션은 템플릿상수 값도 바꿀 수 있도록 한 것입니다.
다이내믹 템플릿 변수의 사용위치
디스크립션을 제외한 나머지 다이내믹 변수는 value 지정자 내에서만 사용할 수 있습니다. value 지정자 내에서는 위에서 예와 같이 desc 속성지정자로 속성 값이 디스크립션임을 나타낼 수 있으나, id 지정자와 value 지정자를 제외한 모든 속성지정자의 속성 값은 그 자료구조가 기본적으로 디스크립션입니다.

Posted by 방글24