날짜: 1996-03-17 | 글쓴이: 도아 | 7686 번 | 프린트 | 메일로보내기

제 17강 - CGI 명세 - 입력


CGI는 웹 서버와 외부 프로그램과의 연동을 위한 표준이므로, 웹 서버에서 CGI 프로그램으로, CGI 프로그램에서 웹 서버로, 서로 통신하는 방법이 마련되어 있어야 한다. 통신하는 방법이라 하는 것은 웹 서버가 클라이언트로부터 받은 입력 데이터를 CGI 프로그램에 어떻게 전달하며, 그 외에 여러가지 정보들을 어떻게 전달하느냐 하는 것과 외부 프로그램의 출력을 어디로부터 받느냐는 것이다. 즉, 간단하게 말하면 입력 방법과 출력 방법이라 할 수 있다. 다음에서 각각에 대해 알아보자. CGI로의 입력

웹 서버는 CGI로 데이터를 전달하기 위해서 세가지 방법을 사용한다. 첫 번째 방법은 환경변수에 의한 것이고 두 번째 방법은 표준입력에 의한 것이다. 마지막으로 명령행을 통해서도 입력을 전달할 수 도 있다. CGI 환경변수

Form 태그에서 Method를 GET으로 하거나 Isindex 태그를 사용하는 경우, CGI의 입력은 환경변수로부터 받아들여진다. 웹 서버는 CGI 프로그램을 수행시키기 전에 다음과 같은 환경 변수들을 설정해 놓은 후에 CGI를 호출한다. 다음은 CGI 프로그램 안에서 참조할 수 있는 환경변수들의 리스트와 각각의 의미이다. 서버관련 환경변수

서버에 관련된 환경변수로서 전부 httpd.conf에 설정된 값을 따른다. GATEWAY_INTERFACE(GET, POST)

웹 서버가 따르고 있는 CGI 표준의 버전. 형식: CGI/개정번호

예) CGI/1.1
SERVER_SOFTWARE(GET, POST)

인포메이션 서버 프로그램의 이름과 버전을 담고 있다. 형식: 이름/버전

예) NCSA/1.5.1
SERVER_NAME(GET, POST)

서버의 호스트 이름, 또는 DNS alias, 또는 IP 주소

예) syscon.soongsil.ac.kr
SERVER_PROTOCOL(GET, POST)

이 요청이 어떤 프로토콜을 따르고 있는 가를 나타낸다. 형식: 프로토콜/개정번호

예) HTTP/1.0
SERVER_PORT(GET, POST)

요청이 보내진 포트 번호. 일반적으로 Web Server는 80 포트를 사용한다.

예) 80
SERVER_ADMIN(GET, POST)

서버관리자의 e-mail address

예) webmaster@mailx2.com
DOCUMENT_ROOT(GET, POST)

Web Server의 Document Root

예) /home/htdocs
요청에 관련된 환경변수

Request Message를 통해 전달된 정보가 저장된다. AUTH_TYPE(GET, POST)

서버에서 사용한 인증절차. 인증절차가 없을 경우에는 NULL이 된다.

예) Basic
CONTENT_TYPE(POST)

서버에 전송중인 데이터의 형식. Method가 POST인 경우에만 값을 갖는다.

예) text/html
CONTENT_LENGTH(POST)

POST 요청시 표준입력에 전달한 바이트의 수를 나타낸다.

예) 100
PATH_INFO(GET)

CGI 프로그램명과 Query사이에 주어진 추가적인 상대 경로 정보.

예) /html/form
PATH_TRANSLATED(GET)

PATH_INFO와 같지만 가상 경로가 서버상의 실제 경로로 해석된다는 것이 다르다.

예) /home/html/form
QUERY_STRING(GET)

URI의 일부로 전달된 데이터로 URI의 ? 다음에 있는 부분이다.

예) name1=586&name2=486
REQUEST_METHOD(GET, POST)

요청에대한 데이터가 URI(GET) 이나 STDIN(POST)로 전송되었음을 명시한다.

예) POST
REMOTE_HOST(GET, POST)

요청을 한 호스트의 이름. 웹 서버가 이 정보를 얻을 수 없었을 때는 REMOTE_ADDR이 설정되며 이 정보는 설정이 되지 않는다.

예)syscon.soongsil.ac.kr
REMOTE_ADDR(GET, POST)

요청을 한 호스트의 IP 주소를 나타낸다.

예) 210.206.89.230
REMOTE_USER(GET, POST)

인증절차를 거쳤을 경우 사용자의 ID를 나타낸다.

예) artech
SCRIPT_NAME(GET, POST)

실행중인 CGI 프로그램의 이름.

예) /cgi-api/env.plx
클라이언트와 관련된 환경변수(HTTP)

HTTP_ 변수는 클라이언트에 의존한다. 따라서 모든 환경변수가 항상 존재하는 것은 아니다. HTTP_ACCEPT(GET, POST)

클라이언트가 받아들일 수 있는 MIME 타입의 리스트. 각 항목은 ','에 의해서 구분된다. 형식: type/subtype, type/subtype

