내가 DNS 링크를 이해하는 것처럼 웹 사이트가 저장된 서버의 IP 주소와 도메인 이름이 각 서버에 하나의 웹 사이트 만 보유 할 수 있습니까? 그렇지 않은 경우 서버의 IP 주소를 호출하면 동일한 서버에 많은 웹 사이트가있는 경우 원하는 웹 사이트를 어떻게 알 수 있습니까?
내가 DNS 링크를 이해하는 것처럼 웹 사이트가 저장된 서버의 IP 주소와 도메인 이름이 각 서버에 하나의 웹 사이트 만 보유 할 수 있습니까? 그렇지 않은 경우 서버의 IP 주소를 호출하면 동일한 서버에 많은 웹 사이트가있는 경우 원하는 웹 사이트를 어떻게 알 수 있습니까?
답변:
기본적으로 브라우저는 HTTP 요청에 도메인 이름을 포함하므로 웹 서버는 요청 된 도메인을 알고 이에 따라 응답 할 수 있습니다.
일반적인 HTTP 요청은 다음과 같습니다.
사용자는 형식으로 URL을 제공합니다 http://host:port/path
.
브라우저는 URL의 호스트 (도메인) 부분을 추출하여 필요한 경우 이름 확인 프로세스에서 IP 주소로 변환합니다 . 이 변환은 DNS를 통해 발생할 수 있지만 반드시 수행 할 필요는 없습니다 (예 : hosts
공통 OS 의 로컬 파일은 DNS를 무시 함).
브라우저는 해당 IP 주소에서 지정된 포트에 대한 TCP 연결을 열거 나 기본적으로 포트 80을 엽니 다.
브라우저가 HTTP 요청을 보냅니다. HTTP / 1.1의 경우 다음과 같습니다.
GET /path HTTP/1.1
Host: example.com
( Host
헤더는 표준이며 HTTP / 1.1에 필요합니다. HTTP / 1.0 사양에 지정되지 않았지만 일부 서버는이를 지원합니다.)
여기에서 웹 서버에는 응답이 무엇인지 결정하는 데 사용할 수있는 몇 가지 정보가 있습니다. 단일 웹 서버가 여러 IP 주소에 바인딩 될 수 있습니다.
Host
HTTP 요청에서 브라우저가 헤더에 지정한 요청 된 호스트 이름 입니다.알다시피 요즘 가장 일반적인 공유 호스팅 설정은 여러 웹 사이트를 단일 IP 주소 : 포트 조합에 배치하여 Host
웹 사이트를 구별 할 수 있습니다.
이것은 Apache-land에서 이름 기반 가상 호스트 로 알려져 있으며 Nginx는 서버 블록에서 서버 이름을 호출 하고 IIS는 Virtual Server를 선호합니다 .
HTTPS는 약간 다릅니다. 모든 것은 TCP 연결 설정과 동일하지만 그 후에 암호화 된 TLS 터널을 설정해야합니다. 목표는 요청에 대한 정보를 유출하지 않는 것입니다.
서버가 실제로이 도메인을 소유하고 있는지 확인하려면 서버는 신뢰할 수있는 타사가 서명 한 인증서를 보내야합니다. 그런 다음 브라우저는이 인증서를 요청한 도메인과 비교합니다.
문제가 있습니다. HTTP 요청을 수신하기 전에 어떤 호스트 (웹 사이트)의 인증서를 보내야하는지 서버는 어떻게 알 수 있습니까?
전통적으로 이는 HTTPS가 필요한 모든 웹 사이트에 대해 전용 IP 주소 (또는 포트)를 사용하여 해결되었습니다. IPv4 주소가 부족 해지면 문제가됩니다.
SNI (서버 이름 표시)를 입력하십시오 . 브라우저는 이제 TLS 협상 중에 호스트 이름을 전달하므로 서버는 올바른 인증서를 보낼 수있을만큼 일찍이 정보를 갖습니다. 서버 측에서 구성은 HTTP 가상 호스트 구성 방법과 매우 유사합니다.
단점은 이제 호스트 이름이 암호화 전에 일반 텍스트로 전달되며 본질적으로 정보가 유출된다는 것입니다. 어쨌든 호스트 이름이 일반적으로 DNS 쿼리에 노출된다는 점을 고려할 때 이는 일반적으로 허용 가능한 교환으로 간주됩니다.
요청한 특정 호스트를 모르는 경우 서버가 수행하는 작업은 서버 구현 및 구성에 따라 다릅니다. 일반적으로 호스트를 명시 적으로 지정하지 않은 모든 요청에 대한 응답을 제공하는 "기본", "catchall"또는 "대체"사이트가 지정되어 있습니다.
이 기본 사이트는 자체 독립 사이트 (종종 오류 메시지 표시)이거나 서버 관리자의 환경 설정에 따라 서버의 다른 사이트 일 수 있습니다.
나는 기술이 아닌 사람들을 위해이 설명이 있습니다.
Jack, Jill 및 Joe는 기숙사에 살고 있으며 핸드폰이 없습니다.
전화 번호부에는 모두 같은 번호로 나열되어 있습니다. (A 레코드)
전화를 걸면 누군가 전화를받습니다. "질에게 말하고 싶다"고 말하고 전화를 겁니다
전화 번호부의 A- 레코드 (전화 번호 / IP- 주소) 대신 "Dormitory X"라고 표시 될 수 있습니다. 그런 다음 Dormitory X의 번호를 더 찾아야합니다. 이것은 CNAME 레코드입니다.
Jill을 사용할 수없는 경우
302 Jill이 Peter를 방문하고 대신 전화하십시오.
400 이해할 수 없습니다.
451 구속 명령을 위반하고 있습니다.
500 전화 시스템이 고장났습니다.
내가 DNS 링크를 이해하는 것처럼 웹 사이트가 저장된 서버의 IP 주소와 도메인 이름이 각 서버에 하나의 웹 사이트 만 보유 할 수 있습니까?
먼저 여기에는 여러 가지 고유 한 개념이 있음을 이해해야합니다.
이러한 것 사이에는 일대일 관계가 없습니다. 하나의 서버는 여러 개의 IP 주소를 가질 수 있습니다. 여러 개의 호스트 이름이 하나의 IP 주소를 가리킬 수 있습니다. 하나의 호스트 이름은 여러 IP 주소를 가리킬 수 있습니다. 여러 웹 사이트가 동일한 호스트 이름으로 존재할 수 있습니다. 하나의 웹 사이트를 여러 호스트 이름으로 분산시킬 수 있습니다.
그렇지 않은 경우 서버의 IP 주소를 호출하면 동일한 서버에 많은 웹 사이트가있는 경우 원하는 웹 사이트를 어떻게 알 수 있습니까?
이전 (HTTP 1.0 이전)에는 서버가 다르게 처리하려는 각 호스트 이름에 고유 한 IP 주소가 있어야했습니다. 이것은 다소 낭비 적이었습니다.
HTTP 1.1은 Host
"HTTP 요청에서 헤더를 필수 필드로 추가했습니다 (IIRC는 일부 벤더가이를 확장으로 지원했습니다). 이것은 서버에게 요청 된 호스트 이름을 알려주므로 동일한 호스트에서 다른 호스트 이름에 대해 서로 다른 컨텐츠를 제공 할 수 있습니다. IP 주소 클라이언트에서 HTTP 1.1을 지원하는 기능은 이제 어디에나 있습니다.
불행히도 SSL (나중에 TLS)은 주름을 추가했습니다. SSL / TLS 세션을 설정하려면 서버가 요청한 호스트 이름을 포함하는 클라이언트에 인증서를 제공해야하지만 SSL / TLS 세션이 설정 될 때까지 HTTP 요청이 도착하지 않습니다.
SubjectAltName
필드를 사용하거나 필드에서 와일드 카드를 사용 하여 하나의 인증서로 여러 호스트 이름을 포괄 할 수 CommonName
있습니다. 그러나 특히 호스트 이름이 다른 소유권을 가진 도메인에있는 경우 관리상의 문제가 발생합니다.
그래서 TLS는 "서버 이름 표시"(SNI) 확장을 도입했습니다. 이 확장을 사용하면 클라이언트는 TLS 핸드 셰이크 절차 동안 요청 된 호스트 이름을 서버로 보냅니다. 그런 다음 서버는 적절한 인증서를 제시 할 수 있습니다. 불행히도, 모든 주요 SSL / TLS 구현의 현재 버전은 SNI를 지원하지만 이전 버전의 사용이 중단되는 데 오랜 시간이 걸렸습니다.
그 대답은 일부 대답보다 더 복잡합니다. DNS 조회를 수행 할 때 반드시 IP 주소 A
를 가져와야 합니다 ( IPv4, AAAA
IPv6 레코드 ). 통신하려면 TCP / IP를 통해 소켓을 열어야합니다. 그렇지 않으면 모든 것이 실패합니다. 해당 주소는 서버를 나타내거나로드 밸런서를 나타낼 수 있습니다. 심지어 프록시를 나타낼 수도 있습니다. 예를 들어 호스트가 CloudFlare 뒤에있는 경우 얻는 주소는 CloudFlare 서버의 주소입니다. 실제 서버는 다른 곳에 있습니다. 이를 통해 호스트는 서비스 거부 공격과 같은 문제를 피할 수 있습니다.
가상 호스팅 은 당신이 요구하는 것입니다 (다른 질문 중 일부는 이것에 대해 자세히 다루지 않았습니다). 가상 호스팅은 웹 요청을 받고 호스트 이름 (예 : domain.com)을 확인하여 서비스 할 웹 사이트를 결정합니다. 따라서 Apache HTTP 웹 서버에서는 다음과 같은 구성을 갖습니다.
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com
DocumentRoot /var/www/domain.com
</virtualHost>
이것은 예를 들어 단순화됩니다. 따라서 우리는 Apache에게 모든 IP의 포트 80을 수신하도록 지시합니다 (컴퓨터의 IP를 호스팅하는 최신 가상 머신에서는 실제 IP와 다를 수 있음). 그런 다음 이것이 domain.com
웹 사이트이며 해당 웹 사이트가 어떤 디렉토리에 있는지 알려줍니다 . 그런 다음이 블록을 반복해서 반복하여 Apache가 다른 웹 사이트를 처리하도록 할 수 있습니다. 모든 웹 서버는이 유형의 시스템을 지원합니다.
이를 처리하는 또 다른 방법은 웹 서버에 모든 웹 트래픽을 하나의 단일 프로그래밍 스크립트 (예 : PHP, ASP.NET 등)로 보내도록 지시 한 다음 해당 단일 스크립트가 표시 할 웹 사이트 및 페이지를 결정하는 것입니다.
DNS를 사용하면 원하는만큼 개별 IP 주소에 많은 이름을 지정할 수 있습니다 ( 호스트 파일 에서 각 이름을 공백으로 간단히 구분할 수 있음). DNS 서버를 사용하여 단일 이름에 여러 IP 주소를 할당 할 수도 있습니다 . 일대일 관계로 제한되지 않습니다.
웹 서버는 요청 된 URL 을 검사 하여 서비스 할 사이트를 알고 있습니다 . 요청 된 도메인, 요청 된 포트 및 사용 된 프로토콜을 확인합니다. 이것은 DNS와 관련이 없으며 HTTP 프로토콜에 의해 처리됩니다.
웹 서버는 호스트 컨테이너의 개념 (이 여기에 톰캣에 대한 설명서는 예를 들어,이다). 동일한 호스트 / IP 주소에 대해 여러 호스트 컨테이너를 구성하여 여러 도메인을 처리 할 수 있습니다. 컨테이너에는 독립적 인 작업 디렉토리, 인증 영역, 로그 디렉토리 등이 있습니다.
서버는 새 요청 구매와 관련된 컨테이너를 찾고 도메인 이름이이 HTTP 요청의 일부입니다.
완전히 다른 웹 서버 인스턴스가 다른 포트에서 실행되는 경우 동일한 IP 주소를 공유 할 수 있습니다. 프로덕션 서버가 임의의 포트에서 실행될 수 없으므로 도메인 이름을 사용할 수없는 다양한 개발 및 테스트 환경에서 주로 사용됩니다.
마지막으로 웹 사이트에 고유 한 IP 주소가 필요한 경우에도 서버 상자에 여러 개의 네트워크 어댑터가 있으므로 여러 개의 IP 주소를 사용하도록 구성됩니다.
Host:
헤더 내에 도메인이 없습니다 . 공유 호스팅의 경우, 제공자는 웹 서버를 다른 방식으로 처리하도록 구성 할 수 있습니다 (예 : 기본값, 제공자로 리디렉션 등).