웹 서버가 하는 일
Web Server는 HTTP 요청을 처리하고 응답한다. 이를 위해 웹 서버는 HTTP와 그와 관련있는 TCP 처리를 구현해야만 한다.
웹 서버가 하는 일은 아래 7가지로 정리할 수 있다.
- 커넥션을 맺는다 - 클라이언트의 접속을 받아들이거나, 원치 않는 클라이언트라면 닫는다.
- 요청을 받는다 - HTTP 요청 메시지를 네트워크로부터 읽어들인다.
- 요청을 처리한다 - 요청 메시지를 해석하고 행동을 취한다.
- 리소스에 접근한다 - 메시지에서 지정한 리소스에 접근한다.
- 응답을 만든다 - 올바른 헤더를 포함한 HTTP 응답 메시지를 생성한다.
- 응답을 보낸다 - 응답을 클라이언트에 돌려준다.
- 트랜잭션을 로그로 남긴다 - 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
1. 클라이언트 커넥션 수락
클라이언트가 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 그 커넥션을 사용할 수 있다. 그렇지 않다면, 클라이언트는 서버에 대한 새 커넥션을 열 필요가 있다.
2. 요청 메시지 수신
커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다. 파싱할 때는 URI, HTTP 헤더, 본문 등을 파싱한다.
3. 요청 처리
웹 서버가 요청을 받으면, 서버는 요청으로부터 메소드, 리소스, 헤더, 본문을 얻어내어 처리한다. POST를 비롯한 몇몇 메소드는 요청 메시지에 본문이 있을 것을 요구한다. 그 외 OPTIONS를 비롯한 다수의 메소드는 요청에 본문이 있는 것을 허용하되 요구하지는 않는다. 많지는 않지만 GET과 같이 요청 메시지에 본문이 있는 것을 금지하는 메소드도 있다.
4. 리소스의 매핑과 접근
웹 서버는 리소스 서버다. 그들은 HTML 페이지나 JPEG 이미지 같은 미리 만들어진 콘텐츠를 제공하며, 마찬가지로 서버 위에서 동작하는 리소스 생성 애플리케이션을 통해 만들어진 동적 콘텐츠도 제공한다. 웹 서버가 클라이언트에 콘텐츠를 전달하려면, 그 전에 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹 서버에서 찾아서 그 콘텐츠의 원천을 식별해야 한다.
5. 응답 만들기
한번 서버가 리소스를 식별하면, 서버는 요청 메소드로 서술되는 동작을 수행한 뒤, 응답 메시지를 반환한다. 응답 메시지는 응답 상태 코드, 응답 헤더, 응답 본문을 포함한다.
6. 응답 보내기
웹 서버는 받을 때와 마찬가지로 커넥션 너머로 데이터를 보낼 때도 비슷한 이슈에 직면한다. 서버는 여러 클라이언트에 대한 많은 커넥션을 가질 수 있다. 그들 중 일부는 아무 것도 안하고 있는 상태이고, 일부는 서버로 데이터를 보내고 있으며, 또다른 일부는 클라이언트로 돌려줄 응답 데이터를 실어 나르고 있을 것이다.
서버는 커넥션 상태를 추적해야 하며 지속적인 커넥션은 특별히 주의해서 다룰 필요가 있다. 비지속적인 커넥션이라면, 서버는 모든 메시지를 전송했을 때 자신 쪽의 커넥션을 닫을 것이다.
지속적인 커넥션이라면 서버가 Content-Length 헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나, 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에 커넥션은 열린 상태를 유지할 것이다.
7. 로깅
마지막으로, 트랜잭션이 완료되었을 때 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그파일에 기록한다.