Study/HTTP

10. WebServer

ABCD 2024. 4. 16.

Web Server

  • HTTP와 연결하고 요청과 응답을 처리한다.
  • 웹서버란 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비(컴퓨터같은) 양쪽을 가르킨다.

Web Server의 종류

다목적 소프트웨어 웹 서버

  • 네트워크에 연결된 표준 컴퓨터 시스템에서 동작한다.
  • 오픈 소스 소프트웨어, 상용 소프트웨어를 사용 할 수도 있다.
  • ex) Aphache, MicroSoft, W3C의 직소 등

임베디드 웹 서버

  • 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹 서버

Web Server가 하는 일

1. 커넥션을 맺는다.

  • 클라이언트의 접속을 받아들이거나 끊는다.
  • 웹 서버는 커넥션이 발생하는 순간 IP를 추출하고 상대방의 신원을 파악한다.
  • 커넥션이 발생하면 웹 서버는 새 커넥션을 커넥션 리스트에 추가한다.
  • 몇몇 웹 서버들은 해당 IP가 인가되지 않았거나 악의적이라고 판단시 커넥션을 닫는다.
  • 대부분 웹서버는 “역방향 DNS(reverse DNS)”를 사용해서 클라이언트 IP주소를 호스트명으로 변환한다.
    • DNS (Domain Name System)
    • → 사람이 읽을 수 있는 도메인 주소(www.naver.com)을 IP주소로 변환해주는 시스템
  • 몇몇의 웹서버는 IETF ident protocol을 지원한다.

IETF ident protocol

  • 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다.
  • 웹 서버 로깅에서 유용하다.
  • 때문에, 일반 로그 포맷의 두번째 필드는 각 HTTP요청의 ident 사용자 이름을 담고 있다.
  • 클라이언트가 ident protocol을 지원한다면 클라이언트는 ident 결과를 위해 TCP 113번포트를 listen한다.
  • 서버는 identd 서버 포트(113)을 향해 열고 서버는 사용자의 정보를 얻는 요청을 보낸다.
  • 클라이언트는 ident 응답을 반환한다.
  • ident는 조직 냅에서는 잘 사용 할 수 있지만, 공공 인터넷에서는 잘 작동하지 않는다.
    • 많은 클라이언트 PC는 ident 신원 확인 프로토콜 데몬 소프트웨어를 실행하지 않는다.
    • ident protocol은 HTTP 트랜잭션을 유의미하게 지연시킨다.
    • 방화벽이 ident트래픽이 들어오는 것을 막는 경우가 많다.
    • ident protocol은 안전하지 않고 조작하기 쉽다.
    • ident protocol은 가상 IP 주소를 잘 지원하지 않는다.
    • 클라이언트 사용자 이름의 노출로 인한 프라이버시 침해의 우려가 있다.
  • Aphache Web Server의 경우 IdentityCheck 지시어를 통해 ident 룩업을 사용하게 할 수 있다.
  • 가용한 ident정보가 없다면, Aphache는 ident로그 필드를 하이픈(-)으로 채울 것이다.

2. 요청을 받는다.

  • HTTP의 요청 메세지를 네트워크로 읽어들인다.
  • 요청 메시지를 파싱한다.
  • 요청줄은 캐리지 리턴 줄바꿈(CRLF) 문자열로 끝난다.
    • CRLF→ LF : 라인 피드 (\n)
    • → CR : 캐리지 리턴 (\r)
  • 메시지 헤더들을 읽는다. 각 메시지 헤더는 CRLF로 끝난다.

스크린샷 2023-06-25 오후 7 44 39

단일 Thread Web Server

  • 한 번에 하나씩 요청을 처리한다.
  • 트랜잭션이 완료되어야 다음 트랜잭션을 진행하는 형태
  • 로드가 적은 서버나 type-o-serve와 같은 진단도구에서만 적당하다.

멀티 Process와 멀티 Thread Web Server

  • 여러 요청을 동시에 처리하기 위해 여러개의 Process or 고효율의 Thread를 할당한다.
    • 많은 고성능 서버는 멀티 Process인 동시에 멀티 Thread이다.
  • 멀티 Process/Thread는 커넥션마다 만들수도 미리 만들수도 있다.
    • Worker Pool(Thread Pool)에 이것을 담는다.

다중 I/O Server

  • 대량의 커넥션을 지원하기 위해 채택
  • 모든 커넥션은 동시에 그 활동을 감시당한다.
  • 하나의 커넥션이 완료되면 다음번 상태 변경을 위해 목록으로 이동하고 다음 커넥션의 작업을 수행한다.
  • 유휴상태가 발생하지 않아 리소스낭비를 줄여준다.

다중 멀티 Thread WebServer

  • 멀티 Threading과 다중화(multiplexing)를 결합한다.
  • 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 조금씩 작업을 수행한다.

