웹 서버
웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다.
- 웹 서버는 HTTP 프로토콜을 구현하고, 웹 리소스를 관리하고, 웹 서버 관리 기능을 제공한다.
웹 서버 기능
완전한 기능을 갖춘 HTTP 서버를 만들고자 한다면 해야 할 일이 매우 많다.
- 아파치 웹 서버의 코어는 50,000줄이 넘는 코드로 되어 있다.
그러나 최소한으로 기능하는 HTTP 서버라면 30줄 이하의 펄(Perl) 코드로도 만들 수 있다.
웹 서버가 하는 일
모든 웹 서버에서 공통적으로 몇가지 일들을 수행한다.
- 커넥션 맺기 - 클라이언트의 접속을 받아들인다.
- 요청 받기 - HTTP 요청 메세지를 읽어들인다.
- 요청 처리 - 요청 메세지를 해석하고 특정 행동을 취한다.
- 리소스 접근 - 메세지에서 지정한 리소스에 접근한다.
- 응답 생성 - HTTP 응답 메세지를 생성한다.
- 응답 전송 - 응답을 클라이언트에게 돌려준다.
- 트랜잭션 기록 - 로그 파일에 트랜잭션 완료에 대한 기록을 남긴다.
ident 프로토콜을 통해 사용자 알아내기
ident 프로토콜
은 어떤 사용자가 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다.
- 해당 프로토콜을 사용하기 위해선 클라이언트가
ident 프로토콜
을 지원해야 한다.
- 사용자가 웹 서버에 대한 HTTP 커넥션을 초기화한다.
- 웹 서버는 자신의 커넥션을 클라이언트 방향(ident 서버 포트 113)으로 연다.
- 이후 해당 커넥션을 통해 사용자 이름을 묻는 간단한 요청을 보낸다.
ident 프로토콜은 조직 내부에서는 유용하게 사용될 수 있지만, 다음과 같은 이유로 공공 인터넷에서는 사용하기 힘들다.
- 많은 클라이언트 PC가 ident 프로토콜을 지원하지 않는다.
- 방화벽이 ident 트래픽을 막는 경우가 많다.
- 프라이버시 노출 위험이 있다.
커넥션 입/출력 처리 아키텍쳐
웹 서버들은 언제라도 요청이 들어오면 처리할 수 있게 요청을 주시하고 있다.
하지만 처리하는 방식은 웹 서버 아키텍쳐에 따라 달라질 수 있다.
단일 스레드 웹 서버
- 단일 스레드 웹 서버는 한 번에 하나씩 요청을 처리한다.
- 처리 도중에 모든 다른 커넥션은 무시되므로 오직 로드가 적은 서버나 진단도구에서만 사용한다.
멀티스레드 웹 서버
- 멀티스레드 웹 서버는 여러 요청을 동시에 처리한다.
- 해당 구조는 커넥션마다 스레드/프로세스를 할당한다. 하지만 너무 많은 스레드가 생성이 될 수 있으므로 최대 개수에 제한을 둔다.
다중 I/O 웹 서버
- 많은 웹 서버가 대량의 커넥션을 지원하기 해당 구조를 채택했다.
- 다중 I/O 웹 서버는 모든 커넥션의 활동을 감시한다.
- 그 중 처리가 필요한 커넥션이 생기면 리소스를 할당하여 처리한다.
- 이러한 방식의 장점은 스레드와 프로세스같은 리소스가 커넥션에 매여 기다리는 것이 아닌 필요할 때 사용되므로 더 효율적이다.
동적 콘텐츠 리소스 매핑
웹 서버는 URI를 동적 리소스에 매핑할 수도 있다.
즉, 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑한다.
서버사이드 인클루드
- 많은 웹 서버가 서버사이드 인클루드를 지원한다.
- 특정 리소스가 서버사이드 인클루드를 포함하고 있다면 서버는 리소스를 보내기 전에 내부적으로 처리한다.
- 해당 방법은 동적 콘텐츠를 만드는 쉬운 방법이다.
응답(Response)
서버가 HTTP 요청 메세지를 받고 내부적으로 처리를 한다.
그 이후에 서버는 클라이언트에게 올바른 응답을 보내준다.
응답 엔티티
리다이렉션
웹 서버는 응답 메세지 대신 리다이렉션을 응답으로 반환할 수 있다.
즉, 요청을 처리 결과 클라이언트에게 다른 곳으로 갈 수 있도록 응답 메세지를 보내는 것이다.
리다이렉션이 이루어지는 이유는 다음과 같은 이유들이 있다.
- 영구히 리소스가 옮겨진 경우
- 임시로 리소스가 옮겨진 경우
- URL 증강
- 부하 균형
- 친밀한 다른 서버 존재