CGI(Common Gateway Interface, 공용 게이트웨이 인터페이스)는 HTTP 서버와 같은 정보 서버가 외부 게이트웨이 프로그램과 데이터를 주고받을 수 있도록 정의한 표준 규약입니다. 웹 초창기부터 정적인 문서만 보여주던 웹에 동적인 처리 기능을 더해 준 핵심 기술로, 현재 표준 버전은 CGI/1.1이며 차세대 버전인 CGI/1.2가 준비되고 있습니다.
웹 브라우징은 어떻게 동작할까?
CGI의 개념을 제대로 이해하려면 먼저 우리가 하이퍼링크를 클릭해 웹 페이지나 URL에 접속할 때 실제로 어떤 일이 일어나는지 알아야 합니다.
- 요청 단계: 브라우저가 HTTP 웹 서버에 접속하여 원하는 URL, 즉 파일 이름을 요청합니다.
- 처리 단계: 웹 서버는 URL을 분석해 해당 파일을 찾습니다. 파일이 존재하면 그 내용을 브라우저로 되돌려 주고, 존재하지 않으면 잘못된 요청이라는 오류 메시지를 전송합니다.
- 표시 단계: 브라우저는 웹 서버로부터 받은 응답을 해석하여 화면에 파일 내용 또는 오류 메시지를 출력합니다.
그런데 여기서 흥미로운 점이 있습니다. HTTP 서버를 특별하게 설정하면, 특정 디렉터리 안의 파일이 요청되었을 때 파일 자체를 그대로 보내지 않고 프로그램으로 실행한 뒤 그 출력 결과를 브라우저에 전달하도록 만들 수 있습니다.
바로 이 기능이 CGI이며, 이렇게 실행되는 프로그램들을 CGI 스크립트라고 부릅니다. CGI 프로그램은 꼭 파이썬일 필요는 없으며, Perl 스크립트, 셸 스크립트, C/C++ 프로그램 등 어떤 언어로도 작성할 수 있습니다.
CGI 아키텍처 다이어그램

위 다이어그램에서 볼 수 있듯이, 브라우저의 요청은 웹 서버를 거쳐 CGI 프로그램으로 전달되고, CGI 프로그램이 생성한 결과물은 다시 웹 서버를 통해 브라우저로 돌아가 화면에 표시됩니다.
웹 서버 지원 여부 확인과 설정
본격적으로 CGI 프로그래밍을 시작하기 전에 반드시 확인해야 할 사항이 있습니다. 사용 중인 웹 서버가 CGI를 지원하는지, 그리고 CGI 프로그램을 처리하도록 올바르게 구성되어 있는지 점검해야 합니다.
CGI 디렉터리
HTTP 서버가 실행하는 모든 CGI 프로그램은 미리 지정된 디렉터리에 보관해야 합니다. 이 디렉터리를 CGI 디렉터리라고 하며, 관례상 /var/www/cgi-bin이라는 이름을 사용합니다.
또한 CGI 파일의 확장자는 관례적으로 .cgi를 사용하지만, 굳이 이를 따르지 않아도 됩니다. 파이썬 확장자인 .py를 그대로 사용해도 무방합니다.
httpd.conf 설정 변경
기본적으로 리눅스 서버는 /var/www 아래의 cgi-bin 디렉터리에 있는 스크립트만 실행하도록 설정되어 있습니다. 만약 다른 디렉터리에서도 CGI 스크립트를 실행하고 싶다면 httpd.conf 파일에서 아래 설정을 참고하여 구성하면 됩니다.
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
이 글에서는 웹 서버가 이미 정상적으로 구동 중이며, Perl이나 셸 스크립트 등 다른 종류의 CGI 프로그램도 문제없이 실행할 수 있는 환경을 갖추고 있다고 가정합니다.