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의 로 기능 아래에서 필드 선택을 통해 찾을 수 있습니다.

W 3 C 로깅 필드 메뉴에서 프로토콜 버전 C S 대시 버전이 선택된 필드 선택 드롭다운을 표시하는 I S 로깅 페이지의 이미지.

변경한 후 맨 오른쪽의 작업 창 아래에서 적용을 클릭합니다.

프로토콜 버전 필드가 사용하도록 설정된 샘플 로그 파일 출력은 다음과 같습니다.

#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

  1. Windows 10 실행하는 경우 프로그램 및 기능, Windows 기능 켜기 또는 끄기, 인터넷 정보 서비스 사용 확인란을 통해 찾을 수 있습니다. Windows Server 2016 실행하는 경우 서버 관리자 시작하고 dashboard역할 및 기능 추가를 선택한 다음, 목록에서 웹 서버(IIS)를 선택합니다.

    인터넷 정보 서비스가 선택되고 강조 표시된 Windows 기능 켜기 또는 끄기 페이지의 이미지.

  2. 설치가 완료되면 Internet Services Manager를 시작하고 서버의 기능 보기에서 서버 인증서 옵션을 선택하여 자체 서명된 인증서를 만듭니다. 이 예제에서 자체 서명된 인증서를 사용하는 것은 데모/테스트 목적으로만 사용됩니다(프로덕션 사이트를 보호하는 데 권장되지 않음).

    서버 인증서가 강조 표시된 인터넷 Service Manager 페이지의 서버 기능 보기 이미지

    자체 서명된 인증서 만들기 옵션이 강조 표시된 이름 상자를 표시하는 자체 서명된 인증서 대화 상자의 이미지

  3. 기본 웹 사이트로 이동하고 바인딩에서 방금 만든 자체 서명된 인증서를 사용하여 새 TLS 바인딩을 만듭니다.

    드롭다운에서 IP 주소 유형이 강조 표시되고 로컬 I S 서버가 선택된 사이트 바인딩 추가 대화 상자의 스크린샷

  4. Windows 10 또는 Windows Server 2016 컴퓨터에서 브라우저를 시작하고 F12 키를 누르거나 설정으로 이동하여 F12 개발자 도구를 사용하도록 설정한 다음 네트워크 탭으로 전환합니다. 찾아보기 https://localhost 및 짜잔, HTTP/2!

    네트워크 탭이 표시되고 H T T P 2가 선택된 로컬 호스트 대시 F12 개발자 도구의 스크린샷

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, 나짐 랄라에 승인)