CGI, WSGI, ASGI 용어의 개념을 정리해보자 ❕
다음 용어들을 공부하기 전에 Web Server와 WAS에 대한 개념을 잡고 있으면 이해가 쉽다.
Web Server & WAS
Web Sever와 WAS의 개념을 공부하고 차이점을 알아보자 ❕ 1. Static & Dynamic 페이지 Static Pages (정적 페이지) 바뀌지 않는 페이지 DB에서 정보를 가져오거나 별도의 서버 처리를 하지 않고 사용자들에게
chchaego.tistory.com
파이썬 웹 프레임워크에 대해 공부하다가 WSGI, ASGI 용어가 자주 등장해서, 공부한 뒤 정리해보려고 한다.

1. CGI (Common Gateway Interface)
초기 웹 개발에서 사용된 표준 인터페이스로, 웹 서버와 외부 프로그램 간의 통신 규약을 의미한다. 초기 정적 컨텐츠만 제공하던 웹 서버에서 동적 콘텐츠를 제공하기 위한 목적으로 등장하게 됐다. CGI 자체는 웹 서버와 외부 프로그램, 스크립트가 상호작용할 수 있게 해주는 규약이며, CGI를 따라 웹 서버와 상호작용하는 프로그램을 CGI 스크립트(CGI 프로그램)라고 한다.
CGI 스크립트를 이용해 웹 서버는 외부 프로그램이나 스크립트를 실행시키고, 그 결과를 받아올 수 있다.
HTTP 요청은 파이썬 앱이 받는 요청 형식과는 다르기 때문에, 클라이언트로부터 오는 HTTP 요청을 파이썬이 요구하는 형식으로 변환하고 응답을 다시 HTTP 형식으로 변경하는 작업이 필요한데, 이를 CGI 스크립트가 해주는 것이다.

CGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 CGI 스크립트로 전달한다.
- CGI 스크립트는 서버에서 새로운 프로세스로 실행되며, 해당 프로그램을 실행시키고 요청에 대한 결과를 웹 서버에게 반환한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
특징
- 언어 독립성
- CGI 스크립트는 Python, C, Perl 등 다양한 언어로 작성할 수 있다.
- 요청마다 프로세스 생성
- 각 요청마다 새로운 프로세스를 생성하기 때문에, 많은 요청이 들어오면 성능이 저하된다.
- 이식성
- 다양한 웹 서버와 운영체제에서 사용 가능
- 간단한 스크립트로 빠르게 구현할 수 있다.
서블릿(Servlet)과의 차이?
CGI 프로그램과 서블릿 모두 클라이언트의 요청에 따라 웹 서버에서 동적인 리소스를 요청하는데 사용된다.
CGI
- 다양한 언어로 작성
- 각 요청에 대해 프로세스 생성
- 다양한 웹 서버와 운영체제에서 쉽게 사용 가능
Servlet
- Java로 작성
- 각 요청에 대해 스레드 생성
- Java 기반의 시스템에서 연동하기 적합
한계
현대 웹 애플리케이션은 CGI를 잘 사용하지 않는다. CGI는 보안과 성능 이슈 등 여러 단점을 가지고 있고 요청마다 프로세스가 생성되기 때문에 비효율적이다. 현대에는 더 효율적이고 안전한 웹 프레임워크나 서버측 스크립트 언어를 사용한다.
(CGI의 대안으로 FastCGI, WAS 등이 등장하게 된 것이다)
2. WSGI (Web Server Gateway Interface)
웹 서버와 파이썬 웹 애플리케이션 간의 통신을 위한 표준 인터페이스. (^WSGI는 파이썬에서 사용되는 개념^)
Nginx, Apache 같은 웹 서버들은 파이썬 웹 애플리케이션과 바로 통신이 불가능한데, 이를 가능하게 해주는 것이 WSGI이다. 기본적으로 동기적 요청-응답 처리 방식을 따른다.
WSGI를 구현하는 미들웨어가 WSGI 서버이다.


