본문 바로가기
IT 공부/HTTP 완벽가이드

5장 웹서버

by 노란망치 2023. 3. 31.

이 장에서 배울 것은

  1. 여러 종류의 소프트웨어 및 하드웨어 웹 서버에 대해 조사
  2. HTTP 통신을 진단해주는 간단한 웹 서버를 제작
  3. 어떻게 웹 서버가 HTTP 트랜잭션을 처리하는지 단계별 설명

웹 서버란?

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

웹 서버가 하는 일

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

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

  • 웹 서버는 TCP 커넥션을 맺고, IP 주소를 추출하여 어떤 클라이언트가 있는지 확인
  • 이 커넥션을 목록에 추가하고, 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 함
  • 웹 서버는 해당 커넥션을 거절하거나 즉시 닫을 수 있다.
    • IP 주소나, 호스트명이 인가되지 않았거나, 악의적일 경우
  • 웹 서버는 역방향 DNS를 사용해서 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정할 수 있다.
    • 성능저하 우려로 꺼두거나, 특정 컨텐츠에 대해서만 켜둔다.
  • ident 프로토콜을 이용하여 클라이언트 정보를 알아낼 수는 있으나, 안쓰는 듯??

단계 2 : 요청 메시지 수신

  • 커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고, 파싱하여 요청 메시지를 구성
  • 요청 메시지를 파싱할 때, 웹 서버는 입력 데이터를 네트워크로부터 불규칙적으로 받는다.
    • 그렇기 떄문에 파싱해서 이해하는 것이 가능한 수준의 분량 확보할 때까지 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장한다.
  • 커넥션 입력/출력 처리 아키텍처 
    1. 단일 스레드 웹 서버
      • 해당 서버는 한 번에 하나씩 요청을 처리한다.
      • 처리 도중에는 다른 커넥션 처리를 하지 못한다.
      • 오버로드가 작은 서버에서 구성해야 한다.
    2. 멀티 프로세스와 멀티 스레드 웹서버
      • 여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당한다.
      • 매 커넥션마다 스레드 혹은 프로세스 하나를 할당하기 때문에 너무 많은 리소스 소모가 있다.
    3. 다중 I/O 서버
      • 대량의 커넥션을 지원하기 위해, 많은 웹서버는 다중 아키텍처를 채택한다.
      • 모든 커넥션은 동시에 그 활동을 감시당한다.
      • 커넥션의 상태가 데이터를 사용할 수 있거나, 에러가 발생 등 상태가 바뀌면 그 커넥션에 대해 작은 양의 처리를 수행한다.
      • 처리가 완료되면 커넥션은 다음번 상태 변경을 위해 열린 커넥션 목록으로 들어간다.
    4. 다중 멀티 스레드 웹 서버
      • 2번과 3번을 합친 아키텍처이다. 여러 개의 스레드는 각각 열려 있는 커넥션을 감시하고, 조금씩 작업을 한다.

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


단계 3 : 요청 처리

  • 요청은 받으면 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리한다.

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

  • 웹서버가 클라이언트에 콘텐츠를 전달하려면, 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹서버에서 찾아서 그 콘텐츠의 원천을 식별해야 한다.
  1. 가상 호스팅된 docroot
    • 가상 호스팅 웹서버는 각 사이트에 그들만의 분리된 문서 루트를 주는 방법으로, 한 웹서버에 여러 개의 웹 사이트를 호스팅 한다.
    • 이 방법으로 하나의 웹 서버에서 두 개의 사이트가 완전히 분리된 콘텐츠를 갖고 호스팅 되도록 할 수 있다.
  2. 디렉토리 목록
    • 클라이언트가 보내는 URI에 index.html 이런 것 까지 적지는 않는다.
    • 이는 웹 서버에서 DIrectoryIndex 설정 지시자 때문인데, 클라이언트가 디렉터리까지 보내도, 웹서버가 index.html, index.jsp 등을 찾아 콘텐츠를 반환한다.
  3. 동적 콘텐츠 리소스 매핑
    • 웹 서버는 URI를 동적 리소스에 매핑할 수도 있다.
    • 즉, 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑한다.
    • 일반적인 WEB-WAS 간 매핑이라고 생각하면 될 것 같다.

단계 5 : 응답 만들기

  • 응답 메시지는 응답 상태 코드, 응답 헤더, 응답 본문을 포함한다.
  • 응답 메시지는 주로 아래를 포함한다.
    1. 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
    2. 응답 본문의 길이를 서술하는 Content-Length 헤더
    3. 실제 응답 본문의 내용

단계 6 : 응답 보내기

  • 웹 서버는 받을 때와 마찬가지로 커넥션 너머로 데이터를 보낼 때도 비슷한 이슈에 직면한다.
  • 서버는 여러 클라이언트와 커네션을 가질 수 있고, 그들 중 일부는 아무것도 안할 수 있고, 서버로 데이터를 보내고 있고, 또 일부는 클라이언트로 응답 데이터를 실어 나를 수 있다.
  • 서버는 커넥션 상태를 추적해야 하며, 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다.
    • 서버가 Content-Length 헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나, 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에, 커넥션은 열린 상태를 유지할 것이다.

단계 7 : 로깅

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

 

'IT 공부 > HTTP 완벽가이드' 카테고리의 다른 글

4장 커넥션 관리  (0) 2023.03.31

댓글