이 장에서 알아볼 내용
-
여러 종류의 소프트웨어 및 하드웨어 웹 서버에 대해 조사한다
-
HTTP 통신을 진단해주는 간단한 웹 서버를 펄(Perl)로 작성해본다
-
어떻게 웹 서버가 HTTP 트랜잭션을 처리하는지 단계별로 설명한다
1 다채로운 웹 서버
1.1 웹 서버 구현
-
HTTP 프로토콜을 구현
-
웹 리소스를 관리
-
웹 서버 관리
-
TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖음
1.2 다목적 소프트웨어 웹 서버
-
거의 모든 컴퓨터와 운영체제에서 동작
1.3 임베디드 웹 서버
-
일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버
ex) 프린터나 가전제품
2 간단한 펄 웹 서버
-
펄 웹 서버 프로그램은 클라이언트와 프락시 간의 상호작용 테스트에 유용한 진단 툴
-
HTTP 디버깅을 위해 사용
-
펄 서버 프로그램은 클라이언트에게 돌려줄 서버 응답에 들어갈 내용을 직접 타이핑해 넣을 수 있게 해준다
웹 서버가 하는 일
단계 1 : 클라이언트 커넥션 수락
4.1 새 커넥션 다루기
-
클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP커넥션에서 IP주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인
— TCP 커넥션을 전송 커넥션으로 이해해도 좋을 것 같다
-
웹 서버는 어떤 커넥션이든 판단하여 거절하거나 닫을 수 있다
4.2 클라이언트 호스트 명 식별
-
웹 서버는 역방향 DNS를 사용해 클라이언트의 IP주소를 호스트 명으로 변환하도록 설정되어 있다
-
대용량 웹 서버는 트랜잭션을 느려지게 하지 않기 위해 호스트명 분석을 꺼두거나 특정 콘텐츠에 대해서만 켜놓는다
HTML과 CGL 리소스에 대한 호스트 명 룩업 아파치 설정
HostnameLookups off
<Files ! "\. (html|htm|cgi)$">
HostnameLookups on
</Files>
→ HTML과 CGI리소스만을 위해 호스트명 분석을 킨다는 뜻
4.3 ident를 통해 클라이언트 사용자 알아내기
-
만약 클라이언트가 ident 프로토콜을 지원한다면, 클라이언트는 ident 결과를 위해 TCP 포트 113번을 listen한다
-
공공 인터넷에서는 여러 이유로 잘 동작하지 않으며, 보통 ident정보가 없기 때문에 일반 로그 포맷 로그파일의 두번째 필드는 하이픈(-)으로 채워진다
단계 2 : 요청 메시지 수신
-
커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다
-
요청 메시지 파싱 - 각 값은 스페이스 한 개로 분리되어 있으며, 요청줄은 캐리지 리턴 줄바꿈(CRLF)문자열로 끝난다
5.1 메시지의 내부 표현
5.2 커넥션 입력/출력 처리 아키텍쳐
단계 3 : 요청 처리
단계 4 : 리소스의 매핑과 접근
7.1 Docroot
-
리소스 매핑의 가장 단순한 형태
-
웹 서버는 요청 메시지에서 URL을 가져와 문서 루트(혹은 docroot) 뒤에 붙인다.
-
웹 콘텐츠가 들어간 웹 서버 파일 시스템의 특정 폴더를 문서 루트 혹은 docroot라고 한다
-
문서 루트의 설정DocumentRoot /usr/local/httpd/files
-
서버는 상대 url이 docroot를 벗어나서 docroot 이외 부분이 노출되는 일이 생기지 않도록 해야한다
-
docroot의 활용
-
가상 호스팅된 docroot
-
한 웹 서버에서 여러 개의 웹 사이트를 호스팅 할 때
-
-
사용자 홈 디렉터리 docroot
-
-
-
사용자들이 한 대의 웹 서버에서 각자의 개인 웹 사이트를 만들 수 있도록 해 주는 것
-
보통 빗금(/)과 물결표(~) 다음에 사용자 이름이 오는 것으로 시작하는 URL는 그 사용자의 개인 문서 루트를 가리킨다.
-
<--아파치 웹 서버 가상 호스트 docroot 설정 -->
<VirtualHost www.joes-hardware.com>
ServerName www.joes-hardware.com
DocumentRoot /docs/jes
TransferLog /logs/joe.access_log
ErrorLog /logs/joe.error+log
</VirtualHost>
7.2 디렉터리 목록
-
사용자가 어떤 디렉터리에 대한 URL을 요청했는데, 그 디렉터리가 index.html이란 이름을 가진 파일을 가지고 있다면, 서버는 그 파일의 콘텐츠를 반환한다.
-
아파치 웹 서버에서, DirectoryIndex설정 지시자를 사용해서 기본 디렉터리 파일로 사용될 파일 이름의 집합을 설정할 수 있다.
DirectoryIndex index.html index.htm home.html home.htm index.cgi
-
만약 기본 색인파일(ex.index.html)이 없고 디렉토리 색인 기능이 켜져 있다면, 디렉터리의 정보와 링크와 함께 열거된 HTML파일을 반환한다.
디렉터리 색인 파일 자동 생성을 끄는 아파치 지시자
Option -Indexes
7.3 동적 콘텐츠 리소스 매핑
-
아파치의 설정 지시자
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-programs/
→ URI의 경로가 /cgi-bin/로 시작하면 /usr/local/etc/httpd/cgi-programs/에서 프로그램을 찾아서 실행하라는 뜻
AddHandler cgi-script .cgi
→ .cgi로 끝나는 모든 웹 리소스는 실행되어야한다
-
아파치의 경우 URL의 경로명이 실행 가능한 프로그램이 위치한 디렉토리로 매핑되도록 하는 기능을 제공한다
-
어떤 리소스가 동적 리소스라면, 서버는 그에 대한 동적 콘텐츠 생성 프로그램이 어디에있고 어떻게 그 프로그램을 실행하는지 알려줄 수 있어야 한다.
7.4 서버사이드 인클루드(Server-Side Includes, SSI)
7.5 접근 제어
-
클라이언트 IP 주소에 근거하여 접근을 제어할 수 있고 혹은 리소스에 접근하기 위한 비밀번호를 물어볼 수도 있다.
단계 5 : 응답 만들기
8.1 응답 엔터티
8.2 MIME 타입 결정하기
-
MIME 타입과 리소스를 연결하는 여러가지 방법 - mime.types, 매직 타이핑, 유형 명시, 유형 협상
-
mime.types
단계 6 : 응답 보내기
단계 7 : 로깅
-
트랜잭션이 완료되었을 때, 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그파일에 기록한다.
-
대부분의 웹 서버는 로깅에 대한 여러가지설정 양식을 제공한다
출처 : 데이빗 골리 외 4인, HTTP 완벽 가이드 :웹은 어떻게 동작하는가, 이응준 , 정상일 옮김, 인사이트, 2014
'Study' 카테고리의 다른 글
[HTTP 완벽 가이드] 7장 : 캐시 (0) | 2021.01.11 |
---|---|
[HTTP 완벽 가이드] 6장 : 프락시 (0) | 2020.12.18 |
[HTTP 완벽 가이드] 4장 : 커넥션 관리 (0) | 2020.12.16 |
[HTTP 완벽 가이드] 3장 : HTTP 메시지 (0) | 2020.12.15 |
[HTTP 완벽 가이드] 2장 : URL과 리소스 (0) | 2020.12.14 |