Web server란 무엇인가

1. Web server란?

2. Web server가 하는 일

웹서버는 보통의 경우 다음 7가지의 일을 하게 된다.

step of a basic webserver request

  1. 커넥션 맺기
  2. Request 받기 - HTTP 요청 메시지를 네트워크로 부터 읽어들인다.
  3. Request 처리 - 요청메시지를 해석하여 특정 행동을 취한다.
  4. 리소스 접근 - 메시지에서 지정한 리소스에 접근한다.
  5. Response 만들기 - 올바른 헤더를 포함한 HTTP response 메시지를 생성한다.
  6. Response 전송.
  7. Transaction에 해당하는 log 생성.

3. Web server가 하는 일을 단계별로 살펴보기

1. 클라이언트의 connection 수락

클라이언트가 이미 서버에 대해 지속 커넥션을 맺고 있다면 클라이언트는 그 커넥션을 그대로 사용하는 것이 가능하다. 만약 그렇지 않다면 새 커넥션이 필요해 진다.

ident request

ident 프로토콜은 조직 내부에서는 종종 사용하지만 public service에서는 잘 동작하지 않는데, 그 이유는 다음과 같다.

2. Request 메시지 수신

웹서버는 network 커넥션에서 data를 읽고 parsing하여 request 메시지를 구성한다. Request 메시지를 구성하는 절차는 다음과 같다.

  1. Request 메시지를 parsing하여 method, URI, HTTP version을 찾는다.
  2. 메시지 header를 읽는다.
  3. Request 본문을 읽는다. 이때 Content-length를 참고한다.

Request 메시지를 parsing할 때 웹서버는 data를 불규칙하게 받을 경우가 발생한다. 그렇기 때문에, 일정 분량의 data를 확보할 때 까지 메시지의 일정 부분을 메모리에 저장한다.

1. 메시지의 내부 표현

몇몇 웹서버는 request 메시지 조작을 위해 내부의 자료구조에 저장한다.

2. 커넥션의 input / output 출력 처리 아키텍처

고성능 웹서버는 수천개의 커넥션을 동시에 연결할 수 있도록 지원한다. 이 커넥션들은 웹서버가 많은 클라이언트들과 한 개 이상의 커넥션을 통해 통신할 수 있도록 도와준다. 웹서버들은 다양한 방식으로 요청을 받고, 처리하게 된다.

web server input/output architectures

3. Request의 처리

웹서버가 request를 받으면, 웹서버는 request로 부터 메소드, 리소스, header, 본문을 얻어내어 처리하게 된다.

몇몇 메소드(POST 등)은 반드시 엔터티 본문을 필요로 하며, OPTIONS 같은 경우는 필요하지 않다.

4. 리소스의 매핑과 접근

웹서브는 리소스 서버로, HTML, JPEG같은 미리 만들어진 contents를 제공한다. 또는 리소스 생성 어플리케이션이 만들어낸 동적 contents역시 제공할 수 있다. 이런 리소스를 제공하기 위해 웹서버는 보통 다음과 같은 개념을 사용하게 된다.

1. Docroot

웹서버는 여러 종류의 리소스 매핑을 지원한다. 요청 URI를 웹서버의 파일시스템 안에 있는 file name으로 쓰는 것이 대표적인 방법이다. 이를 위해 웹 서버의 directory 하나를 미리 예약해 사용할 수 있다. 이를 docroot, 혹은 root라 부른다.

Docroot가 설정되어있으면 웹서버는 request 메시지에 있는 URI를 가져와서 docroot뒤에 붙이는 방법으로 정적 리소스를 제공한다.

2. Directory 목록

웹서버는 경로가 file이 아닌 directory를 가리키는 URI에 대한 요청을 받을수도 있다. 대부분의 웹서버는 directory에 대한 요청을 받았을 경우 다음과 같은 동작을 하게 된다.

먼저, 요청한 URI에 대응하는 directory에서 index.html을 찾는다(어떤 파일을 제공할지는 웹서버의 세팅에서 변경하거나 추가할 수 있다). 만약 찾지 못했다면 directory의 내용이 반환된다.

이는 directory listing이라는 웹 취약점 중 하나로, 의도하지 않은 중요한 파일이 노출될 가능성이 있다. 그렇기 때문에 웹서버의 설정을 통해 directory에 대한 색인을 정지시켜야 한다.

3. 동적 contents 리소스 매핑

웹서버는 URI를 동적 content와 매핑할 수 있다. 이를 위해 Web Application Server(WAS)가 필요하며, 어떤 요청을 WAS에 연결해 줄 것인지에 대한 설정 역시 필요하다.

4. Server side include(SSI)

SSI에 대한 설명은 다음 링크로 대체하고자 한다. [Apache SSI]

5. 접근제어

웹서버는 특정 리소스에 대한 클라이언트의 접근을 제어할 수 있다. 클라이언트의 IP주소를 기반으로 엑세스를 제어하거나 비밀번호를 요구할 수도 있다.

5. Response 만들기

웹서버가 리소스를 식별하면 서버는 동작을 수행한 후 response 메시지를 반환하게 된다.

  1. 응답 엔터티 본문이 있다면, 본문과 함께 Content-Type, Content-Length, 실제 본문 등 세 가지를 메시지에 포함시킨다.
  2. MIME 타입 결정 웹서버는 응답 본문의 MIME 타입을 결정해야 할 책임이 있다. MIME 타입을 결정하는 몇 가지 방법은 다음과 같다.
  1. Redirection 웹서버는 다음의 경우 클라이언트에게 redirection 메시지를 보낼 수 있다.

6. Response 보내기

이전에 정리한 글을 전체적으로 읽어보는 것을 추천한다.

7. Logging

웹서버는 trasction이 종료되었을 때 transaction이 어떻게 수행되었는지를 log file에 기록한다.

4. Conclusion

이번장은 내용이 간단한 만큼 빠르게 정리할 수 있었다. 평소 아무생각 없이 사용하던 Apache web server와 nginx가 많은 일을 처리한다는 것을 알 수 있었다.

사실 중요한 파트지만이 책에서 중요하지 않은 파트는 없는 것 같지만 내용 자체가 간단하여 그동안 정리한 내용을 복습하는 느낌이었다.


참고