웹 서버는 월드 와이드 웹의 일꾼
웹 서버 = 하드웨어 + 소프트웨어
모든 웹 서버는 리소스에 대한 http 요청을 받아서 콘텐츠를 클라이언트에게 돌려준다.
웹 서버 = http 및 그와 관련된 TCP 처리를 구현한 것
여러가지 형태가 가능한데
sw를 hw에 설치하고 실행할 수 있다.
기기 안에 웹 서버를 내장시켜서 완전한 관리 콘솔로 제공한다.
만약 이미 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 그 커넥션을 사용할 수 있다.
그렇지 않다면, 새로운 커넥션을 열 필요가 있다.
클라이언트가 TCP 커넥션을 요청하면,
서버는 IP주소를 추출해 클라이언트를 확인한다.
만약 새 커넥션이 맺어진다면, 서버는 새 커넥션을 커넥션 목록에 추가한다.
서버는 언제든 커넥션을 거절하거나 즉시 닫을 수 있다.
서버는 역방향 DNS를 사용해서 클라이언트의 IP주소를 호스트 명으로 변환할 수 있다. 다만 웹 트랜잭션을 느려지게 할 수 있다.
역방향 DNS = IP주소를 통해 이름을 얻어 신뢰도를 판단하는 방법. 스팸 메일 처리에 적용
ident 프로토콜 = 특정 TCP 연결 사용자 식별 프로토콜
조직 내부에서는 사용할 수 있으나, 공공인터넷에서는 잘 동작하지 않는다.
결국 클라이언트를 신뢰할 수 있는가가 문제이다.
클라이언트가 고의적 혹은 실수로 ident를 잘못 보낸다면? -> 무결성이 의심
비 TCP/IP 연결 (로컬 연결)에 대해서는 ident를 지정하면
-> Peer 인증을 대신 사용한다.
Peer 인증? -> 클라이언트 운영체제 사용자 이름을 커널로부터 획득
서버는 요청을 파싱해 메세지를 구성하면서 아래와 같은 일을 수행한다.
서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 메모리에임시로 저장해 둘 필요가 있다.
몇명 웹 서버는 요청 메세지를 쉽게 다를 수 있도록 내부의 자료 구조에 저장한다.
단일 스레드 웹 서버
한 번에 하나씩 요청을 처리
구현은 간단하나 성능이 매우 안좋음
멀티 프로세스, 멀티스레드 웹 서버
여러 요청을 동시에 처리하기위해 여러 개의 프로세스, 스레드를 사용
너무 많은 자원(메모리, 시스템 리소스)를 소모하므로 최대 개수에 제한
다중 I/O 서버
대량의 커넥션을 지원하기 위해 커넥션의 활동을 감시
다중 멀티스레드 웹 서버
멀티스레딩과 다중화의 결합
요청을 받은 것을 처리한다.
몇몇 메서드는 본문을 금지하거나, 요구한다.
웹 서버 = 리소스 서버
미리 만들어진 콘텐츠를 제공하거나, 동적인 컨텐츠를 제공한다.
특별한 폴더를 웹 콘텐츠를 위해 예약해둔 것.
서버는 파일 시스템의 docroot 이외 부분이 노출되는 일이 생기지 않도록 주의해야한다.
가상 호스팅된 docroot
한 웹 서버에서 여러개의 웹 사이트를 호스팅 하는 경우가 있다.(같은 IP -> 여러 도메인)
접근 도메인별로 DocumentRoot 설정을 달리하여 리소스 접근을 핸들링할 수 있다.
사용자 홈 디렉터리 docroots
docroot를 활용하여 사용자들이 한대의 웹 서버에서 각자의 개인 웹 사이트를 만들 수 있도록 해준다.
웹 서버는 디렉터리 URL에 대한 요청을 받을 수 있고 아래와 같은 동작을 하도록 설정할 수 있다.
위의 설정이 가능하며 몇몇은 보안에 문제가 있다.
URI를 동적 리소스에 매핑할 수 있다. = 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑
요청에 맞게 콘텐츠를 생성하는 프로그램 = CGI
CGI = 공용 게이트웨이 인터페이스(Common Gateway Interface)
: 웹 서버에서 사용자 프로그램을 동작시키는 인터페이스
독립적, 쉽고, 가볍고, 재사용이 쉽고, 안전하다.
다만 느리고 메모리를 많이 사용한다.
설정되어있다면, 서버는 그 리소스의 콘텐츠를 클라이언트에 보내기 전에 처리한다.
주로 방문자 수, 조회 수 처리에 사용.
부가적으로 서버사이드 인젝션이라는 키워드가 많이 나온다.
웹 서버는 각각의 리소스에 접근 제어를 할당할 수 있다.
응답 메세지는 응답 상태코드, 응답 헤더, 응답 본문을 포함한다.
트랜잭션이 응답 본문을 생성한다면 주로 다음을 포함한다.
서버는 요청을 수행하기 위해 브라우저가 다른 곳으로 가도록 리다이렉트 할 수 있다.
다음은 리다이렉트가 유용한 경우
서버는 커넥션 상태를 추적해야 하며, 비지속적인 커넥션이라면 자신쪽의 커넥션을 다을 것이다.
지속적인 커넥션이고 응답이 언제 끝나는 지 알수 없다면 열린 상태를 유지할 것이다.
트랜잭션이 완료되었을 때 웹 서버는 트랜잭션이 어떻게 수행되었는지 로그에 기록한다.