IIS 10.0 버전 1709 HTTP HSTS(엄격한 전송 보안) 지원
작성자: Yanbing Shi
IIS 10.0 버전 1709에서 관리자는 사이트 수준에서 HSTS 및 HTTP에서 HTTPS로 리디렉션을 사용하도록 설정하는 옵션이 있습니다.
호환성
버전 | 참고 |
---|---|
IIS 10.0 버전 1709 | 이 문서에 설명된 기능은 IIS 10.0 버전 1709에서 도입되었습니다. |
IIS 10.0 이하 | 이 문서에 설명된 기능은 IIS 10.0 버전 1709 이전에는 지원되지 않았습니다. |
HSTS(HTTP 엄격한 전송 보안)
RFC 6797에 지정된 HSTS(HTTP Strict Transport Security)를 사용하면 웹 사이트에서 자신을 보안 호스트로 선언하고 브라우저에 HTTPS 연결을 통해서만 연결해야 한다고 알릴 수 있습니다. HSTS는 HTTPS를 적용하고 서버와 클라이언트 간의 요청 및 응답을 가로채는 중간자 유형 공격의 기능을 크게 줄이는 옵트인 보안 향상 기능입니다.
HSTS는 웹 서버와 브라우저 모두에서 지원이 필요한 정책을 통해 HTTPS 사용을 적용합니다. HSTS 사용 웹 호스트에는 추가 통신을 위해 브라우저에 HTTPS를 사용하도록 요청하는 HTTPS 응답의 "max-age" 지시문과 함께 특수 HTTP 응답 헤더 "STRICT-Transport-Security"(STS)가 포함될 수 있습니다. 브라우저는 헤더를 수신하고 "max-age" 지시문에 지정된 시간(초)에 대한 HSTS 정책을 암기합니다. 이 기간 내에 사용자가 동일한 웹 사이트를 방문하려고 하지만 http:// 형식을 지정하거나 스키마를 생략하는 경우 브라우저는 보안 링크(https://)에 대한 안전하지 않은 링크를 자동으로 설정하고 서버에 HTTPS 연결을 만듭니다. HTTPS를 통해 응답이 수신되면 브라우저는 사용자가 보안 경고(예: 잘못된 서버 인증서에 대한 경고)를 "클릭"하지 못하도록 합니다. HSTS를 활용하려면 브라우저에서 HSTS 헤더를 한 번 이상 확인해야 합니다. 지정된 도메인에 대한 첫 번째 연결에서 사용자를 보호하기 위해 HSTS에는 등록된 도메인 목록을 브라우저에 미리 로드하는 별도의 메커니즘이 있습니다.
IIS 10.0 버전 1709 이전 HSTS 사용과 관련된 과제
IIS 10.0 버전 1709 이전에는 IIS 서버에서 HSTS를 사용하도록 설정하려면 복잡한 구성이 필요합니다.
IIS 10.0 버전 1709 이전의 HSTS를 사용하도록 설정하는 두 가지 솔루션이 예제 시나리오에 제공됩니다. 웹 관리자는 HTTP 및 HTTPS 연결을 모두 허용하는 도메인 contoso.com HSTS를 사용하도록 설정하고 모든 HTTP 트래픽을 HTTPS로 리디렉션하려고 합니다. 이 시나리오의 리디렉션은 기본적으로 안전하지 않지만 여전히 HTTPS를 지원하는 많은 웹 사이트 뒤에 오는 패턴입니다. 여전히 HTTP를 수신 대기하는 근본적인 이유는 웹 사이트가 HTTPS 또는 일반 HTTP를 통해 방문자가 연결을 시도하는 방법을 제어할 수 없기 때문입니다. HSTS를 사용하도록 설정하면 브라우저가 첫 번째 성공적인 HTTPS 연결 중에(직접 방문 또는 리디렉션을 통해) STS 헤더를 볼 수 있다는 조건 하에 안전하지 않은 HTTP에서 HTTPS로 리디렉션하는 수가 크게 줄어듭니다.
해결 방법 1: HTTP 리디렉션 모듈 + 사용자 지정 헤더
HTTP 리디렉션 모듈 을 사용하여 HTTP로 모든 HTTP 트래픽을 리디렉션할 수 있습니다. HTTP용 웹 사이트와 HTTPS용 웹 사이트 두 개를 사용하여 무한 리디렉션 루프를 방지할 수 있습니다.
<sites>
<site name="Contoso-http" id="1" serverAutoStart="true">
<application path="/" applicationPool="Contoso-http">
<virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-http" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:contoso.com" />
</bindings>
</site>
<site name="Contoso-https" id="2" serverAutoStart="true">
<application path="/" applicationPool="Contoso-https">
<virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-https" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
리디렉션 규칙은 HTTP 사이트의 web.config 모든 트래픽을 HTTPS 사이트로 라우팅하도록 구성되며 나중에 실제로 콘텐츠를 제공합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpRedirect enabled="true" destination="https://contoso.com" httpResponseStatus="Permanent" />
</system.webServer>
</configuration>
HTTPS 사이트의 web.config 구성하여 사용자 지정 헤더 를 통해 STS 헤더를 추가할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
해결 방법 2: URL 다시 쓰기 모듈
대체 솔루션은 URL 다시 쓰기 모듈 을 설치하고 HTTP 및 HTTPS 바인딩을 모두 사용하여 단일 웹 사이트에 대한 다시 쓰기 규칙을 구성하는 것입니다. HTTP-HTTPS 리디렉션은 인바운드 규칙에 의해 지정될 수 있으며, HTTPS 회신에 STS 헤더를 추가하는 것은 아웃바운드 규칙에서 수행할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add the STS header in HTTPS responses">
<match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" />
</conditions>
<action type="Rewrite" value="max-age=31536000" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
IIS 10.0 버전 1709 네이티브 HSTS 지원
IIS 10.0 버전 1709 릴리스에서는 이제 HSTS가 기본적으로 지원됩니다. HSTS를 사용하도록 설정하기 위한 구성이 크게 간소화되었습니다. 각 요소에서 요소의 <hsts>
특성을 구성하여 사이트 수준에서 HSTS를 사용하도록 설정할 수 있습니다. 자세한 내용은 웹 사이트 <HSTS>에 대한 HSTS HSTS 설정의 구성 참조에서 확인할 수 있습니다.<site>
예제 시나리오는 자습서에 따라 IISAdministration PowerShell cmdlet을 사용하여 웹 사이트 요소의 , max-age
및 redirectHttpToHttps
특성을 <hsts>
구성enabled
하여 수행할 수 있습니다.
Import-Module IISAdministration
Reset-IISServerManager -Confirm:$false
Start-IISCommitDelay
$sitesCollection = Get-IISConfigSection -SectionPath "system.applicationHost/sites" | Get-IISConfigCollection
$siteElement = Get-IISConfigCollectionElement -ConfigCollection $sitesCollection -ConfigAttribute @{"name"="Contoso"}
$hstsElement = Get-IISConfigElement -ConfigElement $siteElement -ChildElementName "hsts"
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "enabled" -AttributeValue $true
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "max-age" -AttributeValue 31536000
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "redirectHttpToHttps" -AttributeValue $true
Stop-IISCommitDelay
Remove-Module IISAdministration
웹 사이트에 대한 HSTS 구성은 다음과 같습니다.
<site name="Contoso" id="1">
<application path="/" applicationPool="Contoso">
<virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:contoso.com" />
<binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
</bindings>
<hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
</site>
HSTS의 기본 지원은 더 복잡한 시나리오를 위해 HTTP 리디렉션 모듈 과 함께 사용할 수도 있습니다.
예를 들어 웹 사이트 contoso.com 모든 트래픽을 하위 도메인 www.contoso.com
으로 리디렉션하고 두 웹 사이트 모두 HTTP 및 HTTPS 연결을 허용합니다. 웹 사이트에 단일 정식 주소가 있는 것이 바람직한 경우 일반적인 시나리오입니다. 사용자가 HTTP 또는 HTTPS를 통해 직접 방문할 수 있으므로 루트 도메인과 하위 도메인 모두에 대해 HSTS를 사용하도록 설정하는 것이 좋습니다. 루트 도메인 요소의 <hsts>
특성을 사용하도록 설정하면 includeSubDomains
모든 하위 도메인에 대한 HSTS 정책의 적용 범위가 더욱 향상됩니다.
<sites>
<site name="Contoso" id="1">
<application path="/" applicationPool="Contoso">
<virtualDirectory path="/" physicalPath="C:\inetpub\Contoso" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:contoso.com" />
<binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
</bindings>
<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />
</site>
<site name="Contoso-www" id="2">
<application path="/" applicationPool="Contoso-www">
<virtualDirectory path="/" physicalPath="C:\inetpub\Contoso-www" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:www.contoso.com" />
<binding protocol="https" bindingInformation="*:443:www.contoso.com" sslFlags="0" />
</bindings>
<hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
또한 루트 도메인 사이트의 web.config 요소를 통해 <httpRedirect>
루트 도메인에서 하위 도메인으로의 리디렉션을 구성할 수 있습니다. 이러한 구성을 사용하면 contoso.com HTTP 요청이 먼저 HTTPS로 리디렉션된 다음, 응답에 추가된 www.contoso.com
STS 헤더를 사용하여 동일한 사이트에 대한 HTTPS 요청이 로 리디렉션됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpRedirect enabled="true" destination="https://www.contoso.com" httpResponseStatus="Permanent" />
</system.webServer>
</configuration>
위의 샘플 구성은 원본 사이트에서 원본 사이트의 하위 도메인이 아닌 대상 사이트로 트래픽을 리디렉션하는 시나리오에도 적용되며, 원본 사이트에 대한 비활성화 includeSubDomains
의 사소한 구성 수정도 적용됩니다.