WSGI를 구현하는 WSGI 서버로는 Gunicorn, uWSGI 등이 있다.
WSGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 WSGI 서버로 전달한다.
- WSGI 서버는 HTTP 요청을 파이썬이 이해할 수 있는 형태로 변환하고, 파이썬 애플리케이션에게 전달한다.
- 요청 결과를 WSGI 서버에 반환하고, 응답 결과를 다시 HTTP 형태로 변환해 웹 서버로 전달한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
특징
- CGI 디자인 패턴에 기반한 인터페이스
- Python에 종속적
- 요청마다 프로세스 생성 X
- 매 요청마다 새로운 프로세스를 생성하지 않는다.
- 따라서 요청이 많아져도 성능 저하가 거의 없다.
- 동기적 요청-응답 방식
- 요청에 대한 정보를 애플리케이션에 전달
- WSGI는 웹 애플리케이션을 호출할 때 웹 서버가 제공한 환경 변수와 요청에 대한 정보, 콜백 함수를 같이 전달한다. 처리가 끝난 후 결과는 콜백 함수로 응답된다.
한계
WSGI는 기본적으로 동기적인 요청-응답 처리 방식을 따르는데, 이는 길게 유지되어야 하는 연결(웹 소켓)이나 많은 트래픽을 처리하는데 시간이 오래걸리고 비효율적이다. 게다가 Python은 asyncio
, 코루틴과 같은 비동기 처리를 지원하는데 WSGI는 동기 함수 처리만을 지원하여 여러 작업을 동시에 처리하는 것에 한계가 있다. (비동기가 아예 불가능한 것은 아님)
대용량 트래픽을 처리하기 위해 WSGI의 대안으로 ASGI가 등장했다.
3. ASGI (Asynchronous WSGI)
ASGI는 비동기 웹 애플리케이션을 지원하기 위해 WSGI의 확장으로 설계되었다.
비동기적인 웹 애플리케이션을 개발할 수 있으며, 이를 통해 높은 성능과 확장성을 갖는 웹 애플리케이션을 구축할 수 있다. 기본적인 동작은 WSGI와 크게 다르지 않다.
ASGI를 구현하는 ASGI 서버로는 Uvicorn이 있다. (FastAPI 프레임워크가 기본적으로 ASGI를 따른다)
ASGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 ASGI 서버로 전달한다.
- ASGI 서버는 파이썬 애플리케이션에게 요청을 전달한다. (이때, 비동기 처리가 가능하다)
- 요청 결과를 ASGI 서버에 반환하고, ASGI 서버는 웹 서버로 전달한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
=> WSGI는 동기식 처리 방식을 사용해 각 요청에 대한 처리가 순차적으로 이루어진다. 즉, 하나의 요청이 끝나야만 다음 요청을 처리할 수 있는 것이다. 하지만 ASGI는 비동기식 처리 방식을 사용하기 때문에 다수의 요청을 병렬적으로 처리할 수 있으며, 이전의 요청이 끝나기를 기다리지 않고 다음 요청이 가능하다.
특징
- WSGI의 특징과 유사
- 비동기적 요청 - 응답 방식
- 이벤트 루프를 활용해 비동기적으로 요청을 처리한다.
- 웹 소켓 프로토콜 지원
- WSGI에서는 지원되지 않는 웹 소켓 프로토콜을 지원한다.
- 실시간 처리
참고자료 😃
https://medium.com/svelte-seoul/서버-web-server-cgi-was-wsgi-에-대한-이해-2ab0f9bfabd4
https://80000coding.oopy.io/2352c04e-8f98-4695-a5fe-8c789ee94d98
https://sgc109.github.io/2020/08/15/python-wsgi/
https://velog.io/@hwaya2828/WSGI-ASGI
'Python' 카테고리의 다른 글
[Python] SQLAlchemy 트랜잭션 설계 (+ decorator) (0) | 2024.06.24 |
---|---|
[Python] 파이썬 동시성 프로그래밍 (+ GIL, 코루틴) (2) | 2024.06.15 |
[Python] SQLAlchemy 개념 및 설정 방법 (0) | 2024.06.05 |
[Python] Django & Flask & FastAPI (0) | 2024.04.15 |
CGI, WSGI, ASGI 용어의 개념을 정리해보자 ❕
다음 용어들을 공부하기 전에 Web Server와 WAS에 대한 개념을 잡고 있으면 이해가 쉽다.
Web Server & WAS
Web Sever와 WAS의 개념을 공부하고 차이점을 알아보자 ❕ 1. Static & Dynamic 페이지 Static Pages (정적 페이지) 바뀌지 않는 페이지 DB에서 정보를 가져오거나 별도의 서버 처리를 하지 않고 사용자들에게
chchaego.tistory.com
파이썬 웹 프레임워크에 대해 공부하다가 WSGI, ASGI 용어가 자주 등장해서, 공부한 뒤 정리해보려고 한다.

