티스토리 뷰

트래픽이 높은 사이트는 아니더라도 웹 서비스를 운영하고 싶어하는 사람들은 웹 공간을 가지고 싶어 합니다.

이런 사람들에게 웹 서버 하나는 사치일 것입니다.


따라서 웹 호스팅 업자들이 서버 한 대를 여러 고객이 공유하도록 해서 저렴한 웹 호스팅 서비스를 제공하는데,  이를 공유 호스팅/가상 호스팅이라고 합니다.


그리고 가상 호스팅 사용자들은 웹 서버를 구축해야할 정도로 트래픽이 증가하기 전까지는 비용절약을 위해 가상 호스팅을 사용할 것입니다.


가상 호스팅에는 4가지의 종류가 있습니다.


  • URL 경로를 통한 가상 호스팅
    • 서버가 어떤 사이트를 요청하는지를 파악할 수 있게 URL에 특별한 경로 컴포넌트를 추가
  • 포트번호를 통한 가상 호스팅
    • 각 사이트별로 다른 포트를 할당하여 분리된 웹 서버의 인스턴스가 요청을 처리
  • IP 주소를 통한 가상 호스팅
    • 가상 사이트들에 별도의 IP주소를 할당하고, 모든 IP 주소를 장비 하나에 연결; 웹 서버는 IP주소로 사이트 이름을 식별
  • Host 헤더를 통한 가상 호스팅
    •  HTTP Request header의 host 필드를 통해 가상 사이트 식별

URL 경로를 통한 가상 호스팅

같은 웹 서버에 존재하는 각 가상 사이트에 대해 다른 URL 경로를 할당해서 구분이 가능합니다.

만약 네이버와 다음이 정말 사람들이 한두명 들어오는 트래픽이 거의 없는 소형의 웹 사이트라고 생각한다면, 

  • www.naver.com/naver/index.html
  • www.daum.net/daum/index.html
이런식으로 구분 할 수 있을 것 입니다.

위의 두 url이 DNS를 거친 후 같은 IP의 웹서버로 요청이 전송된다면
 
  • GET /naver/index.html
  • GET /daum/index.html
위와 같은 경로에 대한 정보를 통해서 /naver, /daum과 같은 경로를 통해 가상 호스트를 구분합니다.
하지만 이런 경로들은 이미 호스트명에 기술되어 있고 좋지 않은 선택입니다.
따라서 일반적으로는 거의 사용하지 않는다고 합니다.


포트번호를 통한 가상 호스팅

경로 명을 변경하는 대신에 네이버와 다음은 웹 서버상의 다른 포트번호를 사용할 수 있습니다.
웹 서버의 표준 포트는 80이지만, 네이버는 81, 다음은 82를 사용하도록 하도록 하는 방법인데, 
이는 사용자가 URL에 비표준 포트를 쓰지않고 웹 서버의 리소스를 찾기를 원하기에 좋지 않습니다.


IP주소를 통한 가상 호스팅

위의 두 방법보다 좋은 것은 가상 IP를 할당하는 것입니다. 
이 방법은 가상 호스트에 유일한 IP를 한 개 이상 부여하는 것입니다. 그리고 모든 가상 호스트의 IP주소는 같은 물리 서버에 연결되도록 합니다.



위를 보시면 thegeekstuff.com으로 요청을 보내면 192.168.101.1의 IP 주소를 얻고

   top5freeware.com으로 요청을 보내면 192.168.101.2의 IP 주소를 얻습니다.


각자 IP주소를 얻으면 IP주소에 있는 웹 서버와 TCP 커넥션을 얻고, 


각자 Request를 보내게 됩니다. (GET /index.html HTTP/1.0 과 같은)


그럼 웹 서버는 IP에 대한 가상 호스트 리소스의 위치를 구분하여 response를 보냅니다. 



