IIS 익스프레스에서 URL 바인딩 실패 처리하기

등록일시: 2011-03-09 13:59,  수정일시: 2013-11-21 15:58
조회수: 12,176
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

개요

IIS 익스프레스는 일상적인 웹 개발 업무와 테스트의 대부분을 관리자 권한 없이도 수행할 수 있도록 설계됐습니다. 가령, 예약되지 않은 포트를 사용해서 로컬에서 웹 사이트를 실행하거나, 자체 서명된 테스트 인증서와 44300번 부터 44399번 사이의 포트 번호로 웹 사이트에서 SSL을 테스트 할 수 있습니다. 이에 관한 더 자세한 설명은 관리자 권한 없이 IIS 익스프레스 실행하기 문서를 참고하시기 바랍니다.

그러나, 때로는 기본적인 설정의 IIS 익스프레스로는 테스트가 불가능한 시나리오를 수행해야 하는 상황도 있습니다. 예를 들어서, IIS 익스프레스는 IIS 7과 달리 실제 운영을 위한 웹 서버로 설계된 제품이 아니지만, 웹 사이트에 대한 외부로부터의 접근을 테스트해야 하는 경우도 있습니다. 또는, SSL이나 예약된 포트 번호 중 특정 번호로 사이트를 테스트해야 할 수도 있습니다.

기본적으로 IIS 익스프레스로 이런 시나리오를 테스트하려고 시도하면 URL 바인딩 실패 오류가 발생합니다. 그 이유는 IIS 익스프레스가 이런 유형의 작업들을 수행하기 위한 충분한 권한이 없기 때문입니다. 물론, IIS 익스프레스를 관리자 권한으로 실행해서 제약사항을 회피할 수는 있지만, 보안적인 측면에서 볼 때 이는 좋은 습관이 아닙니다.

IIS 익스프레스로 이런 시나리오를 테스트하기 위한 바람직한 접근 방식은 IIS 익스프레스가 일반 사용자 권한으로 해당 작업을 수행할 수 있도록 HTTP.sys를 구성하는 것입니다. 그리고, 테스트가 끝나면 다시 구성을 원래 상태로 복원하는 것입니다. 보안상의 이유로 앞에서 설명한 것과 같은 유형의 작업들은 관리자만 수행할 수 있으며 일반 사용자(비관리자)들은 수행할 수 없도록 제한되어 있습니다.

HTTP.sys

HTTP.sys는 IIS와 IIS 익스프레스의 HTTP 및 SSL 통신을 처리해주는 운영체제의 구성 요소입니다. HTTP.sys는 기본적으로 다음과 같은 작업을 수행하는 응용 프로그램이 일반 사용자에 의해 실행되는 경우, 해당 응용 프로그램의 동작을 막습니다 (IIS 익스프레스도 이에 해당됩니다):

  • 80번이나 443번 등의 예약된 포트 번호를 사용하는 경우 *
  • 외부 통신을 제공하는 경우
  • SSL을 사용하는 경우

그러나, IIS 익스프레스에서 이런 작업을 수행할 수 있도록 사용자가 직접 HTTP.sys의 구성을 변경할 수도 있습니다. 윈도우 7이나 윈도우 비스타에서는 netsh.exe 유틸리티를 사용해서 HTTP.sys를 구성할 수 있고, 윈도우 XP에서는 Windows XP 서비스 팩 2 지원 도구에 포함되어 있는 httpcfg.exe 명령 프롬프트 유틸리티를 사용해서 HTTP.sys를 구성할 수 있습니다.

* 예약된 포트 번호의 전체 목록은 http://www.iana.org/assignments/port-numbers에서 확인할 수 있습니다.

예약된 포트 번호 사용하기

IIS 익스프레스를 사용할 때, 8080번 같이 예약되지 않은 포트 번호를 사용하는 웹 사이트는 기본적으로 실행이 가능합니다. 그러나, 80번이나 443번 같은 예약된 포트 번호를 사용하려면 별도의 추가적인 작업이 필요합니다. 지금부터 살펴보는 과정들은 포트 번호 80번을 이용해서 로컬 통신을 지원하고자 한다고 가정합니다.

윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http add urlacl url=http://localhost:80/ user=everyone

