CGI 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
2번째 줄: 2번째 줄:
  
 
==개요==
 
==개요==
CGI는 'Common GateWay Interface'의 줄임말로 말 그대로 해석하면 외부 프로그램과 브라우저 사이의 일반적인 입출력 방법을 말한다. 즉, [[웹 브라우저]]와 외부 프로그램의 상호 간의 정보를 주고받는 역할을 하는 프로그램이다. 웹 서버 프로그램의 기능 주체는 미리 준비된 정보를 [[클라이언트]](이용자)의 요구 응답해 보내는 것이기 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리 결과를 클라이언트에 송신하는 방법이 고안되었는데, 이를 실현하기 위한 [[서버]] 프로그램과 외부 프로그램과의 연계를 정한 것이 CGI다.<ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 공용 게이트웨이 인터페이스]〉, 《위키백과》</ref>
+
CGI는 Common GateWay Interface의 줄임말로 말 그대로 해석하면 외부 프로그램과 브라우저 사이의 일반적인 입출력 방법을 말한다. 즉, [[웹 브라우저]]와 외부 프로그램의 상호 간의 정보를 주고받는 역할을 하는 프로그램이다. 웹 서버 프로그램의 기능 주체는 미리 준비된 정보를 [[클라이언트]](이용자)의 요구 응답해 보내는 것이기 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리 결과를 클라이언트에 송신하는 방법이 고안되었는데, 이를 실현하기 위한 [[서버]] 프로그램과 외부 프로그램과의 연계를 정한 것이 CGI다.<ref>〈[https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 공용 게이트웨이 인터페이스]〉,《위키백과》</ref>
  
 
==역사==
 
==역사==
1993년 NCSA팀은 www-talk 메일링 리스트의 명령줄 실행 파일을 호출하는 사양을 작성하였다. 하지만 NCSA는 더 이상 이 사양을 [[호스팅]](hosting)하지 않고 있다. 기타 웹 서버 개발자들이 이를 수용하여, 그 이후로 웹 서버의 표준으로 자리 잡고 있다. [[켄 코어]](Ken Coar)가 주도하는 워크 그룹이 1997년 11월 시작되어 CGI의 NCSA 정의가 공식적으로 확립되었다. 이를 통해 RFC 3875 사양이 탄생되었으며 이는 CGI 버전 1.1을 기술한다.<ref name="위키백과"></ref>
+
1993년 [[NCSA]]팀은 팀은 www-talk 메일링 리스트의 명령줄 실행 파일을 호출하는 사양을 작성하였다. 하지만 NCSA는 더 이상 이 사양을 [[호스팅]](hosting)하지 않고 있다. 기타 웹 서버 개발자들이 이를 수용하여, 그 이후로 웹 서버의 표준으로 자리 잡고 있다. Ken Coar가 주도하는 워크 그룹이 1997년 11월 시작되어 CGI의 NCSA 정의가 공식적으로 확립되었다. 이를 통해 RFC 3875 사양이 탄생 되었으며 이는 CGI 버전 1.1을 기술한다.
  
 
==구조==
 
