Computer >> 컴퓨터 >  >> 문제 해결 >> Windows 오류

'기존 연결이 원격 호스트에 의해 강제로 닫혔습니다' 오류 해결 방법 완벽 가이드

원격 컴퓨터(Remote Computer)란 물리적인 형태 없이 오직 컴퓨터 네트워크를 통해서만 접근할 수 있는 컴퓨터를 의미합니다. 원격 호스트(Remote Host)는 원격 컴퓨터가 속한 네트워크를 운영하는 컴퓨터이며, 원격 클라이언트는 해당 네트워크에서 원격 컴퓨터를 사용하는 사용자를 뜻합니다. 이러한 기능은 수많은 업무 방식을 혁신적으로 변화시켰으며, 앞으로도 그 활용 범위가 더욱 넓어질 것으로 기대됩니다.

 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다  오류 해결 방법 완벽 가이드

그러나 최근 들어 원격 호스트에 연결을 시도하는 과정에서 '기존 연결이 원격 호스트에 의해 강제로 닫혔습니다(An existing connection was forcibly closed by the remote host)'라는 오류가 발생했다는 보고가 크게 늘어나고 있습니다. 이 오류는 클라이언트와 서버 간의 소켓 연결 과정에서 발생하며, 정상적인 통신을 방해하는 대표적인 문제 중 하나입니다.

이 글에서는 해당 오류를 완전히 해결할 수 있는 실질적인 방법들을 소개하고, 오류가 발생하는 주요 원인까지 함께 안내해 드리겠습니다.

윈도우에서 '기존 연결이 원격 호스트에 의해 강제로 닫혔습니다' 오류가 발생하는 원인

다수의 사용자들로부터 접수된 보고를 바탕으로 문제를 면밀히 조사한 결과, 아래와 같은 주요 원인들을 확인할 수 있었습니다.

  • TLS 1.1/1.0 프로토콜 사용: 응용 프로그램이 이미 폐기(deprecated)된 TLS 1.1 또는 TLS 1.0 프로토콜로 실행되고 있다면 이 오류가 발생할 수 있습니다. 응용 프로그램에는 반드시 TLS 1.2 프로토콜을 사용하는 것이 좋습니다.
  • 암호화(Cryptography) 비활성화: 시스템에서 암호화 기능이 비활성화되어 있으면 TLS 1.2 사용이 차단되고, 대신 TLS 1.0으로 대체(fallback)되면서 오류가 유발될 수 있습니다.
  • 소켓 구현 방식의 문제: 특정 유형의 소켓 구현 방식이 오류를 일으키는 경우가 있습니다. '.NET' 응용 프로그램의 일부 구현에는 버그가 존재하며, 이것이 오류의 원인이 될 수 있습니다.
  • 코드 누락: Entity Framework를 사용하는 일부 사용자의 경우, 특정 코드 한 줄이 누락되어 오류가 발생하는 것으로 확인되었습니다.
  • 구버전 '.NET' 프레임워크: '.NET' 프레임워크가 최신 버전이 아니거나 비활성화된 경우에도 이 오류가 나타날 수 있습니다. 일부 작업은 프레임워크가 최신 버전으로 업데이트되어야만 정상적으로 동작합니다.

이제 문제의 성격에 대해 기본적으로 이해했으니, 실제 해결 방법을 살펴보겠습니다. 설정 충돌을 피하기 위해 아래의 해결 방법들은 소개된 순서대로 적용하는 것이 좋습니다.

해결 방법 1: 암호화(Cryptography) 활성화하기

