[HTTP 완벽 가이드] 5장 웹 서버

Milk717·2022년 10월 2일
0

HTTP

목록 보기
3/7

2022년 7월 ~ 2022년 8월 동안 http 완벽 가이드 스터디를 진행하면서 노션에 정리해놨던 내용입니다.

  • 웹서버란?

    • 웹 서버는 HTTP 및 TCP 처리를 구현한 것.
    • 웹 서버가 하는 일
      • HTTP 프로토콜 구현
      • 웹 리소스 관리
      • 웹 서버 관리 기능 제공
      • TCP 커넥션 관리에 대한 책임을 운영체제와 나눠 갖음.
    • ex) 아파치, NginX, IIS 등등
  • 임베디드 웹서버

    • 가전제품에 내장될 목적으로 만들어진 작은 웹 서버
    • (에어컨 휴대폰으로 제어하고 그런건가?)
  • 웹 서버가 하는 일

    1. 클라이언트 커넥션 수락

      1. 클라이언트가 웹 서버에 TCP 커넥션 요청
      2. 웹 서버가 TCP커넥션에서 IP주소 추출해서 클라이언트 확인
      3. (클라이언트 IP 주소나 호스트 명이 인가되지 않거나 악의적의라고 판단되면 즉시 커넥션을 닫는다)
      4. 역방향 DNS를 사용해서 클라이언트의 IP 주소를 클라이언트 호스트명으로 변환한다.
      5. 호스트 명 분석은 시간이 많이 걸려서 대용량 웹 서버는 호스트명 분석을 꺼두거나 특정 콘텐츠에 대해서만 켜둠.
      6. ident 프로토콜을 지원하는 웹서버는 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해줌.
    2. 요청 메시지 수신

      1. 커넥션에 데이터가 도착하면 웹 서버가 커넥션에서 데이터를 읽어들이고 파싱하여 요청 메시지 구성

      2. 요청줄을 파싱할 때 요청 메서드, URI, 버전번호를 찾는다. 요청줄은 캐리지 리턴(CRLF) 문자열로 끝난다.

      3. 요청 메시지를 파싱하여 key: value 형태가 됨.

      4. 헤더는 속도가 빠른 룩업 테이블에 저장되어 각 필드에 신속하게 접근 가능

      5. 단일 스레드 웹 서버

        1. 한번에 하나씩 요청 처리
        2. 구현은 간단하지만 성능문제로 진단도구 정도에서만 사용됨
      6. 멀티 프로세스와 멀티 스레드 웹 서버

        1. 웹 서버의 입출력 아키텍쳐

    3. 요청 처리

      1. 웹 서버가 요청을 받으면 서버는 요청으로부터 메서드, 리소스, 헤더, 본문(GET같은 경우는 없음)을 얻어내어 처리한다.
    4. 리소스의 매핑과 접근

      1. 웹 서버 == 리소스 서버

      2. HTML 페이지나 PNG 이미지 같은 미리 만들어진 콘텐츠 제공 (정적 웹)

      3. 서버 위에서 동작하는 리소스 생성 애플리케이션으로 생성된 콘텐츠 제공 (동적 웹)

      4. Docroot (문서 루트)

        1. 웹 서버는 요청 메시지에서 URI를 가져와서 문서 루트 뒤에 붙인다.
        2. DocumentRoot (요청 URI)
      5. 가상 호스팅된 Docroot

        1. 각 사이트에 그들만의 분리된 문서 루트를 준다.
        2. 아파치 웹 서버에서는 각 가상 웹사이트의 VirtualHost 블록이 가상 서버에 대한 DocumentRoot 지시자를 포함하도록 설정해야 한다.
      6. 사용자 홈 디렉터리 docroots

        1. 보통 /과 물결표~ 다음에 사용자 이름이 오는 것으로 시작하는 URI는 그 사용자의 개인 문서 루트를 가리킨다.
      7. 웹 서버는 경로가 파일이 아닌 디렉터리를 가리키는, 디렉터리 URL에 대한 요청을 받을 수 있다.

      8. 클라이언트가 디렉터리 URL을 요청했을 때 웹서버가 취할 수 있는 행동

        1. 에러 반환
        2. 디렉터리 대신 특별한 ‘색인 파일' 반환
        3. 디렉터리를 탐색해서 그 내용을 담은 HTML 페이지를 반환
      9. 대부분의 웹 서버는 요청한 URL에 대응되는 디렉터리 안에서 index.html 파일을 찾는다.

      10. 아파치 웹 서버에서, DirectoryIndex 설정 지시자를 사용해서 기본 디렉터리 파일로 사용될 파일 이름의 집합을 설정할 수 있다.

        DirectoryIndex index.html home.html 
      11. 웹서버는 요청에 맞게 콘텐츠를 생성해서 url을 매핑할 수 있다.

      12. 서버사이드 인클루드

        1. 클라이언트에 보내기 전에 리소스를 처리하는 방법
    5. 응답 만들기

      1. 서버가 리소스를 식별한 후 서버는 요청 메서드로 서술되는 동작을 수행한 후 응답 메시지를 반환한다.
      2. 응답 엔티티는 주로 MINE 타입을 서술하는 Content-Type 헤더, Content-Length 헤더, 바디 등으로 구성된다.
      3. 웹 서버는 응답 본문의 MINE 타입을 결정해야 하는 책임이 있다.
      4. MINE 타입을 결정하는 방법
        1. mine.types ⇒ 확장자별 MINE 타입이 담겨있는 파일을 탐색
        2. 매직 타이핑 ⇒ 파일의 내용을 검사해서 알려진 패턴에 대한 테이블에 해당하는 패턴이 있는지 찾아본다. 느린 방법이지만 파일이 표준 확장자 없이 이름으로 지어진 경우에 편리
        3. 유형 명시 ⇒ 특정 파일이나 디렉터리 안의 파일들이 파일 확장자나 내용에 상관ㅇ벗이 어떤 MINE 타입을 갖도록 웹 서버를 설정할 수 있다.
        4. 유형 협상 ⇒ 한 리소스가 여러 종류의 문서 형식에 속하도록 설정할 수 있다.
      5. 웹 서버는 종종 리다이렉션 응답을 반환한다. 리다이렉션 응답은 상태코드 300번대
        1. 영구히 리소스가 옮겨진 경우 ⇒ 301
        2. 임시로 리소스가 옮겨진 경우 ⇒ 303, 307
        3. URL 증강 ⇒ ????
        4. 부하 균형 ⇒ 서버 과부하로 인해 클라이언트를 과부하가 덜된 서버로 이동시킴
    6. 응답 보내기

      1. 서버는 여러 클라이언트에 대해 여러 응답을 가질 수 있다.
      2. 지속적 커넥션인 경우에 커넥션 상태 추적이 중요하다. Content-Length 헤더 바르게 계산해야함.
    7. 로깅

      1. 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그파일에 기록한다.

0개의 댓글