==구조==
보통 웹 브라우저 안에서나 [[HTML]]의 폼(form)을 통해 요청이 웹 서버로 전달되면, 웹 서버는 요청에 들어 있는 주소가 CGI프로그램에 대응되는지 확인한다. 대응되면 그 프로그램을 실행해서 환경 변수와 표준 입력의 형태로 요청을 전달한다. 웹 서버는 CGI 프로그램이 표준 출력으로 돌려보낸 내용을 그대로 응답으로 돌려준다. 좀 오래된 사이트에서 종종 '/CGI-bin/'으로 시작하는 주소를 볼 수 있는데, 웹 서버가 해당 [[디렉터리]]에 들어 있는 프로그램을 모두 다 CGI 프로그램으로 인식하게 되어 있는 경우이다. 요즘은 보안 문제 때문에 막무가내로 이런 식으로 하는 경우는 흔치 않고 웹 서버에서 설정할 수 있도록 해 놓는다. 2000년대 전후로 대한민국에도 [[인터넷 익스플로러]](internet explorer)를 통해 웹 브라우저로 접속이 가능해졌고, 개인 홈페이지 만들기에서 만든 홈페이지를 다른 사람과 교류하기 위해 [[BBS]]프로그램을 계정에 설치해서 게시판 용도로 활용했었다. 이때는 CGI가 개인 홈페이지 게시판 프로그램에 가장 널리 활용되었다. PHP는 개발 시기가 살짝 늦었고, PHP 기반 게시판을 구동하려면 [[마이에스큐엘]](MySQL) 서버가 필요해서 유료로 서비스를 사용하기 때문에, 무료였던 CGI가 초창기의 주류였다. '/CGI-bin/'은 무료 게시판 프로그램을 돌릴 때 쓰던 디렉터리 지정 방식이었다. 처음에는 CGI프로그램은 [[C언어]] 같은 컴파일되는 언어를 이용해서 만들어졌으나, 유지 보수가 불편하다는 단점이 있었다. 그런데 웹 서버가 흔히 동작하는 [[유닉스]](UNIX) 환경에서는 [[스크립트]] 언어를 마치 보통의 실행 파일처럼 실행하는 기능이 있기 때문에, CGI프로그램 또한 이러한 스크립트 언어를 통해 컴파일 없이 동작하는 방법으로 넘어가게 되었다. [[펄]](Perl)이 사실은 딱히 웹 환경을 위해 만들어진 언어가 아님에도 한동안 인기를 끌었다. 이유는 당시 [[]](Perl)이 CGI [[라이브러리]]가 있는 얼마 안 되는 스크립트 언어였기 때문이다. <ref>〈[https://namu.wiki/w/Common%20Gateway%20Interface Common Gateway Interface]〉, 《나무위키》</ref>
+
보통 웹 브라우저 안에서나 [[HTML]]의 폼(form)을 통해 요청이 웹 서버로 전달되면, 웹 서버는 요청에 들어 있는 주소가 CGI프로그램에 대응되는지 확인한다. 대응되면 그 프로그램을 실행해서 환경 변수와 표준 입력의 형태로 요청을 전달한다. 웹 서버는 CGI 프로그램이 표준 출력으로 돌려보낸 내용을 그대로 응답으로 돌려준다.
 +
참고로 좀 오래된 사이트에서 종종 '/CGI-bin/'으로 시작하는 주소를 볼 수 있는데, 웹 서버가 해당 [[디렉터리]]에 들어 있는 프로그램을 모두 다 CGI 프로그램으로 인식하게 되어 있는 경우이다. 요즘은 보안 문제 때문에 막무가내로 이런 식으로 하는 경우는 흔치 않고 웹 서버에서 설정할 수 있도록 해 놓는다. 2000년대 전후로 대한민국에도 [[인터넷 익스플로러]](internet explorer)를 통해 웹 브라우저로 접속이 가능해졌고, 개인 홈페이지 만들기에서 만든 홈페이지를 다른 사람과 교류하기 위해 [[BBS]]프로그램을 계정에 설치해서 게시판 용도로 활용했었다. 이때는 CGI가 개인 홈페이지 게시판 프로그램에 가장 널리 활용되었다. PHP는 개발 시기가 살짝 늦었고, PHP기반 게시판을 구동하려면 [[마이에스큐엘]](MySQL)서버가 필요해서 유료로 서비스를 사용하기 때문에, 무료였던 CGI가 초창기의 주류였다. '/CGI-bin/'은 무료 게시판 프로그램을 돌릴 때 쓰던 디렉터리 지정 방식이었다.
 +
처음에는 CGI프로그램은 [[C언어]] 같은 컴파일 되는 언어를 이용해서 만들어졌으나, 유지 보수가 불편하다는 단점이 있었다. 그런데 웹 서버가 흔히 동작하는 [[유닉스]](UNIX)환경에서는 [[스크립트]] 언어를 마치 보통의 실행 파일처럼 실행하는 기능이 있기 때문에, CGI프로그램 또한 이러한 스크립트 언어를 통해 컴파일 없이 동작하는 방법으로 넘어가게 되었다. [[펄]](Perl)이 사실은 딱히 웹 환경을 위해 만들어진 언어가 아님에도 한동안 인기를 끌었다. 이유는 당시 펄(Perl)이 CGI [[라이브러리]]가 있는 얼마 안 되는 스크립트 언어였기 때문이다. <ref>〈[https://namu.wiki/w/Common%20Gateway%20Interface Common Gateway Interface]〉,《나무위키》</ref>
  
 
==원리==
 
==원리==
<center>
+
[[파일:CGI.png]]
{|border=0
 
|align=center|[[파일:CGI.png]]<br>
 
|}</center>
 
  
그림과 같이 클라이언트가 문서를 요청하면 서버는 CGI프로그램에 필요한 인수를 전달하며 실행시킨다. 실행된 결과로 문서가 동적으로 생성되고, 이 문서는 서버를 거쳐서 클라이언트에게 넘겨진다. CGI 프로그램을 지정하는 방법은 URL에서 CGI 프로그램과 전달할 인수를 지정하거나, 폼 문에서 CGI 프로그램과 전달할 인수를 지정하고 이후 사용자가 입력하는 방법이 있다. 또한, 인수를 CGI프로그램으로 전달하는 방식은 [[GET]] 방식과 [[POST]] 방식이 있다. GET 방식은 모든 인수를 환경 변수들을 통해서 전달하게 되며, POST 방식은 환경 변수와 표준 입력을 통해서 인수를 전달하게 된다. URL에서 지정하는 방법은 GET 방식을 이용하며, 폼 문에서 지정하는 방법은 GET과 POST 방식 두 가지 모두를 이용한다.<ref>이택경, 〈[http://www.www-kr.org/ws3/content/A4/ 고급 CGI 프로그래밍]〉, 《다음커뮤니케이션》</ref>
+
그림과 같이 클라이언트가 문서를 요청하면 서버는 CGI프로그램에 필요한 인수를 전달하며 실행시킨다. 실행된 결과로 문서가 동적으로 생성되고, 이 문서는 서버를 거쳐서 클라이언트에게 넘겨진다.
 +
CGI 프로그램을 지정하는 방법은 URL에서 CGI 프로그램과 전달할 인수를 지정하거나, 폼(form)문에서 CGI 프로그램과 전달할 인수를 지정하고 이후 사용자가 입력하는 방법이 있다. 또한, 인수를 CGI프로그램으로 전달하는 방식은 [[GET]]방식과 [[POST]]방식이 있다. GET방식은 모든 인수를 환경 변수들을 통해서 전달하게 되며, POST방식은 환경 변수와 표준 입력을 통해서 인수를 전달하게 된다. URL에서 지정하는 방법은 GET방식을 이용하며, 폼(form)문에서 지정하는 방법은 GET과 POST 방식 두 가지 모두를 이용한다.<ref>이택경,〈[http://www.www-kr.org/ws3/content/A4/ 고급 CGI 프로그래밍]〉,《다음커뮤니케이션》</ref>
  
 
==장단점==
 
==장단점==
29번째 줄: 29번째 줄:
 
* 요청이 올 때마다 [[데이터베이스]](DB) 연결(connection)을 새로 열어야 해서 속도가 느리다.
 
* 요청이 올 때마다 [[데이터베이스]](DB) 연결(connection)을 새로 열어야 해서 속도가 느리다.
 
* [[HTTP]] 요청마다 새로운 [[프로세스]]를 만들기 때문에 서버 메모리를 많이 잡아먹는다.
 
* [[HTTP]] 요청마다 새로운 [[프로세스]]를 만들기 때문에 서버 메모리를 많이 잡아먹는다.
* 페이지 로드 사이에 데이터가 [[메모리]]에 캐시될 수 없다.
+
* 페이지 로드 사이에 데이터가 [[메모리]]에 캐시 될 수 없다.
* [[스크립트]] 언어에서는 보통 코드를 실행할 때마다 코드를 매번 해석해야 한다.<ref>bruteforce, 〈[https://live-everyday.tistory.com/197 Common Gateway Interface(CGI)란 무엇인가]〉, 《티스토리》, 2020-08-18</ref>
+
* [[스크립트]] 언어에서는 보통 코드를 실행할 때마다 코드를 매번 해석해야 한다.<ref>bruteforce,〈[https://live-everyday.tistory.com/197 Common Gateway Interface(CGI)란 무엇인가]〉,《티스토리》,2020-08-18</ref>
  
 
{{각주}}
 
{{각주}}
  
 
==참고자료==
 
==참고자료==
* 〈[https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 공용 게이트웨이 인터페이스]〉, 《위키백과》
+
* 〈[https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 공용 게이트웨이 인터페이스]〉,《위키백과》
* bruteforce, 〈[https://live-everyday.tistory.com/197 Common Gateway Interface(CGI)란 무엇인가]〉, 《티스토리》, 2020-08-18
+
* bruteforce,〈[https://live-everyday.tistory.com/197 Common Gateway Interface(CGI)란 무엇인가]〉,《티스토리》,2020-08-18
* 〈[https://namu.wiki/w/Common%20Gateway%20Interface Common Gateway Interface]〉, 《나무위키》
+
* 〈[https://namu.wiki/w/Common%20Gateway%20Interface Common Gateway Interface]〉,《나무위키》
* 이택경, 〈[http://www.www-kr.org/ws3/content/A4/ 고급 CGI 프로그래밍]〉, 《다음커뮤니케이션》
+
* 이택경,〈[http://www.www-kr.org/ws3/content/A4/ 고급 CGI 프로그래밍]〉,《다음커뮤니케이션》
  
 
==같이 보기==
 
==같이 보기==

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)