시스템에서 암호화 기능이 비활성화되어 있으면 TLS 1.2의 사용이 제한됩니다. 따라서 이 단계에서는 암호화 기능을 활성화하겠습니다.

  1. Windows 키 + R 키를 동시에 눌러 실행 창을 엽니다.
  2. 'regedit'을 입력하고 Enter 키를 누릅니다. 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다  오류 해결 방법 완벽 가이드
  3. 아래 경로로 이동합니다.
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.3031

    오른쪽 창에 'SchUseStrongCrypto' 값이 존재하지 않는 경우에는 아래 경로로 이동합니다.

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319
  4. 오른쪽 창에서 'SchUseStrongCrypto' 항목을 더블클릭하고, 값 데이터(Value data)에 '1'을 입력합니다. 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다  오류 해결 방법 완벽 가이드
  5. '확인'을 클릭하여 변경 사항을 저장한 후, 문제가 지속되는지 확인합니다.

해결 방법 2: TLS 1.2 사용 강제 설정하기

응용 프로그램이 TLS 1.2 대신 TLS 1.1 또는 TLS 1.0을 사용하도록 구성되어 있다면 이 오류가 발생할 수 있습니다. 따라서 이 단계에서는 컴퓨터가 TLS 1.2를 사용하도록 설정하겠습니다.

  1. 사이트의 루트 디렉터리로 이동하여 'global.asax' 파일을 마우스 오른쪽 버튼으로 클릭합니다.
  2. 목록에서 '코드 보기(View Code)'를 선택합니다.
  3. 'Application_Start' 메서드를 찾아 해당 메서드 안에 다음 코드를 추가합니다.
    if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Tls12) == false)
                {
                    ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls12;
                }
     기존 연결이 원격 호스트에 의해 강제로 닫혔습니다  오류 해결 방법 완벽 가이드
  4. 변경 사항을 저장한 후, 문제가 지속되는지 확인합니다.

해결 방법 3: 소켓 구현 방식 변경하기

특정 소켓 구현 방식에 버그나 결함이 있는 경우, 응용 프로그램의 일부 요소가 정상적으로 작동하지 않으면서 이 오류가 발생할 수 있습니다. 따라서 이 단계에서는 다른 구현 방식을 사용하도록 설정하겠습니다.

  1. 'StateObject' 클래스에 'public byte[] buffer = new byte[1024], public Socket socket;'이 포함되어 있는지 먼저 확인합니다.
  2. 'Receive(Socket s)' 함수를 호출하고, 'void ReceiveCallback(IAsyncResult ar)' 내부에 다음 코드를 추가합니다.
     SocketError errorCode;
        int nBytesRec = socket.EndReceive(ar, out errorCode);
        if (errorCode != SocketError.Success)
        {
            nBytesRec = 0;
        }
  3. 코드를 적용한 후 문제가 지속되는지 확인합니다.

해결 방법 4: 명령줄 코드 추가하기 (Entity Framework 전용)

Entity Framework를 사용 중이라면 특정 코드가 누락되었을 가능성이 있습니다. 이 단계에서는 해당 코드를 추가하여 문제를 해결하겠습니다.

  1. '.edmx' 파일을 열고, 그 아래에 있는 '.context.tt' 파일을 엽니다.
  2. '.context.cs' 파일을 연 후, 생성자(constructor)에 다음 코드를 추가합니다.
    public DBEntities() 
            : base("name=DBEntities") 
        { 
            this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE !
        }
  3. 코드를 추가한 후 문제가 지속되는지 확인합니다.

해결 방법 5: .NET Framework 업데이트하기

모든 기능이 원활하게 작동하려면 최신 버전의 '.NET' 프레임워크가 필요합니다. 따라서 이 단계에서는 공식 사이트에서 최신 버전을 다운로드하여 설치하겠습니다.

  1. 제공된 링크로 이동하여 설치 파일(setup)을 다운로드합니다.
  2. 다운로드한 '.exe' 파일을 실행하여 설치를 시작합니다. 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다  오류 해결 방법 완벽 가이드
  3. 화면에 표시되는 안내에 따라 컴퓨터에 응용 프로그램을 설치합니다.
  4. 설치를 완료한 후 문제가 지속되는지 확인합니다.