서버 인터페이스

최윤수
대전 광역시 유성구 어은동 1
한국과학기술연구원 연구개발정보센터
E-mail : armian@ns.kordic.re.kr
URL : http://stissbs.kordic.re.kr/~armian/
Abstract:
기존의 다양한 인터넷 서비스들은 배우기 힘들고, 제대로 활용하지 못한 것들이 많았다. WWW는 이러한 인터넷 서비스 기능들을 통합한 형태의 서비스를 제공하며, Hyperlink개념의 도입으로 초보자도 손쉽게 인터넷의 문을 두드릴 수 있게 하였다.
국내에서도 새로운 서버들이 속속 등장하였고, 현재 700여개가 넘는 서버가 존재 하고 있다. 단순히 텍스트로만 구성된 HTML로 서버를 운영하는 차원을 넘어서, 클라이언트의 요구에 따라 동적인 문서를 생성하도록, 서버를 확장하기 위해선 CGI가 필수적인 요소이다. 본 고에서는 CGI의 개념과 동작원리를 설명 한다. 이와 더불어 서버에 다양한 형태로의 문서 확장을 위한 Server Side Include에 대해서 살펴보기로 한다.
Keywords:
CGI,Form, SSI, Server side include

1. 서론

CGI는 HTTP나 Web server같은 정보서버들과 함께 외부 응용들과의 인터페이스를 위한 표준이다. 일반적으로 Web daemon이 넘겨주는 HTML 자료는 정적인 자료이다. 즉, 변하지 않는 텍스트 화일로 존재하는 것이다.
그러나 정적인 자료에는 한계가 있다. 예를들어, 질의를 통해 서버의 데이타베이스로부터, 만족하는 레코드만을 출력하길 원한다고 할때, 되돌려지는 문서는 질의에 따라 동적으로 변화해야 한다.
CGI는 바로 이러한 역할을 수행하기 위해 존재하는 게이트웨이이다.

2. Specifics

CGI는 실행가능한 프로그램이므로, 시스템에 실행 화일로 존재하게 된다. Web 서버는 CGI프로그램의 내용을 보여주는 것이 아니라, 실행결과를 보여주어야 한다. 이렇게 하기 위해선, 서버가 현재 실행되는 프로그램이 CGI라는 것을 알아야만 한다. 이를 위해 CGI 프로그램들은 특정한 디렉토리에 존재하게 된다. 이 디렉토리는 Web 마스터가 직접 관리하며, 일반 사용자가 CGI프로그램을 생성하는 것을 금지한다. 이렇게 하면 일반사용자들은 CGI를 사용하는데 불편함을 느낄 것이다. Web 마스터는 CGI를 위한 다른 장소를 할당할 수 있고, 이러한 불편 함을 해소할 수 있다. NCSA HTTPd 서버에서는 /cgi-bin이라는 디렉토리가 할당된다. 이 곳에 CGI프로그램들 이 놓여 지게 된다. CGI 프로그램들은 다음과 같이 여러 언어로 생성될 수 있다.

3. 클라이언트에서 서버로의 질의 전달

클라이언트가 CGI 프로그램에 대응되는 URL을 요구할 때마다, 서버는 그 프로그램을 리얼타임으로 실행시키고, 그 출력이 곧바로 클라이언트에 전달된다.
CGI 프로그램은 일반적인 프로그램과 달리 구성되 있다. 가장 큰 차이점은 파라미터의 전달 방식이다. 일반적인 프로그램은 명령어라인 옵션을 통해 파라미터를 전달한다.

CGI는 명령어라인을 다른 목적을 위해 사용하므로 이것은 불가능하다. 대신 CGI는 환경변수들을 이용하여 파라미터를 전달한다. 두개의 주요 환경변수들은 다음과 같다.

4. 서버에서 클라이언트로의 결과 문서 전달

CGI 프로그램 초보자의 실수는 출력결과를 서버가 이해할 수 있게 형식화하지 않는 다는 것이다. CGI 프로그램은 여러가지 문서 형식(types)을 전달할 수 있다. CGI는 클라이언트에게 이미지 또는 HTML문서를 전송할 수도, 심지어 오디오화일을 전송할수도 있다. 또한 다른 문서에 대한 참조를 전송할 수도 있다. 클라이언트가 결과를 적절하게 표현하려면, 문서의 형식을 알아야만 한다. 이러한 이유로 CGI 프로그램은 서버에게 되돌려질 문서의 타입을 알려야만 한다. 이를 위해, CGI는 출력시 작은헤더를 작성한다. 이 헤더는 ASCII 텍스트이고, 개행문자와 빈 줄을 갖는다.

4.1 MIME 타입인 문서

이러한 경우, 출력되는 문서가 MIME이라는 것을 서버에게 알려야 한다. 일반적인 MIME타입은 text/html이다. 예를들어, HTML을 클라이언트에 보낼때, 출력은 다음과 같은 형식을 갖는다.

Content-type: text/html <HTML><HEAD> <TITLE>output of HTML from CGI script</TITLE> </HEAD><BODY> <H1>Sample output</H1> What do you think of <STRONG>this?</STRONG> </BODY></HTML>

4.2 다른 문서에 대한 참조

요즈음 브라우저들은 자동적으로 새로운 다큐멘트로 이동을 한다. http://www.yahoo.com에 Random 버튼은 바로 Location을 사용하여 브라우저로 하여금 새로운 문서로 이동하게 한다. 다른 화일을 참조하기를 원한다면 단지 다음과 같은 부분(가상)URL을 사용하면 된다.