1. CGI (Common Gateway Interface)
초기 웹 개발에서 사용된 표준 인터페이스로, 웹 서버와 외부 프로그램 간의 통신 규약을 의미한다. 초기 정적 컨텐츠만 제공하던 웹 서버에서 동적 콘텐츠를 제공하기 위한 목적으로 등장하게 됐다. CGI 자체는 웹 서버와 외부 프로그램, 스크립트가 상호작용할 수 있게 해주는 규약이며, CGI를 따라 웹 서버와 상호작용하는 프로그램을 CGI 스크립트(CGI 프로그램)라고 한다.
CGI 스크립트를 이용해 웹 서버는 외부 프로그램이나 스크립트를 실행시키고, 그 결과를 받아올 수 있다.
HTTP 요청은 파이썬 앱이 받는 요청 형식과는 다르기 때문에, 클라이언트로부터 오는 HTTP 요청을 파이썬이 요구하는 형식으로 변환하고 응답을 다시 HTTP 형식으로 변경하는 작업이 필요한데, 이를 CGI 스크립트가 해주는 것이다.

CGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 CGI 스크립트로 전달한다.
- CGI 스크립트는 서버에서 새로운 프로세스로 실행되며, 해당 프로그램을 실행시키고 요청에 대한 결과를 웹 서버에게 반환한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
특징
- 언어 독립성
- CGI 스크립트는 Python, C, Perl 등 다양한 언어로 작성할 수 있다.
- 요청마다 프로세스 생성
- 각 요청마다 새로운 프로세스를 생성하기 때문에, 많은 요청이 들어오면 성능이 저하된다.
- 이식성
- 다양한 웹 서버와 운영체제에서 사용 가능
- 간단한 스크립트로 빠르게 구현할 수 있다.
서블릿(Servlet)과의 차이?
CGI 프로그램과 서블릿 모두 클라이언트의 요청에 따라 웹 서버에서 동적인 리소스를 요청하는데 사용된다.
CGI
- 다양한 언어로 작성
- 각 요청에 대해 프로세스 생성
- 다양한 웹 서버와 운영체제에서 쉽게 사용 가능
Servlet
- Java로 작성
- 각 요청에 대해 스레드 생성
- Java 기반의 시스템에서 연동하기 적합
한계
현대 웹 애플리케이션은 CGI를 잘 사용하지 않는다. CGI는 보안과 성능 이슈 등 여러 단점을 가지고 있고 요청마다 프로세스가 생성되기 때문에 비효율적이다. 현대에는 더 효율적이고 안전한 웹 프레임워크나 서버측 스크립트 언어를 사용한다.
(CGI의 대안으로 FastCGI, WAS 등이 등장하게 된 것이다)
2. WSGI (Web Server Gateway Interface)
웹 서버와 파이썬 웹 애플리케이션 간의 통신을 위한 표준 인터페이스. (WSGI는 파이썬에서 사용되는 개념)
Nginx, Apache 같은 웹 서버들은 파이썬 웹 애플리케이션과 바로 통신이 불가능한데, 이를 가능하게 해주는 것이 WSGI이다. 기본적으로 동기적 요청-응답 처리 방식을 따른다.
WSGI를 구현하는 미들웨어가 WSGI 서버이다.