3. 요청을 처리한다.

  • 요청 메시지를 해석하고 행동을 취한다.
  • 서버는 요청을 받으면 메서드, 리소스, 헤더, 본문(없는 경우도 있음)을 얻어 처리한다.
  • POST를 비롯한 몇몇 메서드는 요청시 엔터티 본문이 있을 것을 요구한다.
  • OPTIONS를 비롯한 다수의 메서드는 요청에 본문이 있을 것을 허용하되 요구하지는 안흔다.
  • GET처럼 요청에 본문을 금지하는 메서드도 있다.

4. 리소스에 매핑/접근한다.

  • 메시지에서 지정한 리소스에 접근한다.
  • Web Server는 Resource Server이기 때문에 정적인 컨텐츠를 제공한다.
  • Server 위에서 동작하는 Resource 생성 애플리케이션을 통해 만들어진 동적 콘텐츠를 제공하기도 한다.

DocRoot

  • 웹 서버는 다양한 리소스 매핑을 지원한다.
  • 가장 단순한 맵핑으로는 URI를 파일시스템에 접근하는 방식이다.
    • URL에 서버 문서루트를 작성하고 파일을 명시해 파일을 반환한다.
    • ex) 내가 만든 RedCat(WAS)의 ServerRoot
  • 파일 시스템의 DocRoot 이외의 부분이 노출되는 일이 생기지 않도록 주의해야 한다.
  1. 가상 호스팅된 DocRoot
    • URI나 Host헤더에서 얻은 IP주소나 호스트명을 이요해 올바른 문서 루트를 식별한다.
    • 하나에 서버에 두개의 사이트가 완전히 분리된 콘텐츠를 갖고 호스팅 되도록 할 수 있다.스크린샷 2023-06-25 오후 7 45 03
- ex) Apache Web Server VirtualHost Setting

    ```xml
    <VirtualHost www.joes-hardware.com>
      ServerName www.joes-hardware.com
      DocumentRoot /docs/joe
      TransferLog /logs/joe.access_log
      ErrorLog /logs/joe.error_log
    </VirtualHost>
    <VirtualHost www.marys-antiques.com>
      ServerName www.marys-antiques.com
      DocumentRoot /docs/mary
      TransferLog /logs/mary.access_log
      ErrorLog /logs/maery.error_log
    </VirtualHost>
    ```
  1. 사용자 홈 디렉토리 DocRoots

스크린샷 2023-06-25 오후 7 45 26

- 보통 **“빗금( / )””물결표( ~ )””사용자이름”**으로 시작하는 URI는 그 사용자의 개인 문서루트를 가르킴
- 개인 DocRoot는 주로 사용자 홈 디렉터리 안의 public_html로 불리는 디렉터리지만, 설정에 따라 다름

디렉토리 목록

  • Web Server는 경로가 파일이 아닌 디렉터리를 가리크는 디렉터리 URL에 대한 요청을 받을 수 있다.
  • 디렉터리 URL요청시 몇가지 다른 행동을 취하도록 설정 할 수 있다.
    • 에러를 반환
    • 디렉터리 대신 특별한 “색인 파일”을 반환
    • 디렉터리를 탐색해 그 내용을 담은 HTML파일을 반환
  • 대부분의 Web Server는 해당 디렉토리에서 index.html or index.htm파일을 찾고, 디렉토리에 해당 파일이 있으면 해당 파일을 반환 한다.
  • Apache Web Server는 DirectoryIndex로 색인파일로 사용될 모든 파일의 이름을 우선순위로 나열한다.
    • ex) DirectoryIndex index.html index.htm home.html home.htm index.cgi
    • Options -Indexes ← 디렉터리 색인 파일 자동 생성 Off 옵션

동적 컨텐츠 리소스 매핑

  • Hanlder를 이용한 url Mapping??
  • ex) 내가 만든 HttpPieHandlerFactory.java, HttpPieHandler.java??

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

  • 어떤 리소스가 서버사이드 인클루드를 포함도록 설정되어 있다면 서버는 클라이언트에 보내기 전에 처리한다.
  • 일반적으로 많이 사용하는 지시자
    • #include
    • →다른 파일을 이 파일 내부로 불러들이기
    • #exec
    • → 외부 명령 실행
    • #set
    • → 변수 선언
    • #echo
    • → 변수 프린트
    • #if, #else, #elif, #endif
    • →조건문
**index.html**

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <!--#include virtual="_header.html" -->
    <title>html5_boilerplate</title>
  </head>

  <body>
    <div>
      <header>
        <h1>html5_boilerplate</h1>
      </header>
      <nav>
        <p>
          <a href="/">Home</a>
        </p>
        <p>
          <a href="/contact">Contact</a>
        </p>
      </nav>

      <div>

      </div>

      <footer>
        <!--#include virtual="_footer.html" -->
      </footer>
    </div>
  </body>
