본문 바로가기
푸닥거리

.NET TLS versioncompilation targetFramework httpRuntime targetFramework

by ┌(  ̄∇ ̄)┘™ 2022. 8. 2.
728x90

ASP.NET의 web.config에는 헷갈리기 쉬운 두 개의 targetFramework 설정이 있습니다 — <compilation>의 것과 <httpRuntime>의 것입니다. 이름은 같지만 역할이 완전히 다릅니다. 여기에 .NET 버전별 TLS 기본 동작까지 얽히면 더 혼란스러워집니다. 이 글에서 셋을 명확히 구분합니다.

먼저 TLS — 버전별 기본 동작

  • .NET 4.7 이전 — TLS 버전이 사실상 TLS 1.0으로 하드코딩되어 있어, 최신 서버와 통신 시 연결이 실패할 수 있습니다.
  • .NET 4.7 이상ServicePointManagerOS가 지원하는 최상의 프로토콜(TLS 1.1/1.2 등)을 자동 선택합니다.

즉 TLS 문제의 근본 해결은 대상 프레임워크를 올리는 것이고, 그 "대상"을 지정하는 것이 바로 아래 두 설정입니다. (구버전에서 강제 지정하는 방법은 구 닷넷 TLS1.2 사용 절차 참고)

두 targetFramework의 차이

설정 의미 바꾸면 영향
<compilation targetFramework> 컴파일 시점 — 코드를 빌드할 때 참조하는 어셈블리 버전을 선택 사용 가능한 API가 달라짐 (컴파일 대상)
<httpRuntime targetFramework> 런타임 시점 — 재컴파일 없이 어떤 버전의 런타임 동작(quirks)을 적용할지 선택 ASP.NET의 실행 시 동작 방식이 달라짐

핵심은 compilation은 "무엇으로 빌드하는가", httpRuntime은 "어떤 동작 규칙으로 실행하는가"라는 점입니다. 특히 httpRuntime의 targetFramework는 보안 관련 기본값과 하위호환 동작(quirks mode)을 좌우하는데, TLS 자동 선택 같은 최신 동작을 켜려면 이 값이 중요합니다.

예시 — 잘못된 조합과 올바른 조합

원문 예시처럼 두 값이 어긋나면(compilation 4.6, httpRuntime 4.5) 빌드 대상과 런타임 동작이 불일치해 예상치 못한 문제가 생길 수 있습니다.

<!-- ⚠️ 어긋난 예 — 권장하지 않음 -->
<compilation targetFramework="4.6" />
<httpRuntime targetFramework="4.5" />

특별한 이유가 없다면 두 값을 동일하게, 최신으로 맞추는 것이 안전합니다.

<system.web>
  <compilation targetFramework="4.7.2" />
  <httpRuntime targetFramework="4.7.2" />
</system.web>

이렇게 4.7.2로 맞추면 앞서 말한 TLS 자동 선택을 포함한 최신 런타임 동작이 활성화됩니다.

정리

  • compilation targetFramework = 빌드 시 참조 어셈블리 버전 (컴파일 대상)
  • httpRuntime targetFramework = 런타임 동작 규칙 버전 (실행 동작 / 보안 기본값)
  • 두 값은 일치시키고, TLS 등 최신 동작을 원하면 4.7 이상으로 지정
  • 단, targetFramework 값은 해당 버전 런타임이 서버에 설치되어 있어야 유효합니다.

더 깊은 배경은 Microsoft의 All about <httpRuntime targetFramework> 글과 관련 StackOverflow 답변에서 확인할 수 있습니다.

728x90

댓글