ASP.NET Core에 HTTPS를 적용 합니다.Enforce HTTPS in an ASP.NET Core

작성자: Rick AndersonBy Rick Anderson

이 문서에서는 다음과 같은 내용을 살펴봅니다.This document shows how to:

  • 모든 요청에 대 한 HTTPS가 필요 합니다.Require HTTPS for all requests.
  • 모든 HTTP 요청을 HTTPS로 리디렉션하는 방법.Redirect all HTTP requests to HTTPS.

경고

수행 하지 사용 RequireHttpsAttribute 중요 한 정보를 수신 하는 웹 Api에 있습니다.Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute HTTP 상태 코드를 사용 하 여 HTTP에서 HTTPS로 브라우저를 리디렉션합니다.RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. API 클라이언트 이해 하지 못하거나 리디렉션을 HTTP에서 HTTPS로 준수 수 있습니다.API clients may not understand or obey redirects from HTTP to HTTPS. 이러한 클라이언트는 HTTP를 통해 정보를 보낼 수 있습니다.Such clients may send information over HTTP. 웹 Api 하거나 수행 해야합니다.Web APIs should either:

  • HTTP에서 수신 하지 않습니다.Not listen on HTTP.
  • 상태 코드 400 (잘못 된 요청)와 연결을 닫고 요청을 처리 하지 마십시오.Close the connection with status code 400 (Bad Request) and not serve the request.

HTTPS가 필요Require HTTPS

모든 ASP.NET Core 웹 앱 호출 권장 UseHttpsRedirection HTTPS로 모든 HTTP 요청을 리디렉션할 수 있습니다.We recommend all ASP.NET Core web apps call UseHttpsRedirection to redirect all HTTP requests to HTTPS. 경우 UseHsts 호출 되는 앱에서 호출 해야 하기 전에 UseHttpsRedirection합니다.If UseHsts is called in the app, it must be called before UseHttpsRedirection.

다음 호출 코드 UseHttpsRedirectionStartup 클래스:The following code calls UseHttpsRedirection in the Startup class:

[!code-csharpsample][!code-csharpsample]

다음 예를 참조하십시오.The following code:

[!code-csharpsample][!code-csharpsample]

  • 집합 RedirectStatusCode합니다.Sets RedirectStatusCode.
  • 5001를 HTTPS 포트를 설정합니다.Sets the HTTPS port to 5001.

RequireHttpsAttribute HTTPS가 필요 하는 데 사용 됩니다.The RequireHttpsAttribute is used to require HTTPS. [RequireHttpsAttribute] 컨트롤러 또는 메서드를 데코레이팅 할 수 있습니다 또는 전역으로 적용 될 수 있습니다.[RequireHttpsAttribute] can decorate controllers or methods, or can be applied globally. 특성을 전역으로 적용 하려면 다음 코드를 추가 ConfigureServicesStartup:To apply the attribute globally, add the following code to ConfigureServices in Startup:

[!code-csharp][!code-csharp]

위의 강조 표시된 코드는 모든 요청에 HTTPS 를 사용하도록 강제하며, 그 결과 HTTP 요청은 무시됩니다.The preceding highlighted code requires all requests use HTTPS; therefore, HTTP requests are ignored. 다음에 강조 표시된 코드는 모든 HTTP 요청을 HTTPS로 리디렉션합니다.The following highlighted code redirects all HTTP requests to HTTPS:

[!code-csharp][!code-csharp]

자세한 내용은 참조 URL 다시 쓰기 미들웨어합니다.For more information, see URL Rewriting Middleware.

전역으로 HTTPS를 요구하는 것이 보안상 가장 안전한 모범 사례입니다 (options.Filters.Add(new RequireHttpsAttribute());).Requiring HTTPS globally (options.Filters.Add(new RequireHttpsAttribute());) is a security best practice. 적용 된 [RequireHttps] 모든 컨트롤러/Razor 페이지에는 특성으로 전체적으로 HTTPS를 필요로 하는 컨트롤로 안전 하다 고 간주 되지 않습니다.Applying the [RequireHttps] attribute to all controllers/Razor Pages isn't considered as secure as requiring HTTPS globally. 보장할 수는 [RequireHttps] 특성은 새 컨트롤러 및 Razor 페이지 추가 될 때 적용 됩니다.You can't guarantee the [RequireHttps] attribute is applied when new controllers and Razor Pages are added.

HTTP 엄격한 전송 보안 프로토콜 (HSTS)HTTP Strict Transport Security Protocol (HSTS)

