본문 바로가기

프로그래밍

perl - 쿠키 사용 예제

반응형

Chapter 16. Cookie의 이해



--------------------------------------------------------------------------------

이 장에서는 Cookie의 실제 활용예 및 더 깊은 부분은 설명하지 않는다. Cookie는 어떤 것이며, Cookie의 작동 원리에 대해서만 간단하게 설명하도록 한다. 

--------------------------------------------------------------------------------


I. Cookie란?

HTTP Protocol에서 지원하는 사용자의 특정 정보를 저장하는 기법 

클라이언트의 브라우저에 저장되며 그와 동시에 서버에도 저장될 수 있음 

일정 기간 동안만 유효하게 할 수 있고, 유효기간(만료기한)이 설정되지 않을 경우

브라우저 종료시 자동으로 사라짐 

클라이언트에는 브라우저가 실행중에는 메모리에, 종료될 경우 만료기한에 따라 

cookies.txt라는 파일에 저장될 수 있음 

서버에는 HTTP Daemon의 환경변수 HTTP_COOKIE 에 저장됨 


--------------------------------------------------------------------------------


II. Cookie의 활용

간단한 사용자 정보 보관에 사용 

매 페이지마다 사용자 정보의 지속적인 유지가 필요할 경우 사용 

(주로 인트라넷에서 사용) 

악용하면 개인정보 침해에도 응용할 수 있음 


--------------------------------------------------------------------------------


III. Cookie의 생김새

Cookie는 다음과 같은 구조로 되어 있다.


Set-Cookie: name=value; expires=[Date]; domain=[Domain]; path=[Path]; [secure] 

name(필수 요소) 

Cookie에 저장하고자 하는 이름 

value(필수 요소) 

Cookie에 저장된 이름(name)에 대한 값 

expires(생략 가능) 

Cookie가 설정된 후 Cookie가 무효화되는 시간이다.

(GMT Type - "Wdy, DD-Mon-YYYY HH:MM:SS GMT")

설정된 시간이 지나게 되면, 이 Cookie는 사용할 수 없게 된다. 만약 expires에 설정된 시간보다 더 일찍 브라우저가 종료될 경우, 브라우저는 자동으로 cookies.txt 라는 파일을 생성하여 그 정보를 이 파일에 저장해 둔다. 

domain(생략 가능) 

웹 서버의 도메인 명을 설정한다. 설정하지 않으면 현재 Cookie를 보내는 문서가 속한 도메인 명으로 설정된다. 

path(생략 가능) 

문서 및 CGI 스크립트의 경로명을 설정한다. 설정하지 않으면 현재 Cookie를 보내는 문서의 URL상의 경로(도메인 명 제외)로 설정된다. 

secure(생략 가능) 

HTTPS Server(HTTP over SSL)와 같은 Secure Server에서 Cookie를 보낼 경우 이 값을 설정해 준다. 

다음은 쿠키를 사용하는 예이다. 

Set-Cookie: cval=1234; domain=users.unitel.co.kr; path=/~khmbass/cgi-bin/ 


--------------------------------------------------------------------------------


IV. Cookie의 주고받기

서버에서는 Cookie를 HTML 문서가 전송될 때 다음과 같은 식으로 클라이언트에 보낸다.

Content-type: text/html

Set-Cookie: cval=1234


<html>

<head>

....



그러면, 브라우저는 Cookie를 받아 메모리에 임시로 저장한다.


서버에서는 이 Cookie값이 필요할 경우 CGI 프로그램을 통해서 환경변수

HTTP_COOKIE를 얻기만 하면 서버에서 이 Cookie 데이타를 활용할 수 있게 된다.


만약, expires가 설정되었을 경우 expires에 설정된 시간보다 더 일찍 

브라우저가 종료될 경우는 개인 PC에 cookies.txt라는 파일에 이 Cookie 정보를 기록한다. 


--------------------------------------------------------------------------------


V. Javascript로 Cookie 설정하기

만약, 다음과 같이 자바스크립트를 특정 HTML 문서에 구현하게 되면 Cookie 값을 설정할 수 있다. 

<html>

<head>

<script language="JavaScript">

<!--

function SetCookie(name, val) {

  document.cookie=name + "=" + val;

}

SetCookie("cval", "1234");

//-->

