5장 웹 서버

다채로운 웹 서버

웹 서버는 HTTP 요청을 처리하고 응답을 제공한다.
웹 서버라는 용어는 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비 모두를 가리키는 용어이다.

웹 서버 구현

웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다.
HTTP 프로토콜을 구현하고, 웹 리소스를 관리하고, 웹 서버 관리 기능을 제공한다.
TCP 커넥션 관리에 대한 책임을 OS와 나눠갖는다.

다목적 소프트웨어 웹 서버

다목적 소프트웨어 웹 서버는 네트워크에 연결된 표준 컴퓨터 시스템에서 동작한다.
보통은 오픈 소스 소프트웨어를 사용한다.
대표적으로 아파치, httpd, nginx가 있다.

임베디드 웹 서버

일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버이다.
최소한의 기능만을 제공한다.

간단한 펄 웹 서버

완전한 기능을 갖춘 HTTP 서버를 만들고자 한다면 해야 할 일이 많겠지만 간단한 웹 서버를 만들고자 한다면 펄을 사용하면 된다.
책에서는 ‘HTTP 디버기능을 위해 사용되는 type-o-serve 최소 기능 펄 웹 서버’ 를 구현한 코드가 있다.
코드는 HTTP 요청을 받아서 HTTP 응답을 보내는 기능만을 제공한다.

진짜 웹 서버가 하는 일

기본 웹 서버 요청의 단계

  1. TCP 커넥션 맺기
  2. HTTP 요청 메시지 받기
  3. 요청 처리하기 : 요청 메시지를 해석하고 행동을 취한다.
  4. 리소스에 접근하기 : 메시지에서 지정한 리소스에 접근한다.
  5. HTTP 응답 메시지 만들기 : 응답 메시지를 만들고 리소스를 담는다.
  6. 응답 전송하기 : 응답을 클라이언트에게 돌려준다.
  7. 트랜잭션을 로그에 남기기 : 트랜잭션 완료에 대한 기록 로그를 남긴다.

단계 1: 클라이언트 커넥션 수락

클라이언트가 이미 지속적 커넥션을 갖고 있다면, 클라리언트는 그 커넥션을 사용할 수 있지만 그렇지 않다면 새로운 커넥션을 맺어야 한다.

새 커넥션 다루기

클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인한다.
커넥션을 맺고 나면 서버는 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜본다.
웹 서버는 어떤 커넥션이든 마음대로 닫을 수 있다. 악의적인 클라이언트인 경우 커넥션을 닫는다.

클라이언트 호스트 명 식별

웹 서버는 역방향 DNS를 사용해서 클라이언트 IP주소를 호스트 명으로 변환한다.
Hostname lookup 이라고도 불리는 과정이며 이 과정은 웹 트랜잭션을 느려지게 할 수도 있다.

ident를 통해 클라이언트 사용자 알아내기

IETF ident 프로토콜

  • 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다.
  • 웹 서버 로깅에 유용하게 쓰이며 로그 포맷의 두 번째 필드는 각 HTTP 요청의 ident 사용자 이름을 포함한다.
  • ident 프로토콜은 TCP 포트 113번을 사용한다.

ident 프로토콜 동작 방식

  1. 클라이언트는 HTTP 커넥션을 연다.
  2. 서버는 자신의 커넥션을 클라이언트의 ident 서버 포트(113)을 향해 연다.
  3. 새 커넥션(클라이언트와 서버 포트 번호로 지정되는)에 대응하는 사용자 이름을 묻는 요청을 보낸다.

ident 프로토콜은 보안상의 이유로 조직 내부에서는 사용하지만 공공 인터넷에서는 사용하지 않는다.

단계 2: 요청 메시지 수신

커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다.
요청 메시지를 파싱할 때 웹 서버는 입력 데이터를 네트워크로 부터 불규칙적으로 받는다.
네트워크 커넥션은 언제라도 무효화 될 수 있기에 웹 서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메모리에 임시 저장한다.

메시지의 내부 표현

웹 서버는 요청 메시지를 파싱하여 메모리에 임시 저장한다.

커넥션 입력/출력 처리 아키텍처

웹 서버는 클라이언트들과 각각 한 개 이상의 커넥션을 통해 통신할 수 있게 해준다.

단일 스레드 웹 서버
단일 스레드 웹 서버는 한 번에 하나씩 요청을 처리한다.
트랜잭션이 완료 되어야 다음 커넥션이 처리된다.
단일 스레드 웹 서버는 간단하고 구현하기 쉽지만, 한 번에 하나의 요청만 처리할 수 있기 때문에 성능이 좋지 않다.