OWASP, HTTP 엄격한 전송 보안 (HSTS) 는 특별 한 응답 헤더를 사용 하 여 웹 응용 프로그램에 의해 지정 된 옵트인 보안 향상 합니다.Per OWASP, HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that is specified by a web application through the use of a special response header. 지원 되는 브라우저는이 헤더를 수신 되 면 해당 브라우저의 통신을 지정한 도메인에 HTTP를 통해 보낼 수 없게 됩니다 및 HTTPS를 통해 모든 통신 송신할 대신 합니다.Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS. 또한 브라우저에 대 한 프롬프트를 통해 HTTPS 클릭을 수 없습니다.It also prevents HTTPS click through prompts on browsers.

ASP.NET Core 2.1 이상 HSTS와 구현 하는 UseHsts 확장 메서드.ASP.NET Core 2.1 or later implements HSTS with the UseHsts extension method. 다음 호출 코드 UseHsts 앱에 없는 경우 개발 모드:The following code calls UseHsts when the app isn't in development mode:

[!code-csharpsample][!code-csharpsample]

UseHsts 않으므로 개발에 권장 되는 HSTS 헤더는 항상 브라우저에서 캐시할.UseHsts is not recommend in development because the HSTS header is highly cachable by browsers. 기본적으로 UseHsts 로컬 루프백 주소를 제외합니다.By default, UseHsts excludes the local loopback address.

다음 예를 참조하십시오.The following code:

[!code-csharpsample][!code-csharpsample]

  • Strict-전송-보안 헤더의 미리 로드 매개 변수를 설정 합니다.Sets the preload parameter of the Strict-Transport-Security header. 미리 로드를가의 일부가 RFC HSTS 사양, 있지만 HSTS 사이트 설치에 미리 로드 하려면 웹 브라우저에서 지원 됩니다.Preload is not part of the RFC HSTS specification, but is supported by web browsers to preload HSTS sites on fresh install. 자세한 내용은 https://hstspreload.org/를 참조하세요.See https://hstspreload.org/ for more information.
  • 수 있도록 includeSubDomain, 하위 도메인의 호스트에 HSTS 정책을 적용 합니다.Enables includeSubDomain, which applies the HSTS policy to Host subdomains.
  • 60 일 Strict-전송-보안 헤더의 최대 처리 기간 매개 변수를 명시적으로 설정합니다.Explicitly sets the max-age parameter of the Strict-Transport-Security header to to 60 days. 그렇지 않은 경우 30 일에 기본값을 설정 합니다.If not set, defaults to 30 days. 참조는 최대 처리 기간 지시문 자세한 정보에 대 한 합니다.See the max-age directive for more information.
  • 추가 example.com 제외 하는 호스트의 목록에 있습니다.Adds example.com to the list of hosts to exclude.

UseHsts 다음과 같은 루프백 호스트는 제외 됩니다.UseHsts excludes the following loopback hosts:

  • localhost : IPv4 루프백 주소입니다.localhost : The IPv4 loopback address.
  • 127.0.0.1 : IPv4 루프백 주소입니다.127.0.0.1 : The IPv4 loopback address.
  • [::1] : IPv6 루프백 주소입니다.[::1] : The IPv6 loopback address.

앞의 예제에는 추가 호스트를 추가 하는 방법을 보여 줍니다.The preceding example shows how to add additional hosts.

옵트아웃 HTTPS의 프로젝트 생성 시Opt-out of HTTPS on project creation

ASP.NET Core 2.1와 (Visual Studio 또는 dotnet 명령줄)에서 최신 웹 응용 프로그램 템플릿을 사용 하면 HTTPS 리디렉션HSTS합니다.The ASP.NET Core 2.1 and later web application templates (from Visual Studio or the dotnet command line) enable HTTPS redirection and HSTS. HTTPS를 필요로 하지 않는 배포의 경우 있습니다 수 옵트아웃 https입니다.For deployments that don't require HTTPS, you can opt-out of HTTPS. 예를 들어 일부 백 엔드 서비스에 HTTPS 처리 되 고 외부에서 경계 면 HTTPS를 사용 하 여 각 노드에서 필요 하지 않습니다.For example, some backend services where HTTPS is being handled externally at the edge, using HTTPS at each node is not needed.

되지 않게 하려면 https:To opt-out of HTTPS:

취소는 HTTPS에 대 한 구성 확인란을 선택 합니다.Uncheck the Configure for HTTPS checkbox.

엔터티 다이어그램

Docker에 대 한 개발자 인증서를 설치 하는 방법How to setup a developer certificate for Docker

참조 이 GitHub 문제합니다.See this GitHub issue.