5장 HTTP와 연계하는 웹 서버

그림으로 배우는 HTTP & Network
(우에노 센 저 / 이병억 역 )
을 읽고 정리한 내용입니다.


1대로 멀티 도메인을 가능하게 하는 가상 호스트

HTTP/1.1에서는 하나의 HTTP 서버에 여러 개의 웹 사이트를 실행할 수 있다.
ex) 웹 호스팅을 제공하고 있는 사업자는 1대의 서버에 여러 고객의 웹 사이트를 넣을 수 있다.
고객마다 다른 도메인을 가지고, 다른 웹 사이트를 실행할 수 있다.
이를 위해 가상 호스트(Virtual Host)라는 기능을 사용하고 있다.

인터넷에서 도메인명은 DNS에 의해서 IP 주소로 변환되고 나서 액세스하게 된다.
리퀘스트가 서버에 도착한 시점에는 IP 주소를 기준으로 액세스하게 된다.
이 때, 1대의 서버 안에 여러 개의 도메인이 있을 경우 어느쪽에 대한 액세스인지 알 수 없다.

-> 같은 서버 상에 같은 IP 주소의 웹 서버에서 www.tricorder.jp와 www.hacker.jp이 실행되고 있을 때
DNS로 이름을 해결하면, 그 어느 쪽도 같은 수신인이 되어 버린다.

같은 IP 주소에서 다른 호스트명과 도메인 명을 가진 여러 개의 웹 사이트가 실행되고 있는
가상 호스트의 시스템이 있다.

HTTP 리퀘스트를 보내는 경우에는

  1. 호스트명과 도메인 명을 완전하게 포함한 URI를 지정하거나
  2. Host 헤더 필드에서 지정해야 한다.

통신을 중계하는 프로그램: 프록시, 게이트웨이, 터널

HTTP는 클라이언트와 서버 이외에 프록시(Proxy), 게이트웨이(Gateway), 터널(Tunnel)과 같은 통신을 중계하는 프로그램과
서버를 연계하는 것도 가능하다.

이러한 프로그램과 서비스는 그 다음에 있는 다른 서버에 리퀘스트를 중계하고,
그 서버로부터 받은 리스폰스를 클라이언트에 클라이언트에 반환하는 역할을 한다.

  • 프록시: 서버와 클라이언트의 양쪽 역할을 하는 중계 프로그램
    클라이언트로부터의 리퀘스트를 서버에 전송하고, 서버로부터의 리스폰스를 클라이언트에 전송한다.

  • 게이트웨이: 다른 서버를 중계하는 서버
    클라이언트로부터 수신한 리퀘스트를 리소스를 보유한 서버인 것처럼 수신한다.
    경우에 따라서, 클라이언트는 상대가 게이트웨이라는 것을 알지 못하는 경우도 있다.

  • 터널: 서로 떨어진 두 대의 클라이언트와 서버 사이를 중계하며 접속을 주선하는 중계 프로그램

5.2.1. 프록시

프록시 서버의 기본 동작은 클라이언트로부터 받은 리퀘스트를 다른 서버에 전송하는 것이다.
클라이언트로부터 받은 리퀘스트 URI를 변경하지 않고 그 다음의 리소스를 가지고 있는 서버에 보낸다.

리소스 본체를 가진 서버를 오리진 서버(Origin Server)라고 부른다.
오리진 서버로부터 되돌아온 리스폰스는 프록시 서버를 경유해서 클라이언트에 돌아온다.

프록시 서버를 경유해서 리퀘스트와 리스폰스를 릴레이할 때마다 “Via” 헤더 필드에 정보를 추가한다.

HTTP 통신을 할 때, 프록시 서버를 여러 대 경유하는 것도 가능하다.
체인과 같이 여러 대 경유해서 리퀘스트랑 리스폰스를 중계해 간다.
중계할 때 Via 헤더 필드에 경유한 호스트 정보를 추가해야 한다.

조직 내에 프록시 서버를 설치하여 특정 URI 등으로 액세스를 제한하는 것도 가능하다.

프록시 서버를 이용하는 이유

  • 캐시를 사용해서 네트워크 대역 등을 효율적으로 사용하는 것
  • 조직 내에 특정 웹 사이트에 대한 액세스 제한, 액세스 로그를 획득하는 정책을 철저하게 지키려는 목적

프록시 서버 사용 방법

분류 기준

  1. 캐시를 하는지의 여부
  2. 메시지를 변경하는지의 여부

