시작하기 전에..
- 여러 종류의 소프트웨어 및 하드웨어 웹 서버에 대해 조사한다
- 어떻게 웹 서버가 HTTP 트랜잭션을 처리하는지 단계별로 설명한다.
웹 서버가 하는 일
- 커넥션을 맺는다.
- 클라의 접속을 받아들이거나, 원치 않는 클라라면 닫는다.
- 요청을 받는다.
- HTTP 요청 메세지를 네트워크로부터 읽어 들인다.
- 요청을 처리한다.
- 요청 메세지를 해석하고 행동을 취한다.
- 리소스에 접근한다.
- 메세지에서 지정한 리소스에 접근한다.
- 응답을 만든다.
- 올바른 헤더를 포함한 HTTP 응답 메세지를 생성한다.
- 응답을 보낸다.
- 응답을 클라에게 돌려준다.
- 트랜잭션을 로그로 남긴다.
- 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
단계 1 : 클라이언트 커넥션 수락
1. 새 커넥션 다루기
- 클라가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라가 있는지 확인한다.
- 새 커넥션이 맺어지고 받아들여지면, 서버는 새 커넥션을 커넥션 목록에 추가하고, 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 한다.
- 웹 서버는 어떤 커넥션이든 마음대로 거절하거나 즉시 닫을 수 있다.
2. 클라이언트 호스트명 식별
- 역방향 DNS(reverse DNS)를 사용해서 클라의 IP 주소를 클라의 호스트 명으로 변환하도록 설정되어 있다.
- 웹서버는 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.
- 호스트명 룩업(hostname lookup)은 꽤 시간이 많이 걸릴 수 있어, 웹 트랜잭션을 느려지게 할 수 있다.
- 많은 대용량 웹 서버는 호스트명 분석(hostname resolution)을 꺼두거나, 특정 콘텐츠에 대해서만 켜놓는다.
단계 2 : 클라이언트 커넥션 수락
- 커넥션 데이터가 도착하면,
웹서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고,
파싱하여 요청 메세지를 구성한다.
요청 메세지를 파싱할 때, 웹서버는 다음과 같은 일을 한다.
- 요청줄을 파싱하여 요청 메서드, 지정된 리소스의 식별자(URI), 버전 번호를 찾는다.
각 값은 스페이스 한 개로 분리되어 있으며, 요청줄은 캐리지 리턴 줄바꿈(CRLF) 문자열로 끝난다. - 메세지 헤더들을 읽는다. 각 메세지 헤더는 CRLF로 끝난다.
- 헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄을 찾아낸다.
- 요청 본문이 있다면, 읽어 들인다. (길이는 Content-Length 헤더로 정의한다.)
단계 3 : 요청처리
단계 4 : 리소스의 매핑과 접근
동적 콘텐츠 리소스 매핑
- 웹서버는 URI를 동적 리소스에 매핑할 수도 있다.
- 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑하는 것이다.
- 웹서버들 중에서 어플리케이션 서버라고 불리는 것들은 웹서버를 복잡한 백엔드 어플리케이션과 연결하는 일을 한다.
- 어플리케이션 서버는 그에 대한 동적 콘텐츠 생성 프로그램이 어디에 있는지, 그리고 어떻게 그 프로그램을 실행하는지 알려줄 수 있어야 한다.
- 대부분의 웹서버는 동적 리소스를 식별하고 매핑할 수 있는 기본적인 매커니즘을 갖고 있다.
- URI의 경로명이 실행 가능한 프로그램이 위치한 디렉터리로 매핑되도록 설정하는 기능을 제공하는 웹서버도 있다.
- 서버가 실행 가능한 경로명을 포함한 URI로 요청을 받으면, 그 경로에 대응하는 디렉터리에서 프로그램을 찾아 실행하려 시도한다.
단계 5 : 응답 만들기
5.1 응답 엔터티
본문이 있다면, 응답 메세지는 주로 다음을 포함한다.
- 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
- 응답 본문의 길이를 서술하는 Content-Length 헤더
- 실제 응답 본문의 내용
5.2 MIME 타입 결정하기
웹 서버에게는 응답 본문의 MIME타입을 결정해야하는 책임이 있다.
MIME타입과 리소스를 연결하는 여러 가지 방법이다.
6. 응답 보내기
- 서버는 여러 클라에 대한 많은 커넥션을 가질 수 있다. 그들 중 일부는 아무것도 안 하고 있는 상태이고, 일부는 서버로 데이터를 보내고 있으며, 또 다른 일부는 클라로 돌려줄 응답 데이터를 실어 나르고 있을 것이다.
- 서버는 커넥션 상태를 추적해야 하며,
지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다. - 비지속 커넥션이라면, 서버는 모든 메세지를 전송했을 때 자신 쪽 커넥션을 닫을 것이다.
- 지속적인 커넥션이라면,
서버가 Content-Length 헤더를 바르게 계산하기 위해 특별히 주의를 필요로 하는 경우,
클라가 응답이 언제 끝나는지 알 수 없는 경우, 커넥션은 열린 상태를 유지할 것이다.
'기술서적' 카테고리의 다른 글
[비트코인 - 공개 블록체인 프로그래밍] #1 UTXO, 거래 (0) | 2023.04.23 |
---|---|
[HTTP 완벽가이드] 6장 - 프락시 (0) | 2022.07.15 |
[HTTP 완벽가이드] 4장 - 커넥션 관리 (0) | 2022.07.13 |
[HTTP 완벽가이드] 3장 - HTTP 메세지 (0) | 2022.07.12 |
[HTTP 완벽가이드] 2장 - URL과 리소스 (0) | 2022.07.12 |