IIS의 HTTP/2
작성자 : David So
호환성
버전 | 참고 |
---|---|
IIS 10.0 | HTTP/2 지원은 IIS 10.0에서 도입되었습니다. |
IIS 8.5 이하 | HTTP/2는 IIS 10.0 이전에 지원되지 않았습니다. |
HTTP/2란?
HTTP/2는 TCP 연결을 통해 HTTP 의미 체계가 흐르는 방식을 재작업한 것이며, HTTP/2 지원은 Windows 10 및 Windows Server 2016 존재합니다. HTTP/2는 거의 2년 동안 HTTP/1.1을 사용한 후 주요 업그레이드이며 웹 서버에서 대기 시간 및 연결 로드의 영향을 줄입니다.
HTTP/1.1의 주요 발전은 여러 요청을 연속으로 서비스하는 영구 연결을 사용하는 것이었습니다. HTTP/2에서 영구 연결을 사용하여 여러 동시 요청을 서비스할 수 있습니다. 이 과정에서 HTTP/2는 네트워크를 통해 HTTP의 효율성을 향상시키는 몇 가지 추가 기능을 도입했습니다.
여러 요청에 대한 하나의 연결
모든 TCP 연결을 설정하려면 왕복이 필요합니다. 암호화를 사용하는 경우 TLS 핸드셰이크는 또 다른 1-2 왕복을 사용합니다. 이 모든 작업은 첫 번째 응답의 첫 번째 바이트를 보내기 전에 발생합니다. 새 연결을 설정하는 대신 기존 연결을 다시 사용하면 많은 요청에서 이 오버헤드를 공유할 수 있습니다. HTTP/2는 새 연결이 설정된 동안 요청이 대기하거나 기존 연결이 유휴 상태가 될 때까지 대기할 필요성을 크게 줄입니다. 여러 요청 간에 단일 연결이 멀티플렉싱되므로 일반적으로 다른 요청이 완료될 때까지 기다리지 않고 요청을 즉시 보낼 수 있습니다.
HPACK을 사용하여 헤더 압축
HTTP는 오랜 세월 동안 데이터 압축을 지원합니다. 그러나 헤더는 요청 간에 중복성이 많은 압축되지 않은 텍스트로 전송됩니다. (대부분의 가장 긴 헤더는 모든 요청에서 정확히 동일한 값으로 전송됩니다.) HTTP/2에는 요청 간의 중복성을 줄이는 HTTP 헤더에 대한 압축 체계인 HPACK이 도입되었습니다.
압축은 요청이 더 작기 때문에 멀티플렉싱에 도움이 됩니다. 이렇게 하면 클라이언트가 연결의 첫 번째 패킷에서 많은 요청을 수행할 수 있지만 TCP 흐름 제어 창은 여전히 작습니다.
서버 푸시
요청은 패턴으로 제공됩니다. 클라이언트가 하나의 리소스를 요청하는 경우 서버는 종종 페이지에서 참조되는 다른 리소스가 필요하다고 예측할 수 있습니다. HTTP/1.1에서는 인라인을 사용하여 첫 번째 응답의 일부로 이러한 리소스를 클라이언트에 전달했습니다. 인라인 처리에는 단점이 있습니다. 특히 인라인 리소스는 참조될 수 있는 다른 페이지에서 사용하기 위해 캐시할 수 없다는 것입니다.
HTTP/2에는 "push"라는 개념이 도입되었습니다. 클라이언트가 아직 요청하지 않은 요청에 응답하는 서버는 클라이언트의 의지를 예측합니다. 이를 통해 서버는 인라인 처리의 대기 시간 이점을 계속 제공할 수 있지만 클라이언트가 다른 페이지에서 캐시하고 다시 사용할 수 있는 형태로 제공됩니다.
HTTP/2를 사용할 어떻게 할까요? 있나요?
당신은 이미있을 수 있습니다! 거의 모든 브라우저가 이미 최신 릴리스에서 HTTP/2를 지원하므로 현재 데이터에 따르면 사용자의 50% 이상이 이미 HTTP/2 지원 브라우저에 있는 것으로 표시됩니다.
서버에서 Windows 10 또는 Windows Server 2016 실행되는 IIS는 HTTP/2를 지원합니다.
IIS는 현재 TLS를 통해서만 HTTP/2를 지원합니다. Windows 10 IIS를 실행하는 웹 서버에 HTTPS 연결을 만들 때 클라이언트와 서버가 모두 지원하는 경우 HTTP/2가 사용됩니다. IIS에서는 HTTP/2를 최대한 투명하게 구현했습니다. HTTP/2가 작동하려면 애플리케이션에서 아무것도 변경할 필요가 없습니다. 그러나 HTTP/2에서는 특정 HTTP/1.1 최적화(도메인 분할, 인라인화 등)가 더 이상 권장되지 않으므로 나중에 제거할 계획입니다.
푸시는 어떻습니까?
서버 푸시는 HTTP/2의 새로운 기능이므로 이를 활용하기 위해 호출해야 하는 새로운 API가 있습니다. ASP.NET PushPromise API 또는 IIS 네이티브 모듈에서 HttpDeclarePush API를 호출하는 경우 클라이언트에서 예상하는 요청에 대한 URL 및 선택적 요청 헤더를 제공합니다. 기본 연결에서 푸시를 지원하는 경우 다음 두 가지가 발생합니다.
- PUSH_PROMISE 클라이언트로 전송되므로 클라이언트는 리소스가 캐시에 이미 있는지 여부를 검사 수 있습니다.
- 푸시된 리소스에 대한 요청 큐에 새 요청이 추가됨
기본 연결이 푸시(클라이언트 사용 안 함 푸시 또는 HTTP/1.1 클라이언트)를 지원하지 않는 경우 호출은 아무 작업도 수행하지 않고 성공을 반환하므로 푸시가 허용되는지 여부를 걱정할 필요 없이 API를 안전하게 호출할 수 있습니다.
IIS 설정
HTTP/2와 관련된 새 IIS 구성 설정은 없습니다.
Windows Server 2016 Tech Preview에서는 'DuoEnabled' 레지스트리 키를 설정하는 멘션 있었습니다. 더 이상 필요하지 않습니다. 위에서 설명한 것처럼 클라이언트 및 서버 구성이 HTTP/2를 지원하는 경우 IIS는 HTTP/2(또는 가능하지 않은 경우 HTTP/1.1로 대체)를 사용합니다.
로깅 프로토콜 버전
IIS 로깅에는 기본적으로 꺼져 있는 '프로토콜 버전' 필드가 있습니다. 이 필드를 사용하도록 설정하면 HTTP/2, HTTP/1.1 등을 통해 어떤 요청이 진행되는지 추적하려는 경우에 유용합니다.
Internet Services Manager UI의 로 깅 기능 아래에서 필드 선택을 통해 찾을 수 있습니다.
변경한 후 맨 오른쪽의 작업 창 아래에서 적용을 클릭합니다.
프로토콜 버전 필드가 사용하도록 설정된 샘플 로그 파일 출력은 다음과 같습니다.
#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2015-08-13 18:46:11
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2015-08-13 18:46:11 ::1 GET / - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko - 200 0 0 391
2015-08-13 18:46:11 ::1 GET /iisstart.png - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko https://localhost/ 200 0 0 100
HTTP/2 데모 연습이 포함된 IIS
Windows 10 실행하는 경우 프로그램 및 기능, Windows 기능 켜기 또는 끄기, 인터넷 정보 서비스 사용 확인란을 통해 찾을 수 있습니다. Windows Server 2016 실행하는 경우 서버 관리자 시작하고 dashboard역할 및 기능 추가를 선택한 다음, 목록에서 웹 서버(IIS)를 선택합니다.
설치가 완료되면 Internet Services Manager를 시작하고 서버의 기능 보기에서 서버 인증서 옵션을 선택하여 자체 서명된 인증서를 만듭니다. 이 예제에서 자체 서명된 인증서를 사용하는 것은 데모/테스트 목적으로만 사용됩니다(프로덕션 사이트를 보호하는 데 권장되지 않음).
기본 웹 사이트로 이동하고 바인딩에서 방금 만든 자체 서명된 인증서를 사용하여 새 TLS 바인딩을 만듭니다.
Windows 10 또는 Windows Server 2016 컴퓨터에서 브라우저를 시작하고 F12 키를 누르거나 설정으로 이동하여 F12 개발자 도구를 사용하도록 설정한 다음 네트워크 탭으로 전환합니다. 찾아보기
https://localhost
및 짜잔, HTTP/2!
HTTP/2는 언제 지원되지 않나요?
경우에 따라 HTTP/2를 다른 기능과 함께 사용할 수 없습니다. 이러한 상황에서 Windows는 HTTP/1.1로 대체되고 트랜잭션을 계속합니다. 여기에는 핸드셰이크 중에 HTTP/1.1을 협상하거나 HTTP/1.1 연결을 통해 다시 시도하도록 지시하는 오류 코드를 클라이언트에 보내는 작업이 포함될 수 있습니다.
- Windows 인증(NTLM/Kerberos/Negotiate)는 HTTP/2에서 지원되지 않습니다. 이 경우 IIS는 HTTP/1.1로 대체됩니다.
- 텍스트 지우기 - 위에서 설명한 대로 IIS는 현재 TLS를 통한 HTTP/2만 지원합니다. 다시 말하지만 IIS는 HTTP/1.1로 대체됩니다.
- 대역폭 제한 - IIS에는 대역폭을 제한하는 기능이 있습니다(Inetmgr에서 작업 창 구성에서 사이트 '제한'을 선택). 이는 HTTP/1.1에 적용되지만 HTTP/2에는 적용되지 않습니다(오류 또는 대역폭 제한 없이 진행됨).
참조 항목
HTTP/2 및 Windows의 클라이언트 및 서버 구현에 대한 자세한 내용은 Windows 10: 브라우저, 앱 및 웹 서버의 빌드 2015 대화 HTTP/2를 참조하세요.
저자: 마이크 주교, 데이비드 소 (에서 기여 롭 추적, 바리스 Caglar, 나짐 랄라에 승인)