> For the complete documentation index, see [llms.txt](https://42seoul.gitbook.io/webserv/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://42seoul.gitbook.io/webserv/or-webserver.md).

# 학습 | 웹서버(Webserver)

## 웹서버란 무엇일까

서브젝트 문서를 한 문장으로 요약한다면 '웹서버를 만들라'는 것입니다. 그렇다면 웹서버란 무엇일까요? 위키에는 아래와 같이 정의되어 있어요.

> **웹 서버**(Web Server)는 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말한다. 웹 서버의 주된 기능은 웹 페이지를 [클라이언트](https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8)로 전달하는 것이다. 주로 [그림](https://ko.wikipedia.org/wiki/%EA%B7%B8%EB%A6%BC), [CSS](https://ko.wikipedia.org/wiki/CSS), [자바스크립트](https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8)를 포함한 [HTML](https://ko.wikipedia.org/wiki/HTML) 문서가 [클라이언트](https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8)로 전달된다.

어렵게 생각할 필요가 없어요. 사용자적 관점에서 보면, 우리는 키보드나 마우스와 같은 입력 장치를 통해 저 멀리 어딘가에 있는 컴퓨터에게 요청을 보냅니다. *"네가 가지고 있는 특정 리소스를 내가 원하는 방식으로 처리하고, 그 결과를 나에게 돌려달라"*&#xACE0; 말이죠.

이 때 요청하는 쪽이 **클라이언트**, 요청을 처리하고 응답하는 쪽이 **서버**가 되는 거에요. 가장 대표적인 클라이언트는 브라우저로, 사용자를 대신해서 요청을 서버에게 보내고 그 처리결과를 화면에 띄워주는 역할을 합니다. 이 때 어떤 문자열 형식으로 서버에 요청을 보낼 것인가, 클라이언트에게 응답을 보낼 것인가에 대한 형식적 약속(프로토콜)이 바로 HTTP인 것이고요.

그러니까 결국 **웹서버**를 만들라는 얘기는, 클라이언트가 리퀘스트를 보내오면 보유하고 있는 특정 리소스를 클라이언트가 요청하는 방식대로 처리하고 그 결과를 돌려주는 프로그램을 만들라는 얘기입니다. 멘토님이 "*프로그래밍의 기본은 입력, 처리, 출력*이다"라는 얘기를 하신 적이 있는데요. 웹서버 역시 프로그램일 뿐이고, 알고 보면 **요청(입력), 처리, 응답(출력)**&#xC774; 전부입니다.

{% hint style="info" %}
서버(Server)란 Serve를 하는 주체라는 뜻인데, Serve는 '타인의 욕구를 채워주는 일'을 의미합니다. 라틴어 servire에서 왔는데 service, servant도 여기에서 파생되었어요. 그러니까 서버라는 것은 클라이언트의 니즈를 채워주는 일을 하고, 그 중에서도 웹서버는 HTTP를 따르는 Request들을 정해진 방식에 따라 처리하고 Response를 보내는 일을 하는 거지요.
{% endhint %}