이 명령은 모든 사용자의 응용 프로그램이 (IIS 익스프레스 인스턴스를 포함해서) 관리자 권한 없이도 80번 포트를 사용할 수 있도록 허용합니다. 접근 가능한 사용자를 여러분 자신만으로 제한하려면 "everyone" 부분을 자신의 윈도우 계정으로 변경하면 됩니다.

윈도우 XP를 사용하는 경우에는, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg set urlacl /u http://localhost:80/ /a D:(A;;GX;;;WD)

이렇게 HTTP.sys를 구성했으면 이제 웹 사이트에서 80번 포트를 사용하도록 구성할 수 있습니다. 이 작업은 웹매트릭스나 비주얼 스튜디오 2010 SP1 베타 같은 도구를 사용해서 매우 간단하게 처리할 수 있습니다. 물론, 수작업으로 직접 applicationhost.config 파일을 편집해서 sites 요소 내부에 다음과 같은 바인딩 정보를 추가할 수도 있습니다: *

<binding protocol="http" bindingInformation="*:80:localhost"/> 

이제 웹 사이트는 80번 포트를 이용해서 (로컬에서) 실행될 것입니다.

응용 프로그램에 대한 테스트가 모두 끝나면 HTTP.sys의 설정을 이전 상태로 복원하는 것이 좋습니다. 윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http delete urlacl url=http://localhost:80/

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg delete urlacl /u http://localhost:80/

* 비주얼 스튜디오 2010 SP1 정식 버전은 2011년 3월 7일 현재 MSDN 서브스크립션 구독자에 한해서 다운로드 받을 수 있습니다.

외부 통신 제공하기

웹 사이트에서 외부 통신을 제공해주려면 HTTP.sys뿐만 아니라 컴퓨터의 방화벽도 구성해야 합니다. 지금부터 살펴보는 과정들은 8080번 포트를 통해서 외부 통신을 제공하고자 한다고 가정합니다.

외부 통신을 지원하기 위해서 필요한 HTTP.sys 구성 과정은 예약된 포트 번호를 사용할 수 있도록 사이트를 설정하는 방법과 비슷합니다. 윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http add urlacl url=http://myhostname:8080/ user=everyone

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg set urlacl /u http://myhostname:8080/ /a D:(A;;GX;;;WD)

이처럼 HTTP.sys의 구성을 마치고 난 뒤에는, 웹매트릭스나 비주얼 스튜디오 2010 SP1 베타를 이용하거나 직접 applicationhost.config 파일을 편집해서 sites 요소 내부에 다음과 같은 바인딩 정보를 추가해서 IIS 익스프레스를 구성합니다. (myhostname 부분을 여러분 컴퓨터의 도메인 이름으로 변경합니다.) *

<binding protocol="http" bindingInformation="*:8080:myhostname"/>

그리고, 추가적으로 8080번 포트를 이용해서 외부 통신이 가능하도록 방화벽 구성도 변경해줘야 합니다. 다만, 이 과정은 어떤 방화벽 제품을 사용하고 있는지에 따라 좌우되므로 본문에서는 설명하지 않습니다.

응용 프로그램에 대한 테스트가 모두 끝나면 HTTP.sys의 설정을 이전 상태로 복원하는 것이 좋습니다. 윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http delete urlacl url=http://myhostname:8080/

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg delete urlacl /u http://myhostname:8080/

* 물론, 도메인 이름 대신 호스트명을 사용해도 무방합니다. 사실 본문의 문맥을 감안해 볼 때도 호스트명이 더 적합합니다. 단, 바인딩 정보는 반드시 유일해야만 한다는 점에 주의하십시요.

사용자 정의 SSL 포트 사용하기

만약, 웹 사이트에 대한 SSL 접근을 테스트해보고 싶다면 44300번 부터 44399번 사이의 포트 번호와 IIS 익스프레스 자체 서명 인증서를 사용해서 IIS 익스프레스에서 테스트 가능합니다. 그러나, 이처럼 웹 사이트가 IIS 익스프레스로 실행되는 경우, 해당 범위 외부의 포트 번호를 사용해서 SSL을 사용하려고 시도하면 URL 바인딩 실패 오류가 발생합니다.

SSL 지원을 위해 HTTP.sys를 구성하는 방법에 대한 기본 지침은 How to: Configure a Port with an SSL Certificate 문서를 참고하시기 바랍니다. 본문에서는 https://localhost:443 같은 URL을 이용해서 웹 사이트를 테스트해보고자 한다고 가정하겠습니다.

