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)
--------------------------------------------------------------------------------
'프로그래밍' 카테고리의 다른 글
전화 - 서울 지역별 국번 (0) | 2012.08.17 |
---|---|
윈도우 - 터미널세션 원격끊기와 원격리부트 (0) | 2012.08.17 |
윈도우 - 사용하지 않는 서비스 죽이기 (0) | 2012.08.17 |
부하분산 서버 스케쥴링 알고리즘 (0) | 2012.08.17 |
기타 - ISP DNS서버 IP (0) | 2012.08.17 |