예) image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
HTTP_ACCEPT_CHARSET(GET, POST)

사용중인 문자 셋트

예) "iso-8859-1,*
HTTP_ACCEPT_LANGUAGE(GET, POST)

현재 설정된 언어집합

예) ko, fr
HTTP_CONNECTION(GET, POST)

connection의 타입

예) keep-alive
HTTP_COOKIE(GET, POST)

Web에서 상태정보를 유지하기위해 사용되는 cookie 정보

예)name=111&pass=222
HTTP_HOST(GET, POST)

서버의 호스 명

예) syscon.soongsil.ac.kr
HTTP_REFERER(GET, POST)

현재 문서에 링크를 제공한 문서의 URL.

예) http://qaos.com/index.htm
HTTP_USER_AGENT(GET, POST)

브라우저의 종류. 형식: software/version

예) Mozilla/4.0b2 (Win95; I)
HTTP_PRAGMA(GET, POST)

서버와 클라이언트 사이에 존재하는 노드의 동작을 정의

예) no-cache
표준 입력

입력 폼에서 POST를 사용하였을 경우에는 표준입력으로 데이터가 전달된다. 이 때도 데이터가 인코딩되는 방법은 QUERY_STRING를 쓸 때와 마찬가지이다. 표준입력으로 데이터가 전달될 때에는 서버가 데이터의 끝에 EOF 심볼을 삽입하지 않을 수도 있기 때문에 환경변수 CONTENT_LENGTH를 읽어들여서 그 값 만큼 데이터를 읽어들여야 한다. 명령행

환경변수와 표준입력에 의한 방법 외에 <ISINDEX>를 사용한 경우, 명령행의 매개변수로 인자를 넘겨받을 수 있다. 명령행이 사용된 것을 알아내기 위해서는 클라이언트로부터 전달된 데이터에 인코딩이 되지 않은 '='를 찾으면 된다.

웹 서버는 인코딩이 되지 않은 '='이 있을 경우는 GET을 통한 입력으로 해석해서 명령행 옵션을 사용하지 않고, 그렇지 않다면 <ISINDEX>에 의한 질의라고 판단해서 명령행 옵션을 사용하게 된다.

이 방법은 클라이언트가 <ISINDEX>를 사용한 경우에 '='를 적절하게 인코딩하는 경우에만 적용될 수 있다. 만약 클라이언트 프로그램이 이것을 잘못처리한다면 정확하게 판단하지 못할 수도 있다. 간단한 예 finger.cgi 소스

 1: #!/usr/local/bin/perl
 2:  
 3: print "Content-type: text/html\n\n";
 4: 
 5: print "<HTML><HEAD><TITLE>핑거 게이트웨이</TITLE></HEAD><BODY>";
 6: print "<H1>핑거 게이트웨이</H1>";
 7: 
 8: if(!($#ARGV+1)) {
 9: 	print "<ISINDEX prompt="user\@host를 입력하세요: "><br>";
10: }else {
11:	print "<PRE>";
12:	print `/usr/bin/finger $ARGV[0]`;
13:	print "</PRE>";
14: }
15:
16: print "</body></html>";
finger.cgi의 실행결과

finger.cgi 설명

위의 프로그램은 perl을 이용해서 finger 게이트웨이를 구현한 것이다. @ARGV는 명령행 인자를 가지고 있으며, $#ARGV+1은 명령행 인자의 개수(c에서 argc())를 나타낸다.

명령행에 인자가 없는 경우, 단순히 <ISINDEX> 태그를 출력해 주고 인자가 있는 경우 즉, <ISINDEX> 입력 필드에 데이터를 입력해서 CGI 프로그램을 호출한 경우는 finger 프로그램을 입력인자와 함께 호출한 후 그 결과를 돌려 준다. finger 프로그램을 호출하는 부분은 /bin/finger $ARGV[0]이며, ` `(역따옴표)는 실행한 결과를 출력하라는 의미이다.

finger 프로그램은 표준출력으로 결과를 출력하기 때문에 CGI의 출력 방식과 들어맞기 때문에 그 결과를 특별히 변환해 줄 필요가 없다. 만약 html문서로 변환해야 한다면 그 결과를 받아들인 다음에 다시 변환하는 과정을 거쳐야 할 것이다.

웹 서버가 내부적인 한계로 인해(예를 들어 exec()이나 /bin/sh 명령행의 제약) 전체 문자열을 보낼 수가 없을 경우에는 명령행을 통해서는 아무런 정보도 전달되지 않고 대신 QUERY_STRING만이 사용된다.

위 프로그램은 CGI 프로그램이므로 다음과 같이 permission을 변경해주고 Unix 명령행에서 실행시켜본 후, 웹상에서 실행시켜야 한다. Unix 명령행에서 실행

% chmod 755 finger.cgi
% finger.cgi artech
Web에서 실행

http://ix.bit.co.kr/~artech/cgi-bin/finger.cgi


다음글: 제 18강 - CGI 명세 - 출력 (6815)1996-03-18
이전글: 제 16강 - HTTP 명세 - Request/Response (8644)1996-03-16

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


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