멀티프로세스와 멀티스레드 웹 서버
멀티프로세스와 멀티스레드 웹 서버는 여러 개의 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당한다.
스레드/프로세스는 미리 만들어질 수도 있고 필요할 때 만들어질 수도 있다.
매 커넥션마다 스레드/프로세스 하나를 할당하는 경우도 있지만 그로 인해 메모리, 시스템 리소르 낭비를 유발한다.
따라서 대부분은 스레드/프로세스 최대 갯수에 제한을 둔다.

스레드 풀

스레드 풀은 미리 스레드를 생성해 놓고, 요청이 들어오면 스레드 풀에서 스레드를 가져와서 요청을 처리한다.

다중 I/O 서버
대량의 커넥션을 지원하기 위해 다중 I/O 서버를 사용한다.
다중 I/O 서버는 하나의 프로세스 혹은 스레드에서 여러 개의 커넥션을 처리한다.

다중 멀티스레드 웹 서버
멀티스레딩과 다중화를 결합한다.
여러 개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 조금씩 작업을 수행한다.

단계 3: 요청 처리

웹 서버가 요청을 받으면 메서드, 리소스, 헤더, 본문을 얻어내어 처리한다.

단계 4: 리소스의 매핑과 접근

웹 서버는 리소스 서버다.
HTML 페이지나 이미지 파일, 데이터베이스 쿼리 결과 등 다양한 리소스를 제공한다.

Docroot

웹 서버는 리소스를 관리하기 위해 디렉터리 구조를 사용한다.
웹 서버는 리소스를 저장하는 디렉터리를 docroot라고 부른다.

가상 호스팅된 docroot

웹 서버는 하나의 머신에서 여러 개의 웹 사이트를 호스팅할 수 있다.
이를 가상 호스팅이라고 부른다.
가상 호스팅된 웹서버는 URI나 HOST 헤더에서 얻은 IP 주소나 호스트 명을 사용하여 어떤 웹 사이트에 대한 요청인지를 알아낸다.

사용자 홈 디렉터리 docroots
사용자들이 한 대의 웹서버에서 각자의 개인 웹사이트를 만들 수 있도록 해주는 것

디렉터리 목록

웹 서버는 경로가 파일이 아닌 디렉터리를 가리키는 디렉터리 URL에 대한 요청을 받을 수 있다.
이 경우 웹 서버는 다음과 같은 행동을 취한다.

  • 에러를 반환한다.
  • 디렉터리 대신 색인 파일을 반환한다.
  • 디렉터리를 탐색해서 그 내용을 담은 HTML을 반환한다.

동적 콘텐츠 리소스 매핑

웹 서버는 URI를 동적 리소스에 매핑할 수도 있다.
요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑한다.
이는 보통 웹 서버들 중 웹 애플리케이션 서버라고 불리는 백엔드 애플리케이션에서 처리한다.

서버사이드 인클루드(Server-Side Include, SSI)

서버는 콘텐츠에 변수 이름이나 내장된 스크립트가 될 수 있는 어떤 특별한 패턴이 있는지 검사를 받는다.
특별한 패턴은 변수 값이나 실행 가능한 스크립트의 출력 값으로 치환된다.
이러한 기능을 서버사이드 인클루드라고 부른다.<!--#include file-->

접근 제어

웹 서버는 리소스에 대한 접근을 제어할 수 있다.

단계 5: HTTP 응답 만들기

서버가 리소스를 식별하면, 서버는 요청 메서드로 지정된 동작을 수행한다. 이후 응답 메시지를 반환한다.
응답 메시지는 상태 코드, 상태 메시지, 헤더, 본문으로 구성된다.

응답 엔터티

응답 메시지는 응답 엔터티를 포함한다.
응답 메시지는 보통 다음을 포함한다.

  • MIME 타입(Content-Type)
  • 콘텐츠 길이(Content-Length)
  • 실제 응답 본문의 내용

MIME 타입 결정하기

웹 서버는 리소스의 MIME 타입을 결정해야 한다.

mime.types
확장자를 사용하여 MIME 타입을 결정하는 방법이다.

매직 타이밍
파일의 내용을 검사해서 알려진 패턴에 대한 테이블에 해당하는 패턴이 있는지 찾아 MIME 타입을 결정한다.

유형 명시
확장자나 내용에 상관없이 어떤 MIME 타입을 갖도록 웹 서버를 설정

유형 협상
클라이언트와 서버가 서로 협상하여 어떤 MIME 타입을 사용할지 결정한다.

리다이렉션

웹 서버는 성공 메시지 대신 리다이렉션 응답을 반환할 수 있다.
주로 3xx 상태 코드를 사용한다.
Location 헤더에 새로운 URI를 포함한다.

