서버와 인터페이스(Web Server, CGI, WAS, WSGI)에 대한 이해
요즘이야 서버리스와 관련된 서비스가 많아져서 서버를 직접 구현할 일이 적어졌지만 그럼에도 불구하고 이와 관련된 지식을 개발자가 아는 것은 중요하다고 생각한다.
서버에 관해서도 깊이 들어가면 생각만큼 간단하지가 않다.
서버에도 다양한 아키텍쳐들이 엮여 있고 정확하겐 서버가 아니라 인터페이스임에도 불구하고 그것을 전부 묶어서 그냥 ‘서버’라고 지칭하기 때문이 혼란이 발생하게 된다.
하지만 개발자 입장에선 이를 명확하게 구분하는게 일하는데 있어 도움이 될 것이므로 오늘은 이에 대해 각각 용어에 대한 정의와 이들이 어떻게 동작하는지 개념을 알아보도록 하자.
Web Server
개발자 중에 웹 서버에 대해서 모르는 사람은 없을 것이다. 하지만 추상적으로 알고 있는 경우가 대부분인데 이번 기회에 명확하게 무엇인지 이해하고 넘어가도록 하자.
웹 서버라고 명명할때 우리는 크게 소프트웨어 적인 측면과, 하드웨어적인 측면 두가지로 나눌 수 있다.
소프트웨어적인 측면
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
하드웨어적인 측면
위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터
웹 서버는 기본적으로 ‘정적’이다 즉, 클라이언트의 리퀘스트를 통해 리소스를 요청하면 그 리소스를 그대로 보내주는게 웹 서버의 역할이다.
CGI(Common Gateway Interfac)
CGI는 웹 서버상에서 사용자 프로그램을 동작시키기 위한 인터페이스이다.
즉, 위에서 이야기한 정적인 웹서버를 동적으로 가능하게 해준다.
CGI는 서버 프로그램에서 다른 프로그램을 불러낼 수 있게 하고 그 처리 결과를 클라이언트에 송신할 수 있게 한다.
우리가 흔히 알고 있는 Nginx, Apache의 서버가 이에 해당된다.
WAS(Web Application Server)
WAS는 웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임 워크를 말한다.
다시말해, 정적인 웹서버와 동적인 애플리케이션을 더한 것이다.
애플리케이션의 실행결과를 웹 서버에 전달해줘 이를 요청받은 클라이언트에게 응답한다.
자바의 Tomcat(톰켓) 서버가 WAS에 해당된다.
WSGI(Web Server Gateway Interface)
WSGI는 파이썬 웹 응용 프로그램을 위한 것이다.
WSGI는 웹서버와 파이썬으로 작성된 웹 응용 프로그램 간의 표준 인터페이스를 말한다.
CGI와 WSGI는 혼동하기 쉬운데 그도 그럴것이 두개 모두 인터 페이스며 WSGI는 CGI 디자인 패턴에 기반하여 업그레이드한 인터페이스이기 때문이다.
WSGI는 CGI에 비해 동시에 여러 요청을 처리할 수 있으며 확정성과 성능면에서 더 좋다.
Gunicorn, uWSGI가 이런 WSGI에 대당된다.
WSGI 서버는 단독으로 사용될 수 있으나 아래와 같은 한계로 흔히 Nginx와 함께 이용되고는 한다.
- DDos등 외부 공격 취약
- HTTPS 처리 불가
- Static 파일의 전송 효율성
- 다수의 연결을 효과적으로 처리 불가
정리
결국 정적인 웹서버의 한계를 극복하기 위해 동적으로 처리해줄 수 있는 애플리케이션이 필요하게 되었고 이에 대한 처리를 위해 인터페이스가 등장하게 되었다.
애플리케이션의 성격에 따라 WSGI, CGI, WAS를 사용하게 된다.
이를 도식화 해보면 아래와 같다.