캐싱 프록시(Cashing Proxy)
프록시로 리스폰스를 중계할 때, 프록시 서버 상에 리소스 캐시를 보존해 두는 타입의 프록시이다.
프록시에 다시 같은 리소스에 리퀘스트가 온 경우, 오리진 서버로부터 리소스를 획득하는 것이 아니라
캐시를 리스폰스로서 되돌려 준다.

투명 프록시(Transparent Proxy)
프록시로 리퀘스트와 리스폰스를 중계를 할 때, 메시지 변경을 하지 않는 타입의 프록시
cf) 비투과 프록시: 메시지에 변경을 가하는 타입의 프록시

5.2.2. 게이트웨이

게이트웨이를 사용함으로써 HTTP 리퀘스트에 의해 다른 프로토콜을 실행할 수 있다.
게이트웨이의 동작은 프록시와 매우 유사하다.
게이트웨이의 경우, 그 다음에 있는 서버가 HTTP 서버 이외의 서비스를 제공하는 서버가 된다.
클라이언트와 게이트웨이 사이를 암호화하는 등으로 안전(secure)하게 접속함으로써 통신의 안전성을 높이는 역할 등을 한다.

ex) 게이트웨이는 데이터베이스에 접속해 SQL 쿼리를 사용해서 데이터를 얻는 곳에 이용할 수 있다.
그 밖에도 쇼핑 사이트 등에서 신용 카드 결제 시스템 등과 연계할 때 사용되기도 한다.

5.2.3. 터널

터널은 요구에 따라서 다른 서버와의 통신 경로를 확립한다.
이 때, 클라이언트는 SSL 같은 암호화 통신을 통해서 서버와 안전하게 통신을 하기 위해서 사용한다.

터널 자체는 HTTP 리퀘스트를 해석하려고 하지 않는다.
그리고 터널은 통신하고 있는 양쪽 끝의 접속이 끊어질 때 종료한다.

터널을 사용하여 서버와 안전하게 통신할 수 있다.
터널 자체는 투명한 존재이기 때문에 클라이언트는 너무 의식할 필요가 없다.


리소스를 보관하는 캐시

캐시(Cache)프록시 서버와 클라이언트의 로컬 디스크에 보관된 리소스의 사본을 가리킨다.
캐시를 사용하면, 리소스를 가진 서버로의 액세스를 줄이는 것이 가능하다.
-> 통신량과 통신 시간을 절약할 수 있다.

캐시 서버는 프록시 서버의 하나로 캐싱 프록시로 분류된다.
결국, 프록시가 서버로부터의 리스폰스를 중계할 때, 프록시 서버 상에 리소스의 사본을 보존한다.

캐시 서버의 장점

캐시를 이용함으로써 같은 데이터를 몇 번이고 오리진 서버에 전송할 필요가 없다.
-> 클라이언트는 네트워크에서 가까운 서버로부터 리소스를 얻을 수 있게 되어
서버는 같은 리퀘스트를 매번 처리하지 않아도 된다.

5.3.1. 캐시는 유효기간이 있다

캐시 서버에 캐시가 있는 경우라도 같은 리소스의 리퀘스트에 대해서 항상 캐시를 돌려준다고 할 수 없다.

캐시되어 있는 리소스의 유효성
언제까지나 같은 캐시를 계속해서 사용하고 있다 보면,
오리진 서버에 있는 원래 리소스가 갱신되는 경우가 있다.
이때, 캐시 서버는 갱신되기 전의 낡은 리소스를 그대로 보내게 된다.

그래서 캐시를 가지고 있더라도 클라이언트의 요구나 캐시의 유효 기간 등에 의해서
오리진 서버에 리소스의 유효성을 확인하거나 새로운 리소스를 다시 획득하러 가게 되는 경우가 있다.

5.3.2. 클라이언트 측에도 캐시가 있다

캐시 서버만 캐시를 가지고 있는 게 아니라, 클라이언트가 사용하고 있는 브라우저에도 캐시를 가질 수 있다.
인터넷 익스플로러에서 클라이언트가 보존하는 캐시를 인터넷 임시 파일이라고 부른다.

브라우저가 유효한 캐시를 가지고 있는 경우

같은 리소스의 액세스는 서버에 액세스하지 않고, 로컬 디스크로부터 불러온다.

캐시 서버와 마찬가지로 리소스가 오래된 것으로 판단된 경우

오리진 서버에 리소스의 유효성을 확인하러 가거나 새로운 리소스를 획득하러 가는 일이 있다.