[5장] 웹 서버

DAYEON·2021년 8월 22일
0

HTTP 완벽 가이드

목록 보기
3/8
post-thumbnail

5.1 다채로운 웹 서버

  • 웹 서버 : 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비 양쪽을 모두 가리킴

5.1.1 웹 서버 구현

  • 웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것
  • 자신이 제공하는 리소스를 관리하고 웹 서버를 설정, 통제, 확장하기 위한 관리 기능 제공

웹 서버의 형태

  • 다목적 소프트웨어 웹 서버를 표준 컴퓨터 시스템에 설치하고 실행할 수 있음
  • 마이크로프로세서의 기적으로, 어떤 회사들은 사용자에게 판매할 전자기기 안에 몇 개의 컴퓨터 칩만으로 구현된 웹 서버를 내장시켜서 완전한 관리 콘솔로 제공

5.1.2 다목적 소프트웨어 웹 서버

  • 다목적 소프트웨어 웹 서버는 네트워크에 연결된 표준 컴퓨터 시스템에서 동작
  • EX) 오픈 소스 소프트웨어(아파치, W3C의 직소), 상용 소프트웨어(마이크로 소프트, 아이플래닛 웹 서버)

5.1.3 임베디드 웹 서버

  • 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버
  • 그들의 일반 소비자용 기기를 간편한 웹 브라우저 인터페이스로 관리할 수 있게 해줌


5.2 간단한 펄 웹 서버

  • (생략)


5.3 진짜 웹 서버가 하는 일

하는 일

  • 커넥션을 맺음
  • 요청을 받음
  • 요청을 처리
  • 리소스에 접근
  • 응답 생성
  • 응답 보냄
  • 트랜잭션을 로그로 남김


5.4 단계 1: 클라이언트 커넥션 수락

  • 클라이언트가 이미 서버에 열려있는 지속적 커넥션을 가지고 있다면 해당 커넥션 사용 가능
  • 그렇지 않다면 새 커넥션 필요

5.4.1 새 커넥션 다루기

  • 웹 서버는 새 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인
  • 웹 서버는 어떤 커넥션이든 마음대로 거절하거나 즉시 닫기 가능
  • 신원 식별 기법 사용 가능 (IP 주소, 호스트 명 인가 확인)

5.4.2 클라이언트 호스트 명 식별

  • 대부분의 웹 서버들은 DNS (역방향)을 사용해 클라이언트의 IP 주소를 클라이언트의 호스트 명으로 변환하도록 설정
  • 클라이언트 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용 가능

5.4.3 ident를 통해 클라이언트 사용자 알아내기

  • 몇몇 웹 서버는 IETF ident 프로토콜 지원
  • ident 프로토콜 :
    서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해줌
  • ident는 조직 내부에서는 잘 사용할 수 있지만 공공 인터넷에서는 여러 이유로 잘 동작하지 않음

ident가 공공 인터넷에서 동작하지 않는 이유

  • 많은 클라이언트 PC는 identd 신원확인 프로토콜 데몬 소프트웨어를 실행하지 않음
  • HTTP 트랜잭션을 유의미하게 지연시킴
  • 방화벽이 이 트래픽을 들어오는 것을 막는 경우가 많음
  • 안전하지 않고 조작하기 쉬움
  • 가상 IP 주소를 잘 지원하지 않음
  • 클라이언트 사용자 이름의 노출로 인한 프라이버시 침해의 우려가 있음


5.5 단계 2: 요청 메시지 수신

요청 메시지 파싱 시, 웹 서버가 하는 일

  • 요청줄을 파싱하여 요청 메서드, 지정된 리소스의 식별자(URI), 버전 번호를 찾음
  • 메시지 헤더들을 읽음 (각 메시지 헤더는 CRLF로 끝남)
  • 헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄을 찾아냄
  • 요청 본문이 있다면 읽어들임 (길이는 Content-Length 헤더로 정의)

5.5.1 메시지의 내부 표현

  • 몇몇 웹 서버는 요청 메시지를 쉽게 다룰 수 있도록 내부의 자료 구조에 저장

5.5.2 커넥션 입력/출력 처리 아키텍처

  • 고성능 웹 서버는 수천 개의 커넥션을 동시에 열 수 있도록 지원
  • 웹 서버는 항상 새 요청을 주시
  • 웹 서버 아키텍처의 차이에 따라 요청을 처리하는 방식도 달라짐

요청 처리 방식

  • 단일 스레드 웹 서버 그림
    • 한번에 하나씩 요청 처리
    • 트랜잭션 완료 시, 다음 커넥션이 처리
  • 멀티프로세스와 멀티스레드 웹 서버
    • 여러 요청을 동시에 처리하기 위해 여러개의 프로세스 혹은 고효율 스레드를 할당
  • 다중 I/O 서버
    • 모든 커넥션은 동시에 해당 활동을 감시
    • 커넥션의 상태가 바뀌면 그 커넥션에 대한 작은 양의 처리 수행
  • 다중 멀치스레드 웹 서버
    • 여러 개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 조금씩 작업을 수행


5.6 단계 3: 요청 처리

  • 웹 서버가 요청을 받으면 서버는 요청으로부터 메서드,리소스,헤더,본문을 얻어내어 처리


5.7 단계 4: 리소스의 맵핑과 접근

  • 웹 서버는 리소스 서버
  • 웹 서버가 클라이언트에 콘텐츠를 전달하려면, 그 전에 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹 서버에서 찾아 그 콘텐츠의 원천을 식별해야 함

