날짜: 1996-04-30 | 글쓴이: 도아 | 11333 번 | 프린트 | 메일로보내기

제 30강 - 쿠키


쿠키는 상태정보를 저장할 수 없는 웹 서비스에서 상태정보를 저장하기위해 개발된 기법으로 CGI와 같은 서버쪽 인터페이스에서 클라이언트에 상태정보를 저장(cookies.txt)하고 추출할 수 있는 시스템이다. 동작원리

1. Request
클라이언트가 서버측에 문서요청을 한다.
2. Call
서버는 Cookie를 검사하기위해 CGI를 호출한다.
3. Set
Cookie가 없는 경우에 CGI는 Set-Cookie 헤더를 포함한 출력을 서버에 리턴한다.
4. SetCookie
Set-Cookie 헤더에 부가 헤더를 덧붙여 Body 함께 클라이언트에 전송한다.
5. Save
Set-Cookie 헤더를 받을 클라이언트는 Cookie 정보(Name=Value, Expires Date, Path, Domain)를 Cookies.txt라는 파일에 저장한다.
6. Read, 7. Send Cookie
Cookies.txt에 등록된 동일한 Domain의 동일한 Path를 사용자가 요청하는 경우 클라이언트는 Cookie 정보를 Cookie: 헤더를 이용해서 서버로 전송한다.
8. Call
서버는 클라이언트로부터 받은 Cookie 정보를 환경변수(HTTP_COOKIE)에 저장하고 CGI를 호출한다.
9. HTTP_COOKIE
CGI는 HTTP_COOKIE로부터 Cookie 정보를 복원해서 서버로 전송한다.
활용범위 쇼핑백

백화점과 같은 가상 Mall에서 사용자가 선택한 물품정보를 저장. 질의정보 저장

검색엔진에서 사용자의 질의를 Cookie에 저장한 후, 접속시 이전 질의어를 출력.

예: <A HREF="http://search.microsoft.com/">Microsoft사의 검색엔진</A> <a href='http://search.microsoft.com/' target='_blank' style='border-bottom: none'><IMG src='/images/external.png' align='middle' border=0 style='border-bottom: 0'></a>
환경정보 저장

사용자가 설정한 환경정보를 저장하고 해당사용자가 다시 접속할 때 사용자 정보를 복원

예: <A HREF="http://ftpsearch.ntnu.no">FTP Search</A> <a href='http://ftpsearch.ntnu.no' target='_blank' style='border-bottom: none'><IMG src='/images/external.png' align='middle' border=0 style='border-bottom: 0'></a>
Cookie의 사용형식 Cookie의 설정(서버)

Set-Cookie 헤더의 각 필드는 ;로 구분되며 Name=Value를 제외한 나머지 필드는 생략할 수 있다.

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
NAME=VALUE
클라이언트가 서버에 전송하게되는 실제적인 정보로 Set-Cookie 헤더에 반드시 포함되어야 한다. 저장할 쿠키의 이름과 값을 말하며, Name=Value 필드는 Set-Cookie헤더에 오직하나만 포함해야한다. 세미콜론(;), 쉼표(,), 공백( )을 제외한 어떠한 것도 입력할 수 있다. 이 문자들을 나타내기 위해서는 URL 인코드 방식과 같이 "%HH"를 이용해도 되며, 어떠한 다른 인코딩 방법을 사용해도 된다.
expires=DATE
저장된 쿠키의 유효기간을 지정한다. 지정된 기간이 지나면 해당 쿠키가 사라지게 된다. 시간은 "Wdy, MM-DD-YY HH:MM:SS GMT"와 같은 형식으로 지정한다. 만약 지정되지 않으면 클라이언트가 종료할 때까지만 유효하며, 클라이언트를 종료하면 해당 쿠키는 사라진다. 클라이언트를 종료한 후에도 쿠키를 참조하기위해서는 반드시 expires=Date를 지정해야한다.
domain=DOMAIN_NAME
Set-Cookie 헤더를 출력하는 서버의 도메인 명을 지정한다. Set-Cookie를 출력하는 CGI의 URI가 http://qaos.com/cgi-bin/cookie.cgi라면 domain=comp.mailx2.com이 지정된다.

클라이언트는 요청한 URI가 지정된 도메인 안에 있어야만 저장된 쿠키를 서버쪽에 넘겨주게 된다. 도메인은 뒷부분부터 부분문자열 검색(substring search)을 행하여 일치되면 지정된 도메인안에 있는 것으로 간주된다.

또한 지정된 도메인 안에 있는 서버만이 쿠키를 다시 지정할 수 있다. 상위 7가지 특수한 도메인은 적어도 두자리, 그 외의 도메인은 적어도 세자리를 필요로 한다. 만약 이 속성이 지정되어 있지 않으면, 기본적으로 Set-Cookie 헤더를 출력하는 서버의 주소가 지정된다.
path=PATH
네스케잎이 쿠키정보의 전달여부를 판단하는 기준이 되는 필드로서 저장된 쿠키의 유효한 경로를 지정한다. 만약 도메인이 유효하다면, 다시 경로를 앞부분부터 부분문자열 검색하여 일치되면 비로소 저장된 쿠키를 서버쪽에 넘겨주게 된다. 만약 이 속성이 지정되어 있지 않으면, 기본적으로 쿠키를 지정하는 HTTP 응답헤더와 같이 넘어오는 문서의 경로로 지정된다. 위의 예에서는 /cgi-bin이 된다.
secure
만약 이 필드를 지정하면 쿠키를 SSL을 통해서만 전송한다.
Cookie의 전송

지정된 도메인의 지정된 경로의 문서를 요청하면 클라이언트는 다음과 같은 Cookie 헤더를 서버측으로 전송함으로서 Cookie 정보를 전송한다.

