공용 게이트웨이 인터페이스
공용 게이트웨이 인터페이스(영어: Common Gateway Interface; CGI)는 웹 서버 상에서 사용자 프로그램을 동작시키기 위한 조합이다. 존재하는 많은 웹 서버 프로그램은 CGI의 기능을 이용할 수 있다.
웹 서버 프로그램의 기능의 주체는 미리 준비된 정보를 이용자(클라이언트)의 요구에 응답해 보내는 것이다. 그 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려하는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리 결과를 클라이언트에 송신하는 방법이 고안되었다. 이를 실현하기 위한 서버 프로그램과 외부 프로그램과의 연계법을 정한 것이 CGI이다.
CGI는 환경변수나 표준입출력을 다룰 수 있는 프로그램 언어에서라면 언어의 구별을 묻지 않고 확장하여 이용하는 것이 가능하나, 실행속도나 텍스트 처리의 용이함 등의 균형에 의해 펄이 사용되는 경우가 많았다. 최근[언제?]에는 펄뿐 아니라 파이썬, 루비 등도 널리 쓰이고 있다.
대표적인 애플리케이션에는 전자게시판, 접속 카운터, 위키나 블로그 시스템 등이 있다.
근래[언제?]에는 웹 서버의 프로세스로서 인터프리터를 상주시킴으로써, CGI로부터 프로그램을 호출해 부하를 줄임으로써 성능을 개선한 자바 서블릿이나 mod perl, mod php, FastCGI 등도 공개되었다.
역사
1993년 NCSA 팀은 www-talk 메일링 리스트의 명령 줄 실행 파일을 호출하는 사양을 작성하였으나[1] NCSA는 더 이상 이 사양을 호스팅하지 않고 있다.[2][3] 기타 웹 서버 개발자들이 이를 수용하였고 그 이후로 웹 서버의 표준으로 자리잡고 있다. Ken Coar가 주도하는 워크 그룹이 1997년 11월 시작되어 CGI의 NCSA 정의가 공식적으로 확립되었다.[4] 이를 통해 RFC 3875 사양이 탄생되었으며 이는 CGI 버전 1.1을 기술한다.
CGI에 관한 자주 있는 오해
이름에서 알 수 있듯이, CGI는 어디까지나 인터페이스이며, 특정 플랫폼에 의존하지 않고, 웹 서버 등으로부터 외부 프로그램을 호출하는 조합을 가리킨다.
그러므로 그 조합을 사용하여 기동되는 프로그램 본체를 CGI로 호칭하는 것은 잘못된 것이다. 또, 1990년대 후반의 CGI를 사용한 프로그램은 펄이 대부분인 까닭에 CGI와 펄, 또는 그것에 속하는 특정 언어라는 인식도 널리 퍼져 있으나, 이것도 잘못된 인식이다.
사양
CGI의 사양은 NCSA에 의해 최초로 정의 (NCSA HTTPd에 있음) 되어, 현재의 최신판은 CGI1.1이다.[5] 2004년에RFC 3875이 되었다.[6]
CGI는 전형적으로는 아래와 같은 동작이 기대된다. CGI를 경유해 실행되는 프로그램을 CGI 프로그램이라고 부른다.
- CGI 프로그램은 웹 서버가 클라이언트로부터 요청에 응답해 동작한다.
- 전형적으로는 웹 서버의 공개 영역에 설치된 프로그램에 대응하는 URI으로 요청이 있으면, 서버는 그 프로그램을 CGI의 결정에 따라 호출한다.
- CGI 프로그램으로의 정보 입력은 명령줄 인수, 환경변수, 표준입력에 의해 이루어진다.
- 웹 서버가 프로그램을 호출하는 시점에서 얼마의 환경변수를 정의하는 것이 결정된다.
- 특히, 클라이언트가 서버에 요구한 URI의 안, 검색문자열(Query String)이 환경변수 QUERY_STRING 에 설정되기 때문에, 그것은 HTML 폼에서 GET 메서드로 입력을 받는 것이 편리하다.
- QUERY_STRING에 문자'='가 포함되어 있지 않은 경우에, 서버는 QUERY_STRING의 내용을 커맨드라인 인수로서 CGI 프로그램을 넘긴다. 이것은 HTML의 ISINDEX 요소를 이용하여 송신된 정보를 다루는데 편리하다.
- 클라이언트에서의 HTTP요청 BODY부분은 CGI 프로그램 표준입력에 들어간다. 또, 그 입력의 길이가 환경변수 CONTENT_LENGTH에 설정되어 있다. 그것은 HTML 폼에서 POST메서드로 입력을 받는 것이 편리하다.
- CGI 프로그램에 대응하는 가상 패스 후에, 더욱이 여분의 패스가 계속 이어진 경우 그 정보는 환경변수 PATH_INFO에 격납(格納)되어 PATH_INFO를 웹 서버의 가상 패스로 해석한 때에 대응해야 하는 물리 패스가 환경변수 PATH_TRANSLATED 에 격납된다. 이 방식도 CGI 프로그램에 사용자 측으로부터 변수를 전하는 목적에 자주 사용된다.
- 프로그램이 표준입력에 출력된 데이터는 웹 서버를 경우한 클라이언트에 보내진다. 이 데이터는 정당한 HTTP헤더로 시작하지 않으면 안 된다.
- 단, 몇 개의 특별한 헤더 필드는「서버 디렉티브」로 해석되어, 웹 서버의 거동 (상태 코드 등) 에 환경을 부여한다. 그 밖의 모든 헤더 필드는 그 상태 그대로 클라이언트에 송신된다.
- 현재의 WWW에서는 HTML이 중심적인 역할을 하고 있어, CGI 프로그램은 HTML을 출력하는 경우가 압도적으로 많다.
- 영상 데이터 등을 출력하는 것도 있다. (이것은 엑세스 카운터 등을 조작할 때에 사용된다.)
예
다음의 펄 프로그램은 웹 서버로 전달되는 모든 환경 변수를 보여준다:
#!/usr/bin/perl
=head1 DESCRIPTION
printenv — 환경을 출력만 하는 CGI 프로그램
=cut
print "Content-type: text/plain\n\n";
for my $var ( sort keys %ENV ) {
printf "%s = \"%s\"\n", $var, $ENV{$var};
}
각주
- ↑ Server Scripts, by Rob McCool, www-talk mailing list, Sun, 14 Nov 1993 19:24:47 -0600
- ↑ 《The Common Gateway Interface》, 2010년 1월 27일에 원본 문서에서 보존된 문서
- ↑ CGI: Common Gateway Interface at w3.org
- ↑ “Common Gateway Interface RFC Project Page”. 2013년 8월 25일에 원본 문서에서 보존된 문서.
- ↑ “보관된 사본”. 2007년 8월 9일에 원본 문서에서 보존된 문서. 2007년 8월 9일에 확인함.
- ↑ “보관된 사본”. 2009년 5월 29일에 원본 문서에서 보존된 문서. 2009년 7월 16일에 확인함.
외부 링크
- The CGI standard at w3.org.
- The CGI/1.1 specification.
- The CGI Specification
- RFC3875 The Common Gateway Interface (CGI) Version 1.1
- RFC1630 Universal Resource Identifiers in WWW
- RFC2616 Hypertext Transfer Protocol -- HTTP/1.1
모듈:Authority_control 159번째 줄에서 Lua 오류: attempt to index field 'wikibase' (a nil value).
- 스크립트 오류가 있는 문서
- 잘못된 파일 링크가 포함된 문서
- 영어 표기를 포함한 문서
- 모호한 표현이 구체적으로 지적된 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 서버
- 웹 기술
- 월드 와이드 웹
- 웹 1.0