[HTTP] 웹 서버

Jade·2021년 3월 28일
0

5.1 다채로운 웹 서버

웹 서버는 HTTP 요청을 처리하고 응답을 제공한다.

5.1.1 웹 서버 구현

웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다.

  • HTTP 프로토콜을 구현하고, 웹 리소스를 관리하고, 웹 서버 관리 기능을 제공한다.
  • TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖는다.

웹 서버는 여러 가지 형태가 가능하다. 이러한 구현들을 각각 살펴보자.

5.1.2 다목적 소프트웨어 웹 서버

  • 다목적 소프트웨어 웹 서버는 네트워크에 연결된 표준 컴퓨터 시스템에서 동작한다.
  • 세상에는 수 만 가지 종류의 웹 서버 프로그램이 존재하지만, 그 중 몇가지 웹 서버 소프트웨어만이 널리 사용된다. (Microsoft, Apache, nginx 등)

5.1.3 임베디드 웹서버

  • 임베디드 웹 서버는 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버다.

5.3 웹 서버가 하는 일

  1. 커넥션을 맺는다. -- 클라이언트의 접속을 받아들이거나, 원치 않은 클라이언트라면 닫는다.
  2. 요청을 받는다. -- HTTP 요청 메시지를 네트워크로부터 읽어 들인다.
  3. 요청을 처리한다. -- 요청 메시지를 해석하고 행동을 취한다.
  4. 리소스에 접근한다. -- 메시지에서 지정한 리소스에 접근한다.
  5. 응답을 만든다. -- 올바른 헤더를 포함한 HTTP 응답 메시지를 생성한다.
  6. 응답을 보낸다. -- 응답을 클라이언트에게 돌려준다.
  7. 트랜잭션을 로그로 남긴다. -- 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.

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

5.4.1 새 커넥션 다루기

  • 클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인한다.
  • 새 커넥션이 맺어지면 서버는 커넥션 목록에 새 커넥션을 추가한다.
  • 웹 서버는 어떤 커넥션이든 마음대로 거절하거나 닫을 수 있다.

5.4.2 클라이언트 호스트 명 식별

  • 대부분의 웹 서버는 역방향 DNS(reverse DNS)를 사용하여 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정되어 있다.
  • 웹 서버는 클라이언트의 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.

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

몇몇 웹 서버는 IETF ident 프로토콜을 지원한다. 이것은 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 알 수 있게 해준다.

하지만 ident는 조직 내부가 아닌 공공 인터넷에서는 속도, 보안을 이유로 잘 쓰이지 않는다.

5.5 단계 2: 요청 메시지 수신

  • 커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다.
  • 요청 메시지를 파싱할 때, 웹 서버는 데이터를 네트워크로부터 불규칙적으로 받는다.

5.5.1 메시지의 내부 표현

몇몇 웹서버는 요청 메시지를 쉽게 다룰 수 있도록 내부의 자료 구조에 저장한다.

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

고성능 웹 서버는 수천 개의 커넥션을 동시에 열 수 있도록 지원한다. 웹 서버 아키텍처 차이에 따라 요청하는 처리 방식도 달라진다. 아키텍처 차이에 따른 웹 서버의 종류는 다음과 같다.

  • 단일 스레드 웹 서버
  • 멀티프로세스와 멀티스레드 웹 서버
  • 다중 I/O 서버
  • 다중 멀티스레드 웹 서버

5.6 단계 3: 요청 처리

웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문(없는 경우도 있음)을 얻어내어 처리한다.

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

웹 서버는 HTML 페이지나 JPED 이미지 같은 미리 만들어진 콘텐츠를 제공하며, 마찬가지로 동적 콘텐츠도 제공한다. 웹 서버가 알맞은 콘텐츠를 전달하려면, 요청 메시지 URI에 대응하는 리소스를 웹 서버에서 찾아내 식별해야 한다.

웹 서버는 다음과 같이 여러 종류의 리소스 매핑을 지원한다.

5.7.1 Docroot

리소스 매핑의 가장 단순한 형태로 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용하는 것이다. 일반적으로 웹 서버 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약 해둔다.

아파치 웹 서버의 경우 http.conf 설정 파일에 DocumentRoot 줄을 추가하여 웹서버의 Docroot를 설정할 수 있다.

5.7.2 디렉터리 목록

웹 서버는 경로가 파일이 아닌 디렉터리를 가리키는, 디렉터리 URI에 대한 요청을 받을 수 있다.

대부분의 웹 서버는 요청한 URI에서 대응되는 디렉터리 안에서 index.html 혹은 index.html으로 이름이 붙은 파일을 찾는다.

5.7.3 동적 콘텐츠 리소스 매핑

웹 서버들 중에서 애플리케이션 서버라고 불리는 것들은 웹 서버를 복잡한 백엔드 애플리케이션과 연결 하는 일을 한다.

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

만약 어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되어 있다면, 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리한다.

5.7.5 접근 제어

접근 제어 되는 리소스에 대한 요청이 도착했을 때, 웹 서버는 클라이언트의 IP 주소에 근거하여 접근을 제어하거나 비밀번호를 물어볼 수도 있다.

5.8 단계 5: 응답 만들기

서버가 리소스를 식별하면 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환한다.

5.8.1 응답 엔터티

만약 트랜잭션이 응답 본문을 생성한다면, 그 내용을 응답 메시지와 함께 돌려보낸다.

본문이 있다면, Content-Type 헤더, Content-Length 헤더, 실제 응답 본문의 내용을 주로 포함하여 돌려보낸다.

5.8.2 MIME 타입 결정하기

MIME 타입과 리소스를 연결하는 여러 가지 방법

  • mime.types
  • 매직 타이핑
  • 유형 명시(Explicit typing)
  • 유형 협상(Type negotiation)

5.8.3 리다이렉션

웹 서버는 종종 성공 메시지 대신 브라우저가 다른 곳으로 가도록 리다이렉션 응답을 반환한다.

리다이렉트는 주로 다음의 경우에 유용하다.

  • 영구히 리소스가 옮겨진 경우
  • 임시로 리소스가 옮겨진 경우
  • URL 증강
  • 부하 균형
  • 친밀한 다른 서버가 있을 때
  • 디렉터리 이름 정규화

5.9 단계 6: 응답 보내기

서버는 커넥션 너머로 데이터를 보낼 때 계속해서 커넥션 상태를 추적해야 한다.

5.10 단계 7: 로깅

트랜잭션이 완료되었을 때, 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그 파일에 기록한다.

📌 데이빗 고울리, 브라이언 토티, 마조리 세이어, 세일루 레디, 안슈 아가왈 공저 이응준, 정상일 공역, 『HTTP 완벽 가이드: 웹은 어떻게 동작하는가』, 인사이트(2014)

profile
우당탕탕 좌충우돌 인프라 여행기

0개의 댓글