이 IP 주소를 통한 가상 호스팅은 잘 동작하지만, 대규모의 호스팅 업체에게는 문제점들이 있습니다.

  • 컴퓨터가 연결할 수 있는 장비의 IP의 개수에는 제한이 잇습니다.
    수백, 수천의 가상 사이틀을 포함하는 공용 서버를 제공하는데 문제가 있습니다ㅣ.
    • 예로, 리눅스 커널은 물리적인 서버당 255개의 IP를 가질 수 있었다고 합니다.
  • IP는 희소 상품이기에 가상 사이트를 많이 가지고 있는 호스팅 업자는 모든 사이트에 대한 IP를 전부 다 얻지 못할 수 있습니다.
  • 호스팅 업자가 용량을 늘리려고 서버를 복제하려 한다면, 부하 균형의 구조상, 각 복제된 서버에 IP주소를 부여해야하므로 IP주소는 복제 서버 개수만큼 더 필요하게 됩니다. (이부분은 좀 애매하게 이해가 되는데, 추가적인 공부후에 다시 업뎃하겠습니다.)
이처럼 많은 문제가 있지만, 아직 많이 쓰이는 방식이라고 합니다.


Host 헤더를 통한 가상 호스팅

위의 IP 주소의 문제를 해결하기 위해선 같은 IP를  쓰면서도 하나의 물리 서버에서  여러 가상 호스트를 구분할 수 있어야 합니다.
이를 위해 HTTP 1.1  프로토콜에서는 HTTP 요청을 보낼때 Host  확장 헤더를 전달해야만 합니다.


HTTP/1.1 Host 헤더

가상 서버는 매우 흔하기 때문에 대부분의 HTTP 클라이언트가 HTTP/1.1과 호환되지 않더라도 Host 헤더는 구현합니다ㅣ

사용법 

Host = "Host" ":" "호스트 [ ":" 포트 ]

사용법 예시(Telnet)

JUNKYUui-MacBook:~ junkyu$ Telnet www.naver.com 80
Trying 125.209.222.142...
Connected to www.naver.com.nheos.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.naver.com:80
\r\n
\r\n

...
...

Host를 사용할 때 규칙
  • Host 헤더에 포트가 쓰여있지 않다면 기본 포트를 사용
  • URL에 IP 주소가 있으면 Host 헤더는 같은 주소를 포함해야 함
  • URL에 호스트 명이 기술되어 있으면, Host 헤더는 같은 호스트 명을 포함해야 함
  • URL에 호스트 명이 기술되어 있으면, Host 헤더는 URL의 호스트 명이 가리키는 IP주소를 포함해서는 안 됨.
    (여러개의 가상 사이트를 하나의 IP로 묶은 서버에서 문제가 생길 수 있다고 합니다.)
  • 클라이언트가 특정 프락시 서버를 사용한다면, Host 헤더에 프락시 서버가 아닌 오리진 서버의 호스트 명과 포트를 기술해야 함.
  • 웹 클라이언트는 모든 요청 메시지에 Host 헤더를 기술해야 함
  • 웹 프락시는 요청을 전달하기 전에 요청 메시지에 Host 헤더를 추가해야 함 
  • HTTP/1.1 웹 서버는 Host 헤더 필드가 없는 HTTP/1.1 요청 메시지를 받으면 400 상태 코드로 응답해야 함


Host 헤더의 누락

몇몇의 고전의 브라우저들은 Host 헤더를 보내지 않는데, 만약 가상 호스팅을 사용하는 서버에 이런 Host 헤더가 빠진 요청이 들어오면, 
서버는 사용자에게 기본 페이지를 보내거나 에러 페이지를 반환할 수 있습니다.



HTTP 헤더 해석하기

가상 호스팅을 지원하지 않는 오리진 서버는 요청 호스트에 따라 리소스가 달라지지 않아 Host 헤더값을 무시할 것입니다.
하지만 가상 호스트를 사용하는 모든 웹서버는 HTTP/1.1을 통해 오는 리소스를 결정하기 위해서 다음과 같은 규칙을 사용해야 합니다.
  1. HTTP 요청 메시지에 전체 URL이 기술되어 있으면, Host 헤더에 있는 값은 무시하고 URL을 사용합니다.
  2. HTTP 요청 메시지에 있는 URL에 호스트 명이 기술되어 있지 않고 요청에 Host 헤더가 있으면, 호스트 명과 Host 헤더에서 가져옵니다.
  3. 1, 2단계에서 호스트를 결정할 수 없으면 클라이언트에 400 Bad Request응답을 반환합니다.



















댓글
댓글쓰기 폼
공지사항
Total
93,641
Today
5
Yesterday
8
«   2019/06   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
글 보관함