Webserv - CGI와 WAS에 관하여

HY·2022년 3월 23일
0

재작년 9월쯤이었나, 한창 42서울 과정을 하던 때에 과제 중에 Webserv라는 과제가 있었다. 말 그대로 C++로 웹서버를 만드는 과제였는데, 솔직히 오래되기도 했고 내용은 잘 기억이 나지는 않지만, 갑자기 웹 어플리케이션의 구조에 관해 공부하다 보니 생각이 났다.

그때 노션에 적어놨던 거나 github을 보면서 되짚어 보자면 과제의 내용은 대강 다음과 같았다.

  1. Socket을 열어 HTTP 요청 메시지를 받는다.
    https://media.geeksforgeeks.org/wp-content/uploads/Socket_server.png
    소켓 프로그래밍은 대강 위와 같은 구조로, 소켓을 먼저 생성하고(socket) 주소랑 포트 넘버를 지정한 다음(bind), client로부터 요청을 기다린다(listen)
    그리고 요청이 들어오면 accept로 접속 요청을 수락하고, 요청을 받는다. (read(recv))

  2. HTTP 요청 메시지를 파싱한다. (method나 url, header와 body 등으로 나눠서 파싱했다)

  3. 해당하는 method, url에 맞게 응답을 만들어 보내준다. (write(send))
    www 폴더에 resources를 넣었고, 예를 들어 GET 요청의 경우 그 폴더에 파일이 있으면 파일 내용을 읽어서 보내주고, 없으면 404 에러를 보내주는 식이었던 것으로 기억한다.

세세하게 신경 써야 할 부분이 더 많았던 것 같긴 하지만 크게 보면 대강 저런 느낌이었다.

이 글을 왜 갑자기 쓰게 되었냐면, 이 중에서 응답을 만들어서 보내줄 때 처리해야 할 것 중에 cgi라는 게 있었다. 검색해보니 뭔가 html 같은 정적인 파일 말고, php 같은 게 왔을 때 그걸 실행시키기 위한 거라는 것 같긴 한데 그때는 웹 개발은커녕 정적인 게 뭐고 동적인 게 뭔지도 잘 몰랐다. 그래서 뭘 어떻게 하라는 건지 전혀 감을 못 잡고 며칠간 팀원들이랑 삽질을 거하게 했던 기억이 있다.

어쨌든, WAS에 관해 알아보다보니 갑자기 cgi가 생각났다. 방법이 다르기는 하지만, 둘 다 프로그램을 실행시킨다는 점에서 비슷해 보였기 때문이다. 그래서 좀 더 알아보기 위해 찾아보았다.

CGI

Common Gateway Interface의 약자로, 웹 서버에서 외부 프로그램을 불러내고 그 처리 결과를 클라이언트에 송신하기 위한 연계 방법(Interface)이다.

client로부터 해당 요청이 들어오면, 웹 서버는 규약에 맞춰 프로그램을 호출한다.

그 때 동적인 컨텐츠를 처리하기 위해, execve로 args(인수)랑 env(환경변수)를 적절히 지정해줘서 프로그램을 실행시켰던 것으로 기억한다. 그리고 프로그램이 실행되고 처리된 결과를 받아와 client로 보내준다.

요청을 할 때마다 프로세스를 생성(fork)하고 가동하는데, 이 때문에 동시에 요청이 많이 들어올 경우 서버에 부하가 발생할 수 있다는 단점이 있다.

WAS

프로그램을 실행할 수 있는 웹 서버. (하지만 동적인 페이지를 처리하기 위한 서버로 정적인 페이지만 처리해주는 그냥 웹 서버랑은 구분된다고 한다.)
요청이 들어오면 스레드를 생성해 수행한다고 하는데 자세한 내용은 잘 모르겠다. 어쨌든 웹 서버 내에서 프로그램을 실행시킬 수 있는 환경이 제공돼 있다는 정도로 이해했다.

정리하자면, CGI는 웹 서버에서 어플리케이션을 작동시키기 위한 것으로 서버 프로그램과 외부 프로그램과 데이터를 주고 받는 방식(인터페이스)이다. 기존의 웹 서버는 동적인 페이지 생성을 위해 CGI라는 규약을 통해 통신했다.
반면, WAS는 웹 서버 내에서 동적 서버 컨텐츠를 수행한다.

마무리

공부하다가 갑자기 생각나서 찾아보며 쓴 글이라 그런지 글의 흐름이 좀 이상한 것 같다...
어쨌든 오랜만에 예전에 했던 Webserv를 찾아보는데 다시 보니 코드도 잘 이해가 안 가고 이걸 어떻게 했나 싶다. 뭔가 좀 아는 상태에서 했으면 달랐을까 싶긴 한 게 그때는 그냥 하라니까 한 거여서 그런지 cgi에서도 그렇게 알아볼 생각도 안 했고, 동적인 컨텐츠가 뭔지도 생각을 별로 안 해본 채 요구 사항대로 구현하는 것에 급급했었는데 이렇게 웹 어플리케이션의 구조를 공부하면서 되돌아보니 웹 서버가 어떤 역할을 하는지 볼 수 있어 좀 새롭게 느껴지기도 한다.

0개의 댓글