넷스케잎 1.1이상의 버전은 소위 쿠키라는 것을 지원한다. 이 쿠기는 브로우저 세션정보를 유지하기위해 고안된 것이다. CGI.pm은 쿠키를 지원하는 여러가지 메소드를 가지고 있다.
쿠기는 CGI 질의 문자열내의 매개변수처럼 name=value 쌍으로 구성된다. CGI 스크립트는 하나 또는 그 이상의 쿠키를 생성하고 이들을 HTTP 헤더를 통해 브로우저로 전송한다. 브로우저는 특정 웹 서버에 속한 쿠키 목록을 유지하고 있다가 이어지는 세션동안 CGI 스크립트에 이들 쿠키를 리턴한다.
반드시 필요한 name=value 쌍 이외에 각각의 쿠키는 추가적인 여러 가지 속성을 가질 수 있다.
만료기간(expires)
이 것은 쿠키의 만료 시점을 지시하는 시간/날자 문자열(특수한 GMT 형식)이다. 넷스케잎을 종료하고 다시 시작할 지라도 쿠키는 만료일에 도달할 때까지 유지되며 CGI 스크립트로 리턴된다. 만료일이 지정되지 않으면 쿠키는 넷스케잎을 종료할 때까지만 유효하게 된다.
도메인(domain)
이 것은 쿠키가 유효한 부분 또는 완전한 도메인 명이다. 브로우저는 부분 도메인 명이 일치하는 호스트에대해 쿠키를 리턴한다. 예를들어 도메인 이름을 ".soongsil.ac.kr"로 지정하면 넷스케잎은 ".soongsil.ac.kr."내에 존재하는 컴퓨터(comp.mailx2.com, syscon.soongsil.ac.kr, cupid.soongsil.ac.kr 등)에서 기동되는 웹서버에만 쿠기를 리턴한다. 도메인 명은 적어도 두개이상의 마침표(.)를 포함해야 한다. 이 것은 ".kr"과 같이 최상위 도메인을 사용하지 못하게하기 위한 것이다. 어떠한 도메인도 지정되지 않으면 브로우저는 쿠키를 설정한 서버에만 쿠키를 리턴한다.
경로(path)
쿠기에 경로 속성을 제공하면 쿠키를 리턴하기전에 스크립트의 URL을 검사한다. 예를들어 "/cgi-bin"이라는 경로를 지정하면 "/cgi-bin/tally.cgi", "/cgi-bin/order.cgi"과 "/cgi-bin/customer_service/complain.cgi"라는 스크립트 각각에 대해서는 쿠키가 리턴되지만 "/cgi-private/site_admin.cgi" 스크립트에는 쿠키가 리턴되지 않는다. 기본적으로 경로는 "/"로 설정되며 따라서 해당 도메인의 모든 CGI 스크립트로 쿠기가 전송된다.
secure
"secure" 속성이 설정되면 쿠키는 SSL과 같은 보안 통신로를 통해 CGI 요청이 이루어 지는 경우에만 스크립트로 쿠키를 전송한다.
use CGI;
$query = new CGI;
%answers = $query->cookie(-name=>'answers');
# $query->cookie('answers') 역시 잘 동작한다
쿠기와 CGI 이름공간은 분리되어 있다. 'answers'라는 기명 매개변수와 'answers'라는 쿠키를 가지고 있다면 이들은
param()
과
cookie()
에의해 독립적으로 리턴된다. 그러나 CGI 매개변수를 cookie로 변환하고, cookie를 CGI 매개변수로 변환하는 것은 쉽다.
# CGI 매개변수를 쿠키로 변환
$c=$q->cookie(-name=>'answers',-value=>[$q->param('answers')]);
# 꺼꾸로
$q->param(-name=>'answers',-value=>[$q->cookie('answers')]);
주의:
넷스케잎 쿠키에대한 몇몇 문서화되지 않은 제한이 있다. 적어도 넷스케잎 2.01에서 필자는 한번에 3개 이상의 쿠키를 설정할 수 없었다. 또한 쿠키의 길이도 제한된다. 많은 양의 정보를 저장할 필요가 있다면 유일한 세션 ID를 생성하고 이 것을 쿠키에 저장한 후 이 세션 ID를 이용해서 서버측의 파일이나 DB에 정보를 저장하는 것이 보다 나은 방법일 것이다.
이 것으로 넷스케잎은 프레임 이름이 "ResultsWindow"인 프레임으로 스크립트의 출력을 읽게된다. 만약 이 이름의 프레임이 존재하지 않으면 넷스케잎은 새로운 창을 열고 이 창으로 스크립트의 결과를 읽는다. 목적 창의 이름은 다양한 형태로 사용할 수 있다. 보다 자세한 것은 넷스케잎 홈페이의 프레임에대한 문서를 보기 바란다.
<FORM> 태그에서 문서의 목적창을 지정
FORM 태그에서 읽혀질 프레임을 지정할 수 있다. CGI.pm에서 이 것은 다음과 같은 형식을 갖는다.
print $q->startform(-target=>'ResultsWindow');
스크립트가 폼에의해 다시 호출될 때 이 스크립트의 출력은 프레임 이름이 "ResultsWindow"인 창에 출력될 것이다. 해당 프레임이 존재하지 않는다면 새로운 창이 생성될 것이다.
frameset.cgi은 입력폼과 그 응답을 인접 프레임으로 전송하는 방법을 보이고 있다.
메소드에 -style 매개변수를 지정할 수 있다. 이 매개변수의 값은 <STYLE> 섹션에 직접 병합하려는 경우에는 스칼라이며, 그렇지 않은 경우에는 해쉬 참조이어야 한다. 후자의 경우에 하나 또는 그 이상의 -src나 -code를 갖는 해쉬를 제공해야 한다. -src는 외부 서식 파일의 URL을 지정할 때 사용하며 -code는 <STYLE> 섹션으로 병합될 스칼라 값을 지정할 때 사용한다. -code 내의 서식 정의는 -src내의 동일한 이름보다 우선순위가 높다.
-style에의해 지정된 해쉬에 -type 매개변수를 추가함으로서 서식의 형식을 지정할 수 있다. 지정하지 않으면 서식은 기본적으로 'text/css'가 된다.
문서의 몸체내에서 서식을 참조하기위해 임의의 HTML 태그(메소드)에 -class 매개변수를 사용할 수 있다.
print h1({-class=>'Fancy'},'Welcome to DoA's World!!!');
또는 진행중에 스타일을 정의하기 위해 -style 매개변수를 사용할 수 있다.
print h1({-style=>'Color: red;'},'너 죽어봐라l');
텍스트의 일부분에 서식을 적용하기 위해 새로운 span()와 div() 태그를 사용할 수도 있다.
print span({-style=>'Color: red;'},
h1('지옥에 온것을 환영한다.'),
"지금부터 죽지도 살지도 못하는 고통을 맛보게 될 것이다. 우하하~~~"
);
주의:
span()와 div() 메소드를 사용하기위해서는 ":html3" 정의를 가져와야 한다. CSS를 사용하는 간단한 예가 여기 있다. CSS에대한 보다 자세한 정보는 도아의 CSS 강좌를 보기바란다.
NPH(Non-Parsed-Header) 스크립트는 완전한 HTTP 헤더를 직접 브로우저로 전송함으로서 서버를 완전히 우회하는 기법이다. 이 것은 다소 성능상의 잇점이 있지만 주로 서버에의해 직접 지원하지 않는 HTTP 확장(서버 밀기와 PICS 헤더와 같은)의 잇점을 취하기 위해 사용한다.
서버들은 NPH CGI를 설계할 수 있는 다양한 방법을 제공한다. 많은 Unix 서버는 스크립트의 이름이 "nph-"로 시작하는 지를 조사한다. 반대로 매킨토시의 WebSTAR 서버와 Money$oft의 IIS서버는 스크립트 출력의 첫 행을 조사함으로서 NPH 스크립트인지 아닌지를 결정한다.
CGI.pm은 서버 밀기를 구현하는(multipart 문서를 만드는)데 필요한 세가지 형식의 함수를 지원한다. 이들 함수는 Ed Jordan에의해 제공되었다. 이들을 이름 공간으로 가져오기 위해 ":push" 집합을 가져와야 한다. 또한 스크립트를 NPH모드로 두고 버퍼링 문제를 피하기위해 $|를 1로 설정해야 한다.
이 스크립트는 multipart_init()를 호출함으로서 서버 밀기를 초기화한다. 그리고 multipart_start()를 호출함으로서 새로운 multipart 섹션이 시작되며 무한루프에 들어간다. 현재의 로칼 시간을 출력하고 multipart_end()로 multipart 섹션을 종료한다. 1초 후 다시 루프가 시작된다.
multipart_init()
multipart_init(-boundary=>$boundary);
multipart 시스템을 초기화 한다. -boundary 인자는 문서의 각 부분을 분리하는데 사용되는 MIME 경계 문자열을 지정한다. 제공하지 않으면 CGI.pm이 타당한 경계 문자열를 생성한다.
multipart_start()
multipart_start(-type=>$type)
지정된 MIME 형식을 사용해서 multipart 문서의 시작한다. 지정하지 않으면 text/html로 가정된다.
multipart_end()
multipart_end()
multipart를 종료한다. 각각의
multipart_start()
에대해 한번의
multipart_end()
를 호출해야 한다.
서버 밀기 응용프로그램에 관심이 있는 사용자는 또한 CGI::Push 모듈을 조사해 보기 바란다.