Cookie: NAME=VALUE

일치되는 Cookie가 하나 이상일 경우에는 다음과 같은 형식의 Cookie 헤더를 전송한다.

Cookie: NAME1=VALUE1; NAME2=VALUE2
Cookie의 변경, 삭제 삭제

expires를 지난 시간으로 설정하면 쿠기는 삭제된다. 변경

같은 경로의 같은 이름의 다른 값을 지정하면 쿠기는 변경된다. Cookie의 제한

  • 전체적으로 300개의 쿠키가 저장될 수 있다.
  • 각 쿠키별로 이름과 값을 합하여 4 KB까지 저장될 수 있다.
  • 서버나 도메인별로 20개의 쿠키가 저장될 수 있다.
주의사항

프락시 서버(proxy server)를 이용할 경우 쿠키가 캐쉬되므로 캐쉬되지 않도록 HTTP의 Pragma General Header을 no-cache로 해야 한다. 사용예 저장

Set-Cookie Header 사용

예) Set-Cookie: name=Jae-Geun&password=1111; Expires=12-31-99
변경

같은 경로, 같은 도메인을 갖는 Set-Cooke Header 사용

예) Set-Cookie: name=Jae-Geun&password=2222; Expires=12-31-99
삭제

Expire를 과거의 날자로 지정

예) Set-Cookie: name=Jae-Geun&password=1111; Expires=01-01-80
복원

$ENV{'HTTP_COOKIE'} 이용 간단한 예

다음은 쿠키를 설정, 복원, 변경, 삭제하는 예이다.

 1 : #! /usr/local/bin/perl
 2 : require './cgi-lib.pl';
 3 : 
 4 : &ReadParse;
 5 : 
 6 : if($ENV{'HTTP_COOKIE'} ne "") {
 7 :     &RetriveCookie;
 8 :     if ($in{command} eq "erase") {
 9 :         &SetCookie("01-01-80", "쿠키가 삭제되었습니다");
10 :     }elsif($ENV{'REQUEST_METHOD'} eq 'POST' && $in{command} eq "") {
11 :         &SetCookie("12-31-99", "쿠키가 변경되었습니다");
12 :     } else {
13 :         print &PrintHeader;
14 :         print &HtmlTop;
15 :         print &PrintForm;
16 :         print &HtmlBot;
17 :     }
18 : } elsif($ENV{'HTTP_COOKIE'} eq "" && $ENV{'HTTP_REFERER'} =~/cookie.cgi {
19 :     &SetCookie("12-31-99", "쿠키가 저장되었습니다");
20 : }else {
21 :     print "Location: /~artech/cookie.html\n\n";
22 : }
23 : 
24 : sub RetriveCookie {
25 :     $cookie = $ENV{'HTTP_COOKIE'};
26 :     @cookie = split(/&/, $cookie);
27 :     for(0..$#cookie) {
28 :         ($name, $value) = split(/=/, $cookie[$_]);
29 :         $cookie{$name} = $value;
30 :     }
31 : }
32 : 
33 : sub SetCookie {
34 :     print "Set-Cookie: name=$in{name}&password=$in{password}&
		selected=$in{selected}; expires=$_[0] TZ\n";
35 :     print "Pragma: no-cache\n";
36 :     print &PrintHeader;
37 :     print &HtmlTop("$_[1]");
38 :     print "<li> Netscape을 종료한 후, 다시 기동해서 <a href="/~artech
		/cookie1.html"> 이페이지</a>를 블러오면 쿠키가 저장, 변
		경, 삭제된 것을 알수 있습니다.";
39 :     print &HtmlBot;
40 : }
41 : 
42 : sub PrintForm {
43 : $value = $cookie{selected};
44 : $cookie{$value} = "selected";
45 : $form =<<Form
46 : <html><head>
47 : <title> Cookie를 시험하고 있습니다 </title>
48 : </head>
49 : <body>
50 : <h2> 당신의 쿠키는 다음과 같이 복원되었습니다.</h2>
51 : <li> 변경하려면 변경버튼을 누르시면 됩니다.</li>
52 : <li> 삭제하려면 삭제를 선택한 후, 변경 버튼을 누르면 됩니다.</li>
53 : <form action="/~artech/cgi-bin/cookie.cgi" method="POST">
54 : <table border=3>
55 : <tr>
56 :     <th> 이름 </th>
57 :    <th> 비밀번호 </th>
58 :     <th> 선택 </th>
59 :   
60 :     <th> 삭제 </th>
61 :     <th> &nbsp </th>
62 :     </tr>
63 :     <tr>
64 :        <td> <input type="text" name="name" value="$cookie{name}" 
65 : 						size=8 maxlength=8> </td>
66 :         <td> <input type="password" name="password" 
67 : 			value="$cookie{password}" size=8 maxlenght=8> </td>
68 :         <td> <select name="selected">
69 :             <option value=apple $cookie{apple}> 사과
70 :             <option value=kiwi $cookie{kiwi}> 키위
71 :             <option value=orange $cookie{orange}> 오랜지
72 :             </select>
73 :         </td>
74 :         <td> <input type="checkbox" name=command value="erase"> </td>
75 :         <td> <input type="submit" name="submit" value="변경"></td>
76 :     </tr>
77 : </table>
78 : </form>
79 : </html>
80 : Form
81 : }
실행결과

pcookie.cgi



다음글: 제 31강 - 파일 업로드(File Upload) - 소스 변경중 (5334)1996-04-30
이전글: 제 29강 - 서버 푸쉬(Server Push) (10279)1996-04-29

세상사는 이야기

  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >
  • 탈옥의 필수, QuickDo >
  • 윈도 10, 한영 전환도 >
  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2014 QAOS.com All rights reserved.