학습 | CGI
Last updated
Last updated
리퀘스트 단에서 학습을 하셨겠지만, 리퀘스트란 특정 리소스의 내용을 그대로 요청하는 경우가 대부분입니다. 그렇다면 브라우저가 요청하는 리소스의 정확한 위치를 모른다면 어떻게 할까요? 새로운 리소스를 만들거나 기존의 리소스를 변경, 또는 삭제해서 요청하고 싶다면 어떻게 할까요?
서버 내에 존재하는 리소스들의 주소 체계를 클라이언트가 정확하게 알고 있고, 서버 내의 리소스 내용을 변경하지 않는 단순한 요청만 원한다면 CGI의 개념은 불필요할 거에요. 그러나 웹이 더 다양한 작업을 다이나믹하게 처리하기 위해서는 서버 사이드에서 어떤 처리들이 진행되어야 합니다. 가령 회원가입을 한다고 했을 때, 우리가 회원 정보를 입력하고 최종적으로 '가입' 버튼을 누르면 정상적으로 회원가입이 처리되었다는 결과 화면을 보게 됩니다. 그러나 그 사이에 그 정보들의 유효성을 검증하고 데이터베이스에 회원 인스턴스를 추가하는 작업이 서버에서 일어나는 거죠.
아주 러프하게 생각하면, 특정한 요청들에 대해서 어떤 방식으로 처리를 할 것인지 우리가 만드는 웹서버 프로그램에 다 코딩을 하면 될 것 같습니다. '메소드가 A이고, URL이 B일 때에는 이런 함수를 실행시켜 처리하도록 코딩하면...' 과 같이 생각해 볼 수 있겠죠. 그러나 조금 더 생각해보면, '웹서버'와 '서버'가 섞여서 카오스가 발생한다는 것을 알게 됩니다. C언어로 된 프로그램을 짜기 위해서 매번 C언어를, 혹은 컴파일러를 만들어야 한다면 어떨까요? 끔찍하죠.
그럼 우리가 만드는 웹서버는 HTTP/1.1에 따라 범용적인 방식으로 동작하도록 설계하고, 요청(Method)에 따라 리소스의 내용을 '읽고' 반환하는 것이 아니라 리소스를 '실행'하고 결과를 반환하도록 한다면 어떨까요? 웹 서버는 그대로 두고, 웹 서버가 실행할 수 있는 CGI 프로그램들만 잘 만들어서 적절한 위치에 놓아두면 되지 않을까요? 그러면 웹서버는 수정하거나 컴파일하지 않고 사용할 수 있고, 만들고자 하는 서비스에 필요한 CGI 프로그램과 정적 리소스(html/css/js, image, video)만 잘 만들어서 디렉토리에 넣으면 될 거에요.
우리가 주소창에 직접 입력하거나, 마우스 클릭이나 키보드 입력을 통해 연결되는 새로운 주소들은 모두 특정 리소스를 가리킵니다. 만들어져 있는 것을 그대로 돌려주기를 원하는 정적 리소스일 수도 있고, 실행시켜서 어떤 처리를 하고 그 결과를 돌려주기를 원하는 동적 리소스일 수도 있지요. 이 때 동적 리소스를 실행시키기 위해서 마음대로 웹서버 프로그램을 코딩한다면, 그 웹서버 프로그램은 개발자 밖에 쓰지 못하게 되겠죠? 그래서 서버가 동적 리소스 실행을 준비하고, 실행하고, 결과를 돌려받는 일련의 과정에서 지켜야 할 기준들을 CGI(Common Gateway Interface)라고 합니다. CGI를 잘 지켜서 만들어진 프로그램들을 CGI 프로그램, CGI 스크립트라고 하는 거고요.
일반적인 웹 서비스에서 어떤 단어를 검색했을 때, url에 내가 검색한 단어가 포함되는 걸 본 적이 있으시죠? URL에는 단순히 리소스의 서버 내 위치만이 아니라, 동적 리소스를 대상으로 참조할 일종의 인자(Pathinfo, Query)들까지 붙일 수 있습니다. 데이터가 큰 경우에는 body에 실어 보낼 수 있죠. 가령 우리가 프로필 사진을 변경하고 싶다면, profile image를 변경하는 CGI 프로그램의 path를 적고, intra id를 query로 넘겨주면서, image data를 body에 실어서 보내는 방식으로 처리가 가능합니다.
CGI는 매우 중요한 부분이기 때문에 확실히 짚고 넘어가는 것이 좋습니다. 특히 CGI 프로그램을 실행시킬 때 CGI 프로그램을 위한 환경변수들을 추가로 세팅하여 실행하여야 하는데, 각각의 CGI 환경변수들이 어떤 역할을 하는지를 명확하게 이해해야 합니다. QAOS.com에서 한글로 된 체계적인 강의가 있기 때문에 일독을 권합니다.