5.7.1 Docroot

  • 리소스 매핑의 가장 단순한 형태는 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용하는 것
  • docroot :
    웹 서버 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약해 둔 것
  • 웹 서버는 요청 메시지에서 URI를 가져와서 문서 루트 뒤에 붙임
  • 가상 호스팅된 docroot
    • 각 사이트에서 그들만의 분리된 문서 루트를 주는 방법으로 한 웹 서버에서 여러 개의 웹 사이트를 호스팅 함
    • 하나의 웹 서버 위에서 두 개의 사이트가 완전히 분리된 콘텐츠를 호스팅 되도록 할 수 있음
  • 사용자 홈 디렉터리 docroots
  • 사용자들이 한 대의 웹 서버에서 각자의 개인 웹 사이트를 만들도록 해주는 것
  • /~사용자이름으로 시작하는 URI는 그 사용자의 개인 문서 루트를 가리킴

5.7.2 디렉터리 목록

  • 웹 서버는 경로가 파일이 아닌 디렉터리를 가리키는, 디렉터리 URL에 대한 요청을 받을 수 있음

디렉터리 URL 요청 시 설정할 수 있는 행동

  • 에러 반환
  • 디렉터리 대신 특별한 색인 파일 반환
  • 디렉터리 탐색 후 그 내용을 담은 HTML 페이지 반환

5.7.3 동적 콘텐츠 리소스 매핑

  • 웹 서버는 URI를 동적 리소스에 매핑할 수도 있음
    = 요청에 맞게 콘텐츠를 생성하는 프로그램에 URI 매핑
  • 동적 리소스 사용 시, 애플리케이션 서버는 그에 대한 동적 콘텐츠 생성 프로그램이 어디에/어떻게 실행하는지 알려줄 수 있어야 함
  • → 대부분의 웹 서버는 동적 리소스를 식별하고 매핑할 수 있는 매커니즘 보유

5.7.4 서버사이드 인클루드(Server-Side Includes, SSI)

  • 어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되면, 서버는 그 리소스의 콘텐츠를 클라이언트에 보내기 전에 처리
  • 서버는 콘텐츠에 변수 이름, 내장된 스크립트가 될 수 있는 특별한 패턴이 있는지 검사 → 변수 값/스크립트 출력 값으로 치환

5.7.5 접근 제어

  • 웹 서버는 각각의 리소스에 접근 제어를 할당할 수 있음
  • 리소스에 접근하기 위한 비밀번호를 물어볼 수도 있음


5.8 단계 5: 응답 만들기

  • 서버가 리소스를 식별하면, 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환
  • 응답 메시지는 응답 상태 코드, 응답 헤더, 응답 본문을 포함

5.8.1 응답 엔터티

트랜잭션이 응답 본문 생성 시, 응답 메시지가 포함하는 내용

  • 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
  • 응답 본문의 길이를 서술하는 Content-Length 헤더
  • 실제 응답 본문의 내용

5.8.2 MIME 타입 결정하기

MIME 타입과 리소스를 연결하는 여러 가지 방법

  • mime.types
    • MIME 타입을 나타내기 위해 파일 이름의 확장자를 사용할 수 있음.
    • 각 리소스의 MIME 타입을 계산하기 위해 확장자별 MIME 타입이 담겨있는 파일 탐색
  • 매직 타이핑
    • 각 파일의 MIME 타입을 알아내기 위해 파일의 내용을 검사해 잘 알려진 패턴에 대한 테이블(매직 파일)에 해당하는 패턴이 있는지 찾음
  • 유형 명시
    • 특정 파일이나 디렉터리 안 파일들이 파일 확장자나 내용에 상관 없이 어떤 MIME 타입을 갖도록 웹 서버 설정 가능
  • 유형 협상
    • 한 리소스가 여러 종류의 문서 형식에 속하도록 설정 가능
    • 특정 파일이 특정 MIME 타입을 갖게끔 설정 가능

5.8.3 리다이렉션

  • 웹 서버는 요청을 수행하기 위해 브라우저가 다른 곳으로 가도록 리다이렉트 할 수 있음

리다이렉트가 유용한 경우

  • 영구히 리소스가 옮겨진 경우
    • 웹 서버는 클라이언트에게 리소스 이름이 바뀌었으므로, 클라이언트는 북마크를 갱신하거나 할 수 있다고 말해줄 수 있음
  • 임시로 리소스가 옮겨진 경우
    • 서버는 클라이언트가 갱신하지 않기를 바람
    • 303 See Other와 307 Temporary Redirect 상태 코드 사용
  • URL 증강
    • 클라이언트는 리다이렉트를 따라가서 상태정보가 추가된 완전한 URL을 포함한 요청을 다시 보냄
  • 부하 균형
    • 303 See Other와 307 Temporary Redirect 상태 코드 사용
  • 친밀한 다른 서버가 있을 때
    • 303 See Other와 307 Temporary Redirect 상태 코드 사용
  • 디렉터리 이름 정규화
    • 상대 경로가 정상적으로 동작할 수 있는 클라이언트를 정규화하여 URI로 리다이렉트


5.9 단계 6: 응답 보내기

  • 서버는 커넥션 상태를 추적해야 하며, 지속적인 커넥션은 특별히 주의해서 다룰 필요


5.10 단계 7: 로깅

  • 마지막으로, 트랜잭션이 완료되었을 시, 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그 파일에 기록

profile
노력하는 초보 개발자

0개의 댓글