CGI

ayokinya·2020년 9월 27일
0

간단한 HTTP/1.1 서버를 구현하는 과제를 하면서 CGI를 처음 알게 됐다.
CGI를 공부하면서 알게 된 내용을 정리한다.

CGI는 서버와 외부 프로그램이 정보를 주고 받는 표준 방식이다.

웹과 외부 프로그램은 프로토콜이 다르다. 이렇게 서로 다른 프로토콜을 연동하는 것이 소프트웨어 게이트웨이다. 그리고 이 게이트웨이의 표준안이 CGI(Common Gateway Interface)다. CGI를 따라서 만들어진 프로그램이 CGI program 혹은 CGI script다. 이 프로그램 자체를 CGI라고 부르기도 한다.
웹 서버는 클라이언트가 요청한 정보를 가지고 CGI를 실행해서 페이지를 만든다. 단순히 서버에 저장되어 있는 파일을 읽어서 정적인 페이지를 만드는 것과 달리, CGI로 만드는 웹 페이지는 고정된 페이지가 아니다. 클라이언트가 어떤 데이터를 보내는 지에 따라 CGI 프로그램의 결과가 다르기 때문에 CGI로 만든 웹 페이지는 유동적이다.

CGI는 어떻게 작동할까?

우선 클라이언트가 GET이나 POST method로 CGI 프로그램에 들어갈 데이터를 담은 request를 서버로 보낸다. 서버는 request에서 받아온 내용을 해석해 STDIN과 환경 변수로 프로그램에 넘겨준다. 프로그램에 보내는 환경 변수의 자세한 내용은 RFC 3875를 참고해야 한다.

CGI 프로그램은 우리가 넘겨준 데이터를 받아서 결과를 출력하고, 서버는 그 결과를 받아서 올바른 HTTP 형식으로 클라이언트에게 보낸다. index.html 같이 기존에 내가 가지고 있는 파일을 읽은 내용이 아니라 프로그램을 실행시켜서 나온 결과를 보내주는 게 CGI의 핵심이라고 이해했다.

<C로 CGI를 실행시키는 방법>
1. fork해서 Child process를 생성한다.
2. Child process에서 CGI를 실행한다. (with execve) + CGI를 위한 환경 변수
3. parent process에서 파이프로 request 데이터를 넣어준다.
4. 파이프로 받은 입력을 해석한 CGI가 내보내는 결과를 잘 담아주면 끝!

CGI가 대단하구나!

단순히 파일을 읽어서 보여주는 것에서 벗어나 다른 프로그램을 실행 시키고 그 결과를 http로 전달할 수 있다는 게 별 거 아닌 것 같지만 대단한 기능이라고 생각한다. CGI로 웹이 할 수 있는 일이 많이 확장됐다는 걸 느꼈다. 그리고 서버가 정적인 페이지를 보여주는 일방적 소통을 넘어,
클라이언트의 데이터를 반영한 페이지를 만들어낼 수 있게 CGI로 클라이언트와 서버 간 양뱡향 소통으로 확장된 것도 대단해보인다. 배우면 배울수록 신기한 컴퓨터의 세계...!

<참고 자료>
https://en.wikipedia.org/wiki/Common_Gateway_Interface
https://qaos.com/sections.php?op=viewarticle&artid=194

profile
42 서울 교육생

0개의 댓글