HTTP 호스트 헤더는 모든 웹 요청의 중요한 부분입니다. 이는 서버에 클라이언트가 접근하려는 도메인 이름을 알려줍니다. 예를 들어, 브라우저에 https://www.apidog.com
을 입력하면 브라우저는 Host: www.apidog.com
호스트 헤더와 함께 요청을 보냅니다. 이렇게 하면 서버는 어떤 웹사이트를 제공해야 하는지 알 수 있습니다.
그런데 이것이 왜 중요할까요? 그리고 웹 개발자로서 이를 통해 보안과 성능을 어떻게 향상시킬 수 있을까요? 이 글에서는 이러한 질문에 답하고 HTTP 호스트 헤더 공격을 방지하는 몇 가지 모범 사례와 예시를 보여드리겠습니다. 시작해 볼까요!
HTTP 호스트 헤더란 무엇인가요?
HTTP 호스트 헤더는 모든 HTTP/1.1 요청에 필요한 표준 HTTP 헤더 필드입니다. 이는 여러 웹사이트가 동일한 IP 주소와 포트를 공유할 수 있는 가상 호스팅 문제를 해결하기 위해 RFC 2616에서 도입되었습니다. 호스트 헤더가 없으면 서버는 어떤 웹사이트를 제공해야 하는지 모르고, 클라이언트는 어떤 웹사이트를 표시해야 하는지 모릅니다.
다음은 호스트 헤더가 있는 HTTP 요청의 예입니다:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
이 예에서 Host
헤더는 www.example.com
으로 설정되어 있어, 서버가 클라이언트가 www.example.com
에 호스팅된 웹사이트나 애플리케이션에 액세스하고 싶다는 것을 알게 됩니다.
HTTP 호스트 헤더의 장점:
호스트 헤더는 여러 가지 이유로 중요합니다:
- 가상 호스팅을 가능하게 하여 동일한 서버에서 여러 웹사이트를 호스팅하는 비용과 복잡성을 줄여줍니다.
- 서버가 다른 웹사이트에 대해 캐싱, 압축, 리디렉션, 인증 등의 다양한 구성, 규칙 및 정책을 적용할 수 있게 해줍니다.
- 웹사이트에 대한 정확하고 일관된 URL을 생성하는 데 도움을 줍니다. 예를 들어, 정규 URL, 절대 URL, 상대 URL과 같은 것입니다.
- 클라이언트가 SSL 인증서 확인, DNS 스푸핑 방지, 혼합 콘텐츠 회피 등 웹사이트의 신원과 무결성을 확인하는 데 도움을 줍니다.

호스트 헤더는 무엇에 사용되나요?
HTTP 호스트 헤더의 주요 목적은 클라이언트가 통신하고자 하는 특정 백엔드 구성 요소나 애플리케이션을 식별하는 데 도움을 주는 것입니다. 동일한 IP 주소와 서버에서 여러 웹사이트, 웹 애플리케이션 또는 서비스가 호스팅되는 상황에서 호스트 헤더는 들어오는 요청을 의도한 목적지로 라우팅하는 데 중요한 역할을 합니다.
올바르게 형식화된 호스트 헤더가 없거나 호스트 헤더가 아예 없는 경우, 요청을 올바른 애플리케이션으로 유도하려 할 때 문제 발생 할 수 있으며, 이는 잠재적인 라우팅 오류나 의도하지 않은 동작으로 이어질 수 있습니다.
HTTP 호스트 헤더 공격 방지 방법은?
HTTP 호스트 헤더는 웹사이트의 보안을 강화하고 다양한 공격으로부터 보호하는 데 사용될 수 있습니다. 다음은 보안을 위해 이를 사용하는 몇 가지 팁입니다:
호스트 헤더 유효성 검사
서버 측에서 항상 호스트 헤더를 유효성 검사하고 예상한 도메인 이름과 일치하지 않는 요청은 거부해야 합니다. 이는 공격자가 호스트 헤더를 조작하여 서버가 악성 작업을 수행하도록 속일 수 있는 호스트 헤더 주입 공격을 방지할 수 있습니다. 필요에 따라 화이트리스트 또는 정규 표현식을 사용하여 호스트 헤더를 유효성 검사할 수 있습니다.
HTTPS 및 HSTS 사용
항상 클라이언트와 서버 간의 통신을 암호화하기 위해 HTTPS (HTTP Secure)를 사용해야 합니다. 이를 통해 도청, 변조 및 재전송 공격을 방지할 수 있습니다. 클라이언트가 HTTPS를 사용하도록 강제하고 SSL 스트리핑 공격을 피하기 위해 HSTS (HTTP Strict Transport Security)도 사용해야 합니다. HSTS를 활성화하기 위해 Strict-Transport-Security
헤더를 사용할 수 있습니다. 예: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
.
SNI 및 SAN 사용
동일한 IP 주소와 포트에서 여러 SSL 인증서를 지원하기 위해 SNI (Server Name Indication) 및 SAN (Subject Alternative Name)을 사용해야 합니다. SNI는 SSL/TLS 프로토콜에 대한 확장으로, 클라이언트가 SSL 핸드셰이크 중에 호스트 헤더를 보내 서버가 웹사이트에 적절한 인증서를 선택할 수 있게 해줍니다.
SAN은 X.509 인증서에 대한 확장으로, 인증서가 여러 도메인 이름이나 IP 주소를 포함할 수 있도록 하여 클라이언트가 호스트 헤더에 대해 인증서를 확인할 수 있게 해줍니다. OpenSSL 또는 Let’s Encrypt와 같은 도구를 사용하여 SNI 및 SAN과 함께 SSL 인증서를 생성하고 관리할 수 있습니다.