Location: /dir1/dir2/myfile.html 위와 같이 하면, 클라이언트는 스크립트를 요구하였지만, http://yourserver/dir1/dir2/myfile.html 문서를 얻게 된다.

5. Fill-Out Form

5.1 FORM 태그

FORM태그는 HTML 문서내에 fill-out form을 규정한다. 하나의 문서내에 여러개의 fill-out form이 존재할 수 있지만, nested된 형태는 허용되지 않는다. FORM의 형식은 다음과 같다.

<FORM ACTION="url"> ... </FORM> FORM에 사용되는 속성들은 다음과 같다.

5.2 INPUT 태그

INPUT태그는 FORM내에서 단순한 입력 요소를 규정하기 위해 사용된다. INPUT의 속성은 다음과 같다.

5.3 SELECT 태그

<FORM>과 </FORM>사이에 들어간다. INPUT과 달리, SELECT는 시작과 끝의 태그를 갖는다. 예) <SELECT NAME="a-ment"> <OPTION> First option. <OPTION> Second option. </SELECT>

5.4 TEXTAREA 태그

다수의 라인을 갖는 텍스트 엔트리 필드로 사용된다.

자동적으로 스크롤바를 갖는다. 시작과 끝 태그를 갖는다. 디폴트 내용을 갖을수 있다.

예) 1. no default content <TEXTAREA NAME="foo" ROWS=4 COLS=40></TEXTAREA> 2. default content <TEXTAREA NAME="foo" ROWS=4 COLS=40> Default contents go here. </TEXTAREA>

6. Form Submission

Form을 이용하여 사용자의 입력을 받고, 최종적으로 submit 버튼이 눌려지면, 입력된 내용이 서버에게 넘겨진다. 이때, Method의 종류는 GET과 POST 두가지중 하나가 되며, 각각의 경우 데이타가 서버에게 전달되는 방식은 다음과 같다.
"submit"요소는form에서 언제나 필요하다. 단, 예외적으로 하나의 INPUT요소를 포함하는 form이나, 적어도 하나의 이상의 INPUT요소(type이 IMAGE인)를 갖는 form에서는 필요없다.

form에 단 하나의 텍스트 필드가 있고, 그 텍스트 필드의 NAME이 "isindex"인 경우에, submit된 질의는 ISINDEX를 사용하는 경우와 동일하다("url?querystring" not "url? isindex=querystring").

7. Decoding FORMs with CGI

6장에서 설명했던바와 같이, 서버로 넘어오는 method는 두가지 형태중의 하나이며, 각각은 다른 형식으로 데이타를 전송하기 때문에 이에 대한 처리가 필요하다. 각 method에 대한 처리 방식은 다음과 같다. Form data는 name=value의 쌍이고 & 문자에 의해 구분된다. 각 name=value쌍은 암호화된 URL이다. 즉, 공백은 '+'로 변환되고, 어떤 문자는 16진수로 변환된다.

기본적인 절차는 '&'에 의해 데이타들을 분리하는 것이다. 그다음 name=value쌍을 얻고, name과 value를 해독한 다음, 일을 수행하면 된다.

8. CGI 환경 변수

서버에서 스크립트로 정보요구에 관한 데이타를 넘겨주기 위해, 서버는 환경변수 뿐만 아니라 명령어라인 아규멘트를 사용한다. 이러한 환경변수들은 서버가 게이트 웨이 프로그램을 실행시킬 때 세팅된다.

9. SSI

HTML문서를 작성할 때, 평범한 텍스트로만 만들다 보면 여러가지 불편함을 느끼게 된다. CGI스크립트를 사용하여 어느정도 이런한 갈증은 해소할 수 있지만, CGI또한 한계점이 있다. 대부분의 CGI들이 클라이언트의 입력에 의해 수동적으로 수행되는 점이 바로 그것이다.
이러한 점을 해결하고자, NCSA httpd는 Server Side Include를 제공하고 있다. Server Side Include를 사용하여, 자신의 문서에 signiture를 쉽게 추가할 수도 있고, UNIX에서 제공하는 쉘 스크립트의 출력을 문서에 담을 수도 있다. 또한, CGI스크립트에 더 많은 기능을 부여할 수도 있다. Server Side Include기능은 단지 HTML문서내에 '<' 와 '>'를 이용하여 명령어와 옵션을 줌으로서 수행되며, 서버는 이 문서를 파싱하여 주어진 명령어를 해독한 다음, 그 결과를 문서 중간에 삽입하여 클라이언트에 보내주게 된다.

10. Installation

11. 인클루드 형식

모든 디렉티브는 다음과 같은 형식을 갖는다.

형식 : <!--#command tag1="value1" tag2="value2"-->

Command와 tag의 형식은 다음과 같다.

12. Parsed Documents 용으로 정의된 변수들

다음의 변수들은 CGI 스크립트에 응용될 수도 있고, echo 명령어에 의해 바로 출력할 수도 있다.

참고문헌

[NCSA95a]
The Common Gateway Interface
URL:
http://hoohoo.ncsa.uiuc.edu/cgi
[NCSA95b]
Server Side Include
URL: http://hoohoo.ncsa.uiuc.edu/docs/tutorials/includes.html
[Leeds95a]
CGI Tutorial
URL: http://agora.leeds.ac.uk/nik/Cgi/start.html
[WWW-KR95a]
가자, Web의 세계로! ,225p-231p