가장 먼저 IIS 익스프레스 자체 서명 인증서의 SHA1 지문(Thumbprint)을 지정해야 합니다. 이 자체 서명 인증서의 지문은 각 컴퓨터마다 다 다른데, 그 이유는 IIS 익스프레스 설치 프로그램이 실행될 때 새로운 인증서가 생성되기 때문입니다. 인증서의 지문은 마이크로소프트 관리 콘솔(MMC, Microsoft Management Console) 인증서 스냅인의 컴퓨터의 개인용 인증서 저장소에서 찾아볼 수 있습니다. 또는, 다음과 같이 .NET CertMgr.exe 유틸리티를 사용해서 살펴볼 수도 있습니다. 명령 프롬프트에서 다음 명령을 실행합니다. *

certmgr.exe /c /s /r localMachine MY

이 명령을 실행하면 로컬 컴퓨터의 개인용 인증서 저장소에 존재하는 모든 인증서에 대한 정보들이 출력됩니다. 화면에 출력된 정보들 중에서 "IIS Express Development Certificate"라는 문구를 검색해서 IIS 익스프레스 자체 서명 인증서에 대한 정보를 찾은 다음, SHA1 지문(SHA1 Thumbprint)을 메모해둡니다.

그런 다음에 HTTP.sys를 구성해서 자체 서명 인증서와 URL을 연결시킵니다. 윈도우 7이나 윈도우 비스타를 사용하고 있다면, uuidgen.exe나 다른 도구를 사용해서 유일한 UUID를 생성합니다. 그리고, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행하는데, 이 때 certhash 인자에 인증서 지문을 전달합니다. (지문을 지정할 때 공백 문자는 제외합니다.)

netsh http add sslcert ipport=0.0.0.0:443 certhash=<thumbprint> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

그리고, appid 인자에는 방금 생성한 유일한 UUID를 전달합니다.

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg set ssl -i 0.0.0.0:443 -h <thumbprint>

그리고, 포트 번호 443번은 예약되어 있는 포트 번호이므로 일반 사용자에 의해 IIS 익스프레스가 실행되는 경우에도 이 포트 번호를 사용할 수 있도록 HTTP.sys도 추가로 구성해줘야 합니다. 이에 대한 보다 자세한 방법은 본문의 "예약된 포트 번호 사용하기" 문단을 참고하시기 바랍니다. 그러나, 44500번 같이 예약되지 않은 사용자 정의 SSL 포트 번호를 사용하려는 경우라면 이 과정은 수행할 필요가 없습니다.

윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http add urlacl url=https://localhost:443/ user=everyone

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg set urlacl /u https://localhost:443/ /a D:(A;;GX;;;WD)

이처럼 HTTP.sys의 구성을 마치고 난 뒤에는, 웹매트릭스나 비주얼 스튜디오 2010 SP1 베타를 이용하거나 직접 applicationhost.config 파일을 편집해서 sites 요소 내부에 다음과 같은 바인딩 정보를 추가해서 웹 사이트가 사용자 정의 SSL 포트 번호를 사용하도록 IIS 익스프레스를 구성합니다.

<binding protocol="https" bindingInformation="*:443:localhost"/>

응용 프로그램에 대한 테스트가 모두 끝나면 HTTP.sys의 설정을 이전 상태로 복원하는 것이 좋습니다. 윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http delete sslcert ipport=0.0.0.0:443
netsh http delete urlacl url=https://localhost:443/

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg delete ssl -i 0.0.0.0:443
httpcfg delete urlacl /u https://localhost:443/

* 윈도우+R 키를 눌러서 "실행" 대화 상자를 실행한 다음, "mmc.exe"를 입력하고 "확인" 버튼을 클릭하면 빈 관리 콘솔이 실행됩니다. 관리 콘솔에서 "파일" → "스냅인 추가/제거" 메뉴를 선택하면 "스냅인 추가/제거" 대화 상자가 나타나는데, "사용 가능한 스냅인" 목록에서 "인증서"를 선택하고 "추가" 버튼을 클릭합니다.

그러면, 다시 "인증서 스냅인" 대화 상자가 나타나는데, "컴퓨터 계정"을 선택하고 "다음" 버튼을 클릭한 다음, "컴퓨터 선택" 대화 상자로 이동해서 "로컬 컴퓨터: (이 콘솔이 실행되고 있는 컴퓨터)"를 선택하고 "마침" 버튼을 누른 다음, 다시 "확인" 버튼을 클릭하면 인증서 스냅인이 관리 콘솔에 추가됩니다.