</script>

</head>

<body>

.....


 



--------------------------------------------------------------------------------


VI. Cookie 예제 1

(1) Cookie값으로 브라우저에 cval1=1234, cval2=5678를 보내는 PERL Source

Cookie는 서버에서 MIME Type Header를 보내고 나서 Set-Cookie 헤더를 print 문으로 전송할 수 있다. 

#!/usr/local/bin/perl


print "Content-type: text/html\n";

print "Set-Cookie: cval1=1234\n";

print "Set-Cookie: cval2=5678\n";

print "\n";


print <<ENDHTML;

<html>

<body>

Cookie "cval1=1234", "cval2=5678" was sent to browser...

</body>

</html>

ENDHTML


 


▶ 결과 보기(ctest.cgi) 


(2) 설정된 Cookie "cval1", "cval2"을 브라우저로부터 가져오는 PERL Source

Cookie를 브라우저로부터 가져오려면 CGI 요청시 HTTP_COOKIE 라는 환경변수에서 Cookie값을 읽어오면 된다. 

#!/usr/local/bin/perl


print "Content-type: text/html\n";

print "\n";


print <<ENDHTML;

<html>

<body>

$ENV{'HTTP_COOKIE'}

</body>

</html>

ENDHTML


 


▶ 결과 보기(ctest2.cgi) 



--------------------------------------------------------------------------------


VII. Cookie 예제 2

(1) 예제 1에서 설정된 Cookie 값들을 변수에 지정해서 거기에 1씩 더하는 PERL Source

읽어온 Cookie 문자열을 조작하여 조합 배열에 할당한 후, 이 값을 이용할 수 있다. 

#!/usr/local/bin/perl


$recievedcookie = $ENV{'HTTP_COOKIE'};

@cookies = split(';', $recievedcookie);


foreach $ck (@cookies) {

   $ck =~ s/ //g;

   ($cookiename, $cookieval) = split('=', $ck, 2);

   $COOKIE{$cookiename} = $cookieval;

}


if ($COOKIE{'cval1'}) {

   $COOKIE{'cval1'}++;

else {

   $COOKIE{'cval1'} = "\"cval1\"이 없습니다.";

}


if ($COOKIE{'cval2'}) {

   $COOKIE{'cval2'}++;

else {

   $COOKIE{'cval2'} = "\"cval2\"가 없습니다.";

}


print "Content-type: text/html\n";

print "\n";


print <<ENDHTML;

<html>

<body>

Cookie "cval1" : $COOKIE{'cval1'}<br>

Cookie "cval2" : $COOKIE{'cval2'}

</body>

</html>

ENDHTML


 


▶ 결과 보기(ctest3.cgi) 



--------------------------------------------------------------------------------


VIII. Cookie 예제 3

(1) 위의 예제 1을 변형하여, 만료일을 설정하여 브라우저로 보내는 예제

만료일은 소스에서 localtime() 이라는 perl 함수에 현재시간에 초단위 시간을(1시간 : 3600초) 더해줌으로써 설정 가능하다. 

#!/usr/local/bin/perl


$date_command = "/usr/bin/date";


# Wdy, DD-Mon-YYYY HH:MM:SS GMT

@weekday = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

@months  = ('Jan', 'Feb', 'Mar', 'Apr', 'May' ,'Jun',

   'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');


($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+3600);


$sec = "0$sec" if ($sec < 10);

$min = "0$min" if ($min < 10);

$hour = "0$hour" if ($hour < 10);

$mon = "0$mon" if ($mon < 10);

$mday = "0$mday" if ($mday < 10);

$year = `$date_command +"%Y"`; chop($year);

$month = ($mon + 1);

$expdate = 

  "$weekday[$wday-1], $mday-$months[$month-1]-$year $hour\:$min\:$sec GMT";


print "Content-type: text/html\n";

print "Set-Cookie: cval1=1234; expires=$expdate\n";

print "Set-Cookie: cval2=5678; expires=$expdate\n";

print "\n";


print <<ENDHTML;

<html>

<body>

Cookie "cval1=1234", "cval2=5678" was sent to browser...<p>

Expire Date : $expdate<p>

</body>

</html>

ENDHTML


 


▶ 결과 보기(ctest4.cgi) 


--------------------------------------------------------------------------------


반응형