</html>
```

**_header.html**

```html
<meta charset="utf-8" />

    <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
    Remove this if you use the .htaccess -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

    <meta name="description" content="" />
    <meta name="author" content="elco" />

    <meta name="viewport" content="width=device-width; initial-scale=1.0" />

    <!-- Replace favicon.ico & apple-touch-icon.png in the root of your domain and delete these references -->
    <link rel="shortcut icon" href="/favicon.ico" />
    <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
```

**_footer.html**

```html
<p>
&copy; Copyright by elco
</p>
```

### 접근제어

- WebServer는 클라이언트 IP에 근거하여 각각의 리소스에 접근 제어를 할당 할 수 있다.

5. 응답을 만든다.

  • 올바른 헤더를 포함한 HTTP 응답 메시지를 생성한다.
  • 응답 메시지는 응답 상태 코드, 응답 헤더, 응답 본문(존재하면) 포함한다.

응답 엔터티

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

MIME 타입 결정하기

  • mime.types
    • 웹 서버는 MIME 타입을 나타내기 위해 파일 이름의 확장자를 사용 할 수 있다.
    • MiME 타입을 계싼하기 위해 확장자별 MIME 타입이 담겨 있는 파일을 탐색한다.
    • 이러한 확장자 기반 타입 연계가 가장 흔한 방법
  • 매직 타이핑(Magic typing)스크린샷 2023-06-25 오후 7 45 49
    • MIME타입을 알아내기 위해 파일의 내용을 검사해서 알려진 패턴에 대한 테이블(매직 파일)에 해당하는 패턴이 있는지 찾아 볼 수 있다.
    • 느리긴 하지만, 파일이 표준 확장자 없이 이름 지어진 경우에는 특히 편리하다.
  • 유형 명시(Explicit typing)
    • 파일 확장자나 내용에 관계없이 어떤 MIME타입을 갖도록 웹 서버를 설정하는 방법
  • 유형 협상(Type negotiation)
    • 한 리소스가 여러 종류의 문서 형식에 속하도록 설정하는 방버
    • 사용자와의 협상 과정을 통해 사용하기 가장 좋은 형식을 판별할 것인지의 여부도 설정 가능
    • ex) 파일을 열었을 때 어떤 파일로 실행할건지에 대한 여부??

리다이렉션

  • 요청을 수행하기 위해 다른 곳으로 이동하도록 하는 것
  • 3XX 상태코드로 지칭된다.
  • 301 Moved Permanently
    • 영구히 리로스가 옮겨진 경우
    • 리소스가 새 URL이 부여되어 새로운 위치로 옮겨졌거나 이름이 바뀌었을 경우가 있다.
    • 이 때, 클라이언트에게 북마크를 갱신하거나 할 수 있다고 말해주는 등 이러한 경우에 사용
  • 303 See Other & 307 Temporary Redirect
    • 임시로 리소스가 옮겨진 경우
    • 해당 경우, 서버는 클라이언트를 새 위치로 리다이렉트하길 원하지만, 변경이 임시이기 때문에 서버는 클라이언트가 나중에 원래 URL로 찾아오고 북마크도 갱신하지 않기를 바라는데 이 경우에 사용
    • URL 증강
    • 문맹 정보를 포함시키기 위해 새 작성된 URL을 사용
    • 요청 도착시 서버는 상태 정보를 내포한 새 URL을 생성하고 리다이렉트한다.
    • 그 후 상태정보가 추가된 완전한 URL을 포함한 요청을 다시 보낸다.
    • 트랜잭션 간 상태를 유지하는 유용한 방법
    • 부하 균형
    • 과부하된 서버가 요청을 받을 시, 좀 덜 부하가 걸린 서버로 리다이렉트 한다.
    • 친밀한 다른 서버가 있을 대
    • Web Server는 사용자에 대한 정보를 가질 수 있는데, 서버는 그 클라이언트에 대한 정보를 갖고 있는 다른 서버로 이에 대한 정보를 갖고 리다이렉트 할 수 있다.
  • 디렉터리 이름 정규화
    • 디렉터리에 대한 URI를 요청시 빗금( / )을 빠뜨렸으면 상대결로가 정상작동하도록 빗급을 추가한다.

6. 응답을 보낸다.

  • 응답을 클라이언트에게 돌려준다.
  • 서버는 커넥션 상태를 추적해야 한다.
  • 지속적인 커넥션은 특별히 주의해야 한다.
  • 비지속적인 커넥션이라면, 서버는 메세지 전송 후 자신쪽 커넥션을 닫을 것이다.

7. 트랜잭션을 로그로 남긴다.

  • 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
728x90
반응형

'Study > HTTP' 카테고리의 다른 글

12. Proxy  (0) 2024.05.21
11. Connection close ← mystry  (0) 2024.05.21
09. HTTP Connection Management  (0) 2024.04.16
08. TCP&IP  (0) 2024.04.16
07. StartRow&StatusCode  (0) 2024.04.16

댓글

💲 추천 글