9 단원 PHP 고급문법 1. 쿠키이해하기 2. 세션이해하기 1/7
1. 쿠키이해하기 1) 쿠키 PHP는 HTTP 쿠키를투명하게지원합니다. 쿠키는원격브라우저에데이터를저장하여다시온사용자를트래킹하거나식별하는메카니즘입니다. 쿠키는회원인증과도관련하여사용되는문법입니다. 여러분이로그인을했다라는정보를담을때많이사용됩니다. 즉, 사용자의상태나접속정보저장합니다. 여러분은쿠키라고하면과자를떠올릴수가있는데, 여기서는과자의의미가없습니다. 쿠키라함은클라이언트의정보를저장할때많이사용되는문법이며, 서버에서관여는하지만정보가서버에저장되는것이아니라클라이언트의컴퓨터에저장이되어지는것을의미합니다. 쿠키를이용하면사용자마다다른정보를가질수있습니다. 쿠키는운영체제마다다를수있겠지만, 일반적은 window2000 professional은 C: Documents and Settings Administrator Cookies 라는폴더안에그내용이저장됩니다. 이곳에는여러분이사이트에접속시일반적으로여러분이로그인할때사용한계정이름으로쿠키가저장됩니다. 그리고웹사이트를서핑하다보면여러사이트들에서쿠키를사용함을알수있습니다. 사이트 url로되는쿠키를보실수있습니다. 쿠키가저장되는파일을텍스트파일입니다. 쿠키는클라이언트컴퓨터에정보가저장되기때문에누구에게나정보노출이가능합니다. 그러므로보안상쿠키에저장되면안됩니다, 쿠키에담을때는비밀번호나나주민번호같은것은저장시키면안됩니다 setcookie() 함수를사용하여쿠키를설정할수있습니다. 쿠키는 HTTP 헤더의일부분이기에, setcookie() 는브라우저에어떠한출력이이루어지기전에호출되어야합니다. header() 가가지고있는것과동일한제약입니다. 출력버퍼링함수를사용하여쿠키설정이나헤더전송을결정할때까지스크립트출력을지연할수있습니다. 클라이언트로부터전송된어떠한쿠키데이터라도 GET과 POST 방식의데이터와마찬가지로, register_globals와 variables_order 환경설정변수에의존하여자동적으로 PHP 변수로변환됩니다. 하나의쿠키이름에여러변수를지정하고싶을때는, 단순히쿠키이름에 [] 를추가하면됩니다. 2/7
PHP 4.1.0과이후에는, 어떠한쿠키라도클라이언트로부터전송받았을때, $_COOKIE 자동전역배열이항상설정됩니다. 이전버전의 PHP 에서는 $HTTP_COOKIE_VARS 라는환경변수를사용하였습니다. 이변수를사용하기위해서는 track_vars 환경설정변수가 On으로설정되어있어야합니다. track_vars는 GET, POST, COOKIE 등으로전달된변수값을각각의 $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS 배열변수로자동저장여부를설정합니다. PHP 4.0.3 이후버전에서는 track_vars가항상 On으로설정되어있습니다. 브라우저버그에대한정보를포함한더자세한내용은 setcookie() 함수를참조하시면됩니다. 그리고, 쿠키는 HTTP 헤더의부분이기때문에쿠키설정및해제명령은 HTML문서앞에반드시사용하시면됩니다. PHP 는쿠키를설정위해 SetCookie( ) 함수를사용하는방법입니다. 2. 세션 1) Session 의의미와구현원리 3/7
PHP 3.0 에서는 4.0으로올라오면서가장눈이띈변화라면세션을사용할수있다라는것입니다.. 세션의의미를말씀드린다면어떤유저가어떤특정사이트를접속하여머물러있는시간이라고말할수있습니다. 좀더어렵게설명을한다면, 웹서버는서로다른유저들로부터서버내에있는페이지를요청이들어올경우에각유저들의컴퓨터에유일무이한식별키를쿠키의형태로발급하여해당유저가사용자의정보즉, 사용자의로그인이나기타입력된정보를서버내에저장하여유저가다시접속하였을때유저에게발급한식별키를이용하여서버쪽에저장해놓은정보 ( 세션값 ) 를가져옴으로써유저를구별하는원리로구현된다고볼수있습니다. 2) Session 다루기 1 세션저장방법 우선 PHP 에서세션데이타를서버상에저장하는방법에대해서설명을하면, 첫번째, 사용자의데이터를환경설정파일 (PHP.ini) 에서지정한디렉토리에파일로저장하는방식으로가장기본적인방법이라고할수있습니다. 자예를들어유저의시스템에저장한식별키가 "0cd9cdv1vdf4fd4" 이라면서버내지정한디렉토리에는 "sess_0cd9cdv1vdf4fd4" 라는이름을갖는파일로생성하게됩니다. 그러므로식별키가 "0cd9cdv1vdf4fd4" 인유저가사이트에접속했을때서버에서는이식별키에해당하는파일을열어해당사용자의정보를가져오게되는방법입니다. 두번째, 서버의파일이아닌서버의메모리에저장하는방식으로파일로저장하는방법보다, 높은성능을기대할수있습니다. 특징으로접속한유저의시스템에식별키를발급할때 32개의문자열로이루어진세션아이디를생성한다는점입니다. 이값은유저의시스템에저장되며유저가서버에접속했을때브라우저를통해서버에자동전송되므로서버쪽에서웹사이트에접속해있는유저를서로구별할수있는근거가될수있습니다. 세번째, 사용자가직접세션을다루는방식을정의하는방법으로보통이방법을이용하여세션데이터를파일이나메모리, 혹은데이타베이스에저장하여관리하는방법입니다. 이렇게생성한세션아이디값은보통쿠키방식을통해사용자의시스템에저장한다는점입니다. 그러나만약에유저의브라우저가쿠키를허용하지않도록설정되어있다면, 이방식은아무런의미가없겠습니다. 따라서이때에는쿠키가아닌다른방식으로웹서버에사용자의식별키를전달할수있는방법을사용해야하며이럴경우보통은웹페이지요청시에세션아이디값을 get이나 post방식을통해함께전달해주는방식을사용합니다. 2 세션생성, 등록, 삭제및종료하기 세션을시작하는방법은간단하다.. 4/7
<? session_start()?> 이렇게세션함수를호출하면유저의시스템에이전에발급된유효세션이있는지확인하게되고, 검사결과이전값이없다면, 새로세션아이디를생성하고이전에발급한아이디가있고, 유효하다면, 서버에저장한데이터를그대로사용하게되는것입니다. 이때세션아이디는기본적으로 PHPSESSID라는이름을갖는변수에저장됩니다. 예를들어세션아이디값이 "3dff4fdg4h43" 이라면쿠키변수 $HTTP_COOKIE_VARS["PHPSESSID"] 에이세션아이디값이저장되는것입니다. 자이제값을등록시켜봅시다. <? session_start() session_register("name"); $name="kimchikuk";?> 세션등록은 session_register라는함수를사용합니다. 이렇게등록된세션파일안에는 name s:4:"kimchikuk"; 이라는내용이들어가게됩니다. 즉, name이라는변수로세션을등록하였습니다. 세션변수삭제방법또한간단합니다. <? session_start() session_unregister("name");?> 마지막으로세션를종료하려면 session_destory(); 라는함수를쓰면됩니다. 세션을종료한다는의미는현재의세션과관련된모든데이터를삭제한다는의미입니다. 즉이함수를호출한사용자의세션에등록되어있는모든데이터를완전히삭제한다는뜻입니다. 웹서버측에서본다면로그아웃을하지않고브라우저를닫았을때와같이사용자의세션이언제끝났는지 5/7
그시점을알수없는경우가있습니다. 그래서웹서버가사용자의세션을무효화시킬지를결정하는방법을알려드리겠습니다. php의세션설정항목중에 session.gc_maxlifetime 항목의값을수정해주는방법입니다. 보통은 1440초즉 24분으로되어있는데이걸줄여주는방법이있습니다. session.gc_probiblty는 session.gc_divisor와관련된가비지콜렉션을의시작을설정하는옵션입니다. 더이상의미없는세션데이터를삭제하는실행주기를설정하는항목으로기본값은 1로되어있지만, 1이라함은 1% 를의미합니다. 즉, 사용자가브라우저를닫는건서버에서잡아낼수없습니다. 대신 gc 설정으로, 일정시간이지난파일들을삭제가가능합니다. 새로운세션을시작할때 gc_maxlife로설정된시간동안접근이없는세션을 gc_probability/gc_divisor 확률로삭제한다는의미입니다. session.gc_divisor의 default가 100이므로, session.gc_probiblty 가 1이면 1/100 즉 1% 의확률로가비지콜렉션이실행된다는의미입니다. 3) Session 처리함수소개함수 - session_start - session_register - session_unregister - session_unset - session_destroy - session_is_registered - session_save_path - session_name - session_id - session_module_name - session_get_cookie_params - session_set_cookie_params - session_encode - session_decode - session_cache_limiter - session_set_save_handler 기능세션을생성하는함수현재연결된세션에데이터를저장할변수를등록하는함수현재연결된세션에서특정변수를삭제시키는함수현재연결된세션에등록되어있는모든변수의값을삭제하는함수현재의세션을종료시키는함수세션변수가현재의세션에등록되어있는지를조사하는함수세션데이터파일저장되어있는경로를반환하거나지정한디렉토리로변경하는함수현재의세션이름를반환, 지정한이름으로변경하는함수현재의세션아이디를반환하거나지정한값으로변경하는함수세션데이터다루는저장방식에관한정보를반환시키는함수세션쿠키와관련된정보를배열의형태로반환시키는함수세션쿠키를발급할때필요한인자를설정하는함수현재의세션에저장되어있는데이터를인코딩하여인코딩된문자열를반환하는함수입니다. 함수의인자로전달한세션데이터를디코딩해주는함수현재 cache limiter 항목의값으로설정되어있는이름을반환하거나이이름을지정한이름으로변경하는함수세션을다룰수있는사용자정의함수를구현 6/7
4) Session 예제 간단한세션을열고닫는예제파일을통해서세션이동작하는것을테스트해보겠습니다. 7/7