WSGI를 구현하는 WSGI 서버로는 Gunicorn, uWSGI 등이 있다.
WSGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 WSGI 서버로 전달한다.
- WSGI 서버는 HTTP 요청을 파이썬이 이해할 수 있는 형태로 변환하고, 파이썬 애플리케이션에게 전달한다.
- 요청 결과를 WSGI 서버에 반환하고, 응답 결과를 다시 HTTP 형태로 변환해 웹 서버로 전달한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
특징
- CGI 디자인 패턴에 기반한 인터페이스
- Python에 종속적
- 요청마다 프로세스 생성 X
- 매 요청마다 새로운 프로세스를 생성하지 않는다.
- 따라서 요청이 많아져도 성능 저하가 거의 없다.
- 동기적 요청-응답 방식
- 요청에 대한 정보를 애플리케이션에 전달
- WSGI는 웹 애플리케이션을 호출할 때 웹 서버가 제공한 환경 변수와 요청에 대한 정보, 콜백 함수를 같이 전달한다. 처리가 끝난 후 결과는 콜백 함수로 응답된다.
한계
WSGI는 기본적으로 동기적인 요청-응답 처리 방식을 따르는데, 이는 길게 유지되어야 하는 연결(웹 소켓)이나 많은 트래픽을 처리하는데 시간이 오래걸리고 비효율적이다. 게다가 Python은 asyncio
, 코루틴과 같은 비동기 처리를 지원하는데 WSGI는 동기 함수 처리만을 지원하여 여러 작업을 동시에 처리하는 것에 한계가 있다. (비동기가 아예 불가능한 것은 아님)
대용량 트래픽을 처리하기 위해 WSGI의 대안으로 ASGI가 등장했다.
3. ASGI (Asynchronous WSGI)
ASGI는 비동기 웹 애플리케이션을 지원하기 위해 WSGI의 확장으로 설계되었다.
비동기적인 웹 애플리케이션을 개발할 수 있으며, 이를 통해 높은 성능과 확장성을 갖는 웹 애플리케이션을 구축할 수 있다. 기본적인 동작은 WSGI와 크게 다르지 않다.
ASGI를 구현하는 ASGI 서버로는 Uvicorn이 있다. (FastAPI 프레임워크가 기본적으로 ASGI를 따른다)
ASGI 동작 과정

- 사용자가 웹 서버에게 요청을 보내면
- 웹 서버는 해당 요청을 ASGI 서버로 전달한다.
- ASGI 서버는 파이썬 애플리케이션에게 요청을 전달한다. (이때, 비동기 처리가 가능하다)
- 요청 결과를 ASGI 서버에 반환하고, ASGI 서버는 웹 서버로 전달한다.
- 웹 서버는 결과를 클라이언트에게 전달한다.
=> WSGI는 동기식 처리 방식을 사용해 각 요청에 대한 처리가 순차적으로 이루어진다. 즉, 하나의 요청이 끝나야만 다음 요청을 처리할 수 있는 것이다. 하지만 ASGI는 비동기식 처리 방식을 사용하기 때문에 다수의 요청을 병렬적으로 처리할 수 있으며, 이전의 요청이 끝나기를 기다리지 않고 다음 요청이 가능하다.
특징
- WSGI의 특징과 유사
- 비동기적 요청 - 응답 방식
- 이벤트 루프를 활용해 비동기적으로 요청을 처리한다.
- 웹 소켓 프로토콜 지원
- WSGI에서는 지원되지 않는 웹 소켓 프로토콜을 지원한다.
- 실시간 처리
참고자료 😃
https://medium.com/svelte-seoul/서버-web-server-cgi-was-wsgi-에-대한-이해-2ab0f9bfabd4
https://80000coding.oopy.io/2352c04e-8f98-4695-a5fe-8c789ee94d98
https://sgc109.github.io/2020/08/15/python-wsgi/
https://velog.io/@hwaya2828/WSGI-ASGI
'Python' 카테고리의 다른 글
[Python] SQLAlchemy 트랜잭션 설계 (+ decorator) (0) | 2024.06.24 |
---|---|
[Python] 파이썬 동시성 프로그래밍 (+ GIL, 코루틴) (2) | 2024.06.15 |
[Python] SQLAlchemy 개념 및 설정 방법 (0) | 2024.06.05 |
[Python] Django & Flask & FastAPI (0) | 2024.04.15 |