관리 콘솔의 좌측 패인에서 "콘솔 루트" → "인증서(로컬 컴퓨터)" → "개인용" → "인증서" 노드를 선택하면 다음과 같이 이름이 "IIS Express Development Certificate"인 인증서를 찾을 수 있는데, 이 인증서가 바로 IIS 익스프레스가 설치 시 생성한 인증서입니다.

이 인증서를 마우스로 더블 클릭해서 "인증서" 대화 상자를 띄우고 "자세히" 탭을 클릭해 보면, 다음과 같이 "지문" 정보를 확인할 수 있습니다.

그리고, CertMgr.exe 유틸리티로 인증서의 지문 정보를 얻는 일 자체는 어렵지 않지만, 이 작업을 할 때는 일반 명령 프롬프트보다 "Visual Studio 2008 명령 프롬프트" 등 경로 설정이 미리 이루어져 있는 환경을 이용하는 것이 편리합니다.

사용자 정의 SSL 인증서 사용하기

사용자 정의 SSL 인증서를 사용할 수 있게 설정하는 방법은 사용자 정의 SSL 포트 번호를 사용할 수 있도록 설정하는 방법과 매우 비슷합니다. 지금부터 설명할 과정은 이미 웹 사이트가 포트 번호 44300번과 IIS 익스프레스 자체 서명 인증서를 이용해서 로컬 SSL 통신을 제공하고 있다고 가정합니다.

가장 먼저 해야 할 일은 컴퓨터에 사용자 정의 SSL 인증서를 설치하는 것입니다. 이 작업은 MMC 인증서 스냅인이나 CertMgr.exe를 이용해서 수행할 수 있습니다. 인증서를 설치하면서 SHA1 지문값을 메모해둡니다.

이미 https://localhost:44300 URL은 IIS 익스프레스 설치 시 자체 서명 인증서를 사용하도록 구성되어 있습니다. 이 URL을 사용자 정의 인증서에 바인드하려면, 먼저 기존 연결부터 삭제해야 합니다. 만약, 호스트명과 포트 번호의 조합이 SSL 인증서와 연결되어 있지 않다면 이 단계는 무시하십시오. *

윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

netsh http delete sslcert ipport=0.0.0.0:44300

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg delete ssl -i 0.0.0.0:44300

나머지 과정은 사용자 정의 SSL 포트 번호를 구성하는 과정과 매우 비슷합니다. 먼저, uuidgen.exe나 다른 도구를 사용해서 유일한 UUID를 생성합니다.

그리고 나서, 윈도우 7이나 윈도우 비스타를 사용하는 경우, 권한이 상승된 명령 프롬프트에서 다음의 명령을 실행하는데 certhash 인자에는 사용자 정의 인증서의 지문을 (먼저 공백 문자를 제거해야 합니다), appid 인자에는 UUID를 전달합니다.

netsh http add sslcert ipport=0.0.0.0:44300 certhash=<thumbprint> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

윈도우 XP를 사용하고 있다면 권한이 상승된 명령 프롬프트에서 다음 명령을 실행합니다:

httpcfg set ssl -i 0.0.0.0:44300 -h <thumbprint>

* IIS 익스프레스 7.5를 실제로 설치해보면 본문의 설명에서처럼 44300번 포트 번호를 사용하는 웹 사이트가 미리 설정되어 있거나 하지는 않습니다. 문맥상 그런 것으로 가정하겠다는 뜻인지 아니면 기존 버전에서는 설치 시 기본적으로 44300번 포트 번호를 사용하는 웹 사이트가 구성됐었는지 확실하지 않으므로 이 점을 감안하여 본문을 읽어보시기 바랍니다.

요약

본문에서는 IIS 익스프레스에서 기본으로 활성화되어 있지 않은 일부 시나리오들을 지원하기 위해 필요한 과정을 살펴봤습니다. 이런 시나리오들을 수행하기 위해서는 관리자 권한이 필요합니다. 그러나, 비록 관리자 권한을 갖고 있지 않은 경우에도, 대부분의 일반적인 웹 디자인 및 개발 작업들을 일반 사용자 권한을 이용해서 IIS 익스프레스에서 수행할 수 있습니다.