본문 바로가기

HTTP

[HTTP] 웹 서버

 

#1. 웹 서버

웹 서버는 HTTP 요청을 처리하고 응답을 제공한다. 모든 웹 서버는 리소스에 대한 HTTP 요청을 받아서 콘텐츠를 클라이언트에게 돌려준다.

  • 웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현
  • 웹 서버는 자신이 제공하는 리소스를 관리하고 웹 서버를 설정, 통제, 확장하기 위한 관리 기능을 제공
  • 웹 서버는 TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖는다.

#2. 웹서버가 하는 일

 

기본 웹 서버 요청의 단계

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

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

  • 새 커넥션 다루기 : 지속적 커넥션이 없다면 새 커넥션을 열 필요가 있다. 클라이언트가 TCP 커넥션을 요청하면 웹서버는 커넥션을 맺고 TCP 커넥션의 IP주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인한다. 새 커넥션이 맺어지고 받아들여지면, 서버는 새 커넥션을 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 한다.
  • 클라이언트 호스트 명 식별 : 대부분의 웹 서버는 역방향 DNS를 사용해서 클라이언트의 IP주소를 클라이언트의 호스트명으로 변환하도록 설정되어 있다. 웹 서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.
  • ident를 통해 클라이언트 사용자 알아내기 : ident 프로토콜은 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다. ident는 조직 내부에서는 사용할 수 있지만, 공용 인터넷에서는 잘 사용하지 않는다.

단계 2 : 요청 메시지 수신

커넥션에 데이터가 도착하면 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성

  • 메시지의 내부 표현 : 몇몇 웹 서버는 요청 메시지를 쉽게 다룰 수 있도록 내부의 자료구조에 저장한다.
  • 커넥션 입력/출력 처리 아키텍처 : 웹 서버들은 항상 새 요청을 주시하고 있다. 웹 서버 아키텍처의 차이에 따라 요청을 처리하는 방식도 달라진다. (단일-스레드 I/O, 멀티스레드 I/O, 다중 I/O, 다중-멀티스레드 I/O)

웹 서버 입출력 아키텍처


단계 3 : 요청 처리

웹 서버가 요청을 받으면 서버는 요청으로부터 메서드, 리소스, 헤더, 본문(생략 가능)을 얻어내어 처리한다.

  • POST를 비롯한 몇몇 메서드는 요청 메시지에 엔터티 본문이 있을 것을 요구한다.
  • OPTIONS를 비롯한 다수의 메서드는 요청에 본문이 있을 것을 허용하되 요구하지는 않는다.
  • GET과 같이 요청 메시지에 엔터티 본문이 있는 것을 금지하는 메서드도 있다.

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

웹 서버가 클라이언트에 콘텐츠를 전달하려면 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹 서버에서 찾아서 그 콘텐츠의 원천을 식별해야 한다.

  • Docroot : 리소스 매핑의 가장 단순한 형태로 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용
  • 디렉터리 목록 : 경로가 파일이 아닌 디렉터리를 탐색해서 그 내용을 담은 HTML페이지를 반환 (index.html..)
  • 동적 콘텐츠 리소스 매핑 : 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑
  • 서버사이드 인클루드(SSI) : 어떤 리소스가 SSI 포함하고 있는 것으로 설정되어 있다면 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리
  • 접근 제어 : 웹 서버는 각각의 리소스에 접근 제어를 할당할 수 있다.

단계 5 : 응답 만들기

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

  • 응답 엔터티 : 응답 메시지는 Context-Type, Context-Length, 응답 본문의 내용을 포함한다.
  • MIME 타입 결정 : 웹 서버에게는 응답 본문의 MIME 타입을 결정해야하는 책임이 있다.
  • 리다이렉션 :  웹 서버는 종종 성공 메시지 대신 리다이렉션 응답을 반환한다. (리소스가 옮겨진 경우, URL증강, 서버 과부하...)

단계 6 : 응답 보내기

웹 서버는 커넥션 상태를 추적해야 하며 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다. 비지속적인 커넥션이라면 서버는 모든 메시지를 전송했을 때 자신쪽의 커넥션을 닫을 것이다.

지속적인 커넥션이라면 서버가 Content-Length 헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에 커넥션은 열린 상태를 유지할 것이다.


단계 7 : 로깅

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


 

참고 자료

  • HTTP완벽가이드 , 인사이트

'HTTP' 카테고리의 다른 글

[HTTP] 캐시(Cache)  (0) 2020.05.03
[HTTP] 프락시(Proxy)  (0) 2020.05.02
[HTTP] 커넥션 관리  (0) 2020.05.01
[HTTP] HTTP메시지  (0) 2020.04.30
[HTTP] URL과 리소스  (0) 2020.04.30