HTTP 호스트 헤더를 성능에 사용하기
HTTP 호스트 헤더는 웹사이트의 성능을 개선하고 속도와 확장성을 최적화하는 데도 사용할 수 있습니다. 다음은 성능을 위해 이를 사용하는 몇 가지 팁입니다:
CDN 및 DNS 사용.
웹사이트 콘텐츠를 여러 서버와 위치에 분산시키고 도메인 이름을 가장 가까운 서버로 해결하기 위해 CDN (Content Delivery Network)과 DNS (Domain Name System)를 사용해야 합니다. 이를 통해 지연 시간, 대역폭 및 원본 서버의 로드를 줄이고 웹사이트의 사용자 경험과 가용성을 개선할 수 있습니다. Cloudflare, AWS CloudFront 또는 Google Cloud CDN과 같은 서비스를 사용하여 CDN 및 DNS를 설정할 수 있습니다.
HTTP/2 및 ALPN 사용.
HTTP 프로토콜을 업그레이드하고 멀티플렉싱, 압축, 우선순위 지정 및 서버 푸시를 활성화하기 위해 HTTP/2 및 ALPN (Application-Layer Protocol Negotiation)을 사용해야 합니다. HTTP/2는 여러 요청 및 응답을 단일 TCP 연결을 통해 전송할 수 있도록 하여 HTTP/1.1의 오버헤드와 혼잡을 줄이는 HTTP의 새로운 버전입니다. ALPN은 SSL/TLS 프로토콜에 대한 확장으로, 클라이언트와 서버가 연결에 대한 최상의 프로토콜을 협상할 수 있게 해줍니다. 예: Upgrade: h2c
및 ALPN: h2
와 같은 Upgrade
및 ALPN
헤더를 사용하여 HTTP/2 및 ALPN을 활성화할 수 있습니다.
캐싱 및 압축 사용.
웹사이트 콘텐츠의 크기와 빈도를 줄이고 응답 시간 및 대역폭 사용을 개선하기 위해 캐싱 및 압축을 사용해야 합니다. 캐싱은 클라이언트 또는 서버가 웹사이트 콘텐츠(예: HTML, CSS, JS, 이미지 등)를 저장하고 재사용할 수 있도록 하는 기술로, 다시 요청하지 않고도 사용할 수 있게 해줍니다.
압축은 서버가 불필요하거나 중복된 데이터를 제거하여 웹사이트 콘텐츠의 크기를 줄이도록 허용하는 기술입니다. 예: Cache-Control
, Expires
, ETag
, Last-Modified
헤더를 사용하여 캐싱 동작을 제어하고, Content-Encoding
, Accept-Encoding
, Vary
헤더를 사용하여 압축을 활성화할 수 있습니다. 예: Cache-Control: public, max-age=86400
, Content-Encoding: gzip
, Vary: Accept-Encoding
.
Apidog와 함께 HTTP 호스트 헤더 사용하기
Apidog 는 API를 설계, 테스트 및 문서화하는 데 도움을 주는 강력하고 사용이 간편한 도구입니다. 이는 모의 서버, 코드 생성기, 협업 등 API 개발을 더 빠르고 원활하게 해주는 다양한 기능을 지원합니다.
Apidog에서 API를 테스트하고 디버깅하기 위해 HTTP 호스트 헤더를 사용할 수 있습니다. 내장된 API 테스터를 사용하여 API 엔드포인트에 요청을 보내고 응답과 로그를 실시간으로 볼 수 있습니다.
- "새 요청" 버튼을 클릭하세요.

2. 사용하려는 HTTP 방법을 선택하고 접근할 API의 URL을 입력하세요.

3. "헤더" 탭을 클릭하고 HTTP 승인 헤더 및 인증을 추가하여 승인 유형을 수정하세요.


4. "전송" 버튼을 클릭하고 응답 상태 코드, 헤더 및 본문을 확인하세요. 토큰이 유효한 경우, 상태 코드는 200 (OK)이어야 하며 본문에는 요청한 자원이 포함되어야 합니다. 토큰이 유효하지 않은 경우, 상태 코드는 401 (Unauthorized) 또는 403 (Forbidden)이어야 하며 본문에는 오류 메시지가 포함되어야 합니다.

결론
HTTP 호스트 헤더는 보안과 성능을 향상시킬 수 있는 강력하고 다재다능한 도구입니다. 또한 Apidog를 사용하여 API를 생성, 관리, 테스트 및 문서화하는 데도 도움이 됩니다.
이 글에서는 HTTP 호스트 헤더를 효과적으로 사용하는 방법과 몇 가지 모범 사례 및 예시를 보여드렸습니다. 이 블로그 게시물에서 새로운 유용한 정보를 얻으셨기를 바랍니다. 읽어주셔서 감사합니다!