리다이렉트는 이런 경우 사용한다.

  • 영구히 리소스가 옮겨진 경우
    • 301 Moved Permanently를 이용해 새로운 위치로 옮겨졌거나 이름이 바뀌었다고 말 해줄 수 있다.
  • 임시로 리소스가 옮겨진 경우
    • 303 See Other, 307 Temporary Redirect를 이용해 임시로 리소스가 옮겨졌다고 말해줄 수 있다.
    • 임시적이기 때문에 클라이언트가 나중에는 원래 URI로 찾아오기를 바란다.
  • URL 증강
    • 문맥 정보를 포함시키기 위해 재 작성된 URL로 리다이렉트 할 수 있다.
    • 303 See Other, 307 Temporary Redirect를 사용한다.
  • 부하 균형
    • 과부하된 서버가 요청을 받으면 다른 서버로 리다이렉트 할 수 있다.
    • 303 See Other, 307 Temporary Redirect를 사용한다.
  • 친밀한 다른 서버가 있을 때
    • 웹 서버는 어떤 사용자 정보를 가질 때 그 정보를 가진 다른 서버로 리다이렉트 할 수 있다.
    • 303 See Other, 307 Temporary Redirect를 사용한다.
  • 디렉터리 이름 정규화
    • 웹 서버는 디렉터리 이름을 정규화하기 위해 리다이렉트 할 수 있다.

단계 6: 응답 전송

웹 서버는 응답을 클라이언트에게 전송한다.
서버는 커넥션 상태를 추적해야 하며 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다.
비지속적인 커넥션은 응답을 보낸 후 커넥션을 닫는다.

단계 7: 트랜잭션 로깅

웹 서버는 트랜잭션에 대한 로그를 남긴다.

문제

  1. 단일 스레드 웹 서버와 멀티프로세스/멀티스레드 웹 서버 간의 주요 차이점은 무엇이며, 각각의 장단점은 무엇일까요?
    • 단일 스레드 웹 서버:
      • 장점: 간단하고 구현이 쉽다.
      • 단점: 한 번에 하나의 요청만 처리하므로 성능이 좋지 않을 수 있다.
    • 멀티프로세스/멀티스레드 웹 서버:
      • 장점: 여러 개의 요청을 동시에 처리 가능하므로 성능이 향상된다.
      • 단점: 프로세스/스레드 간의 자원 공유와 동기화에 관한 복잡성이 있을 수 있다.
  2. 웹 서버에서 MIME 타입을 결정하는 다양한 방법에 대해 설명하세요. 각 방법의 장단점은 무엇일까요?
    • mime.types: 확장자를 사용하여 MIME 타입을 결정하는 방법.
    • 매직 타이밍: 파일의 내용을 검사하여 패턴에 따라 MIME 타입을 결정하는 방법.
    • 유형 명시: 웹 서버 설정에서 확장자나 내용과 무관하게 MIME 타입을 지정하는 방법.
    • 유형 협상: 클라이언트와 서버 간에 협상하여 MIME 타입을 결정하는 방법.
  3. 리다이렉션의 사용 목적과 리다이렉션 응답 코드인 301과 303/307의 차이에 대해 설명하세요.
    • 목적: 클라이언트를 새로운 URI로 안내하거나, 트래픽을 분산하거나, 리소스의 위치를 변경할 때 사용된다.
    • 301 Moved Permanently: 영구적으로 리소스가 이동한 경우 사용되며, 클라이언트는 새로운 위치로 지속적으로 요청을 보낸다.
    • 303 See Other / 307 Temporary Redirect: 임시적으로 리소스가 이동한 경우 사용되며, 클라이언트는 나중에 원래 URI로 요청을 보내도록 한다.
  4. 서버사이드 인클루드(Server-Side Include, SSI)가 무엇인지 설명하고, 어떤 상황에서 사용될 수 있는지 예시를 들어주세요.
    • 설명: 서버는 특별한 패턴을 가진 콘텐츠에 변수 이름이나 스크립트를 삽입하여 동적으로 처리하는 기술.
    • 예시: <!--#include file--> 패턴을 가진 콘텐츠에 변수 이름이나 스크립트를 삽입하여 동적으로 처리할 수 있다.
    • 사용 예시: 웹 페이지에 동적으로 생성된 날짜, 시간, 사용자 정보 등을 삽입하거나, 특정 조건에 따라 콘텐츠를 다르게 표시할 때 사용된다.
  5. 웹 서버가 클라이언트와 통신하는 과정에서 사용되는 ident 프로토콜에 대해 간단히 설명하세요. 이 프로토콜은 어떤 정보를 제공하며 어떤 용도로 사용될까요?
    • 설명: 클라이언트의 TCP 커넥션을 초기화한 사용자 이름을 서버에게 알려주는 프로토콜.
    • 정보 제공: HTTP 커넥션 초기화를 한 사용자의 식별에 도움을 주어 웹 서버 로깅에 사용된다.
    • 용도: 주로 내부 네트워크에서 사용되며, 공공 인터넷에서는 보안 이슈로 사용되지 않는다.

results matching ""

    No results matching ""