다음을 통해 공유


웹 응용 프로그램의 기본 보안에 대한 유용한 정보

업데이트: 2007년 11월

안전한 웹 응용 프로그램 만들기라는 주제에는 방대한 내용이 포함됩니다. 이러한 내용을 이해하려면 보안 취약성에 대해 알아야 합니다. 또한 Windows, .NET 프레임워크 및 ASP.NET의 보안 기능을 잘 알고 있어야 합니다. 결국, 위협에 대비하려면 이러한 보안 기능을 사용하는 방법을 반드시 알아 두어야 합니다.

보안 문제를 잘 알지 못하더라도 웹 응용 프로그램을 보호하기 위해 기본적인 조치를 취해야 합니다. 다음 목록은 모든 웹 응용 프로그램에 적용되며 반드시 따라야 하는 최소한의 보안 지침입니다.

  • 일반 웹 응용 프로그램 보안 권장 사항

  • 최소 권한으로 응용 프로그램 실행

  • 사용자 확인

  • 악의적인 사용자 입력으로부터 보호

  • 안전한 데이터베이스 액세스

  • 보안상 위험하지 않은 오류 메시지 만들기

  • 안전한 비밀 유지

  • 안전한 쿠키 사용

  • 서비스 거부 위협으로부터 보호

    참고:

    보다 안전한 ASP.NET 웹 응용 프로그램을 디자인, 개발, 구성 및 배포에 도움이 되는 포괄적이고 상세한 보안 지침은 Microsoft Patterns and Practices 웹 사이트의 보안 모듈을 참조하십시오.

일반 웹 응용 프로그램 보안 권장 사항

아무리 정교한 응용 프로그램 보안 방법을 사용하더라도 악의적인 사용자가 간단한 방법으로 컴퓨터에 액세스할 수 있다면 실패할 수 있습니다. 다음 지침을 따릅니다.

  • 자주 백업하고 백업 데이터를 물리적으로 안전하게 보관합니다.

  • 웹 서버 컴퓨터를 물리적으로 안전하게 관리하여, 권한이 없는 사용자가 접근하여 전원을 끄거나 점유하지 않도록 합니다.

  • 파일 시스템은 FAT32가 아닌 Windows NTFS를 사용합니다. NTFS의 보안 기능은 FAT32보다 더욱 강력합니다. 자세한 내용은 Windows 설명서를 참조하십시오.

  • 웹 서버 컴퓨터 및 이 컴퓨터와 동일한 네트워크에 있는 모든 컴퓨터를 강력한 암호로 보호합니다.

  • IIS를 보호합니다. 자세한 내용은 Microsoft TechNet Security Center 웹 사이트를 참조하십시오.

  • 사용하지 않는 포트를 닫고 사용하지 않는 서비스를 중단합니다.

  • 인바운드 및 아웃바운드 트래픽을 모니터링하는 바이러스 검사 프로그램을 실행합니다.

  • 노출되기 쉬운 곳에 암호를 적어 두는 것을 금지하는 정책을 만들어 시행합니다.

  • 방화벽을 사용합니다. 권장 사항을 보려면 Microsoft 보안 사이트에서 Microsoft Firewall Guidelines를 참조하십시오.

  • Microsoft 및 다른 공급업체의 최신 보안 패치를 확보하여 설치합니다. 예를 들어, Microsoft TechNet Security Center 웹 사이트에는 모든 Microsoft 제품의 최신 보안 게시판 목록이 있습니다. 다른 공급업체에서도 비슷한 사이트를 제공합니다.

  • Windows 이벤트 로깅을 사용하여 의심스러운 활동에 대해 자주 로그를 검사합니다. 이러한 활동에는 시스템에 반복적으로 로그인을 시도하거나 웹 서버에 아주 많은 수의 요청을 보내는 경우가 포함됩니다.

최소 권한으로 응용 프로그램 실행

응용 프로그램이 실행되면 해당 응용 프로그램은 로컬 컴퓨터 및 잠재적으로는 원격 컴퓨터에 대해 특정 권한을 가진 컨텍스트로 실행됩니다. 응용 프로그램 ID를 구성하는 방법에 대한 자세한 내용은 ASP.NET 프로세스 ID 구성을 참조하십시오. 최소 권한으로 실행하려면 다음 지침을 따릅니다.

  • 시스템 사용자(관리자)의 ID로 응용 프로그램을 실행하지 마십시오.

  • 최소한의 실제적인 권한을 가진 사용자의 컨텍스트로 응용 프로그램을 실행합니다.

  • 응용 프로그램에 필요한 모든 리소스에 대해 권한(액세스 제어 목록 또는 ACL)을 설정합니다. 최소한의 권한을 설정합니다. 예를 들어 응용 프로그램에서 허용할 경우 파일을 읽기 전용으로 설정합니다. ASP.NET 응용 프로그램 ID에 필요한 최소 ACL 권한 목록을 보려면 ASP.NET 필수 ACL(액세스 제어 목록)을 참조하십시오.

  • 웹 응용 프로그램에 대한 파일은 응용 프로그램 루트 폴더 아래에 저장합니다. 응용 프로그램에서 사용자가 임의의 파일에 액세스할 수 있는 경로를 지정할 수 없도록 하십시오. 이렇게 하면 사용자는 서버의 루트에 액세스할 수 없습니다.

사용자 확인

대부분의 응용 프로그램에서 사용자가 자격 증명을 제공하지 않고 사이트에 익명으로 액세스합니다. 이 경우 응용 프로그램에서는 미리 정의된 사용자의 컨텍스트를 실행하여 리소스에 액세스합니다. 기본적으로 이 컨텍스트는 웹 서버 컴퓨터에 있는 로컬 ASPNET 사용자(Windows 2000 또는 Windows XP) 또는 NETWORK SERVICE 사용자(Windows Server 2003)입니다. 인증된 사용자의 액세스를 제한하려면 다음 지침을 따릅니다.

  • 응용 프로그램이 인트라넷 응용 프로그램인 경우 Windows 통합 보안을 사용하도록 구성합니다. 이 방법을 사용하면 사용자의 로그온 자격 증명을 사용하여 리소스에 액세스할 수 있습니다. 자세한 내용은 ASP.NET 가장을 참조하십시오.

  • 사용자의 자격 증명을 수집하려면 ASP.NET 인증 전략 중 하나를 사용합니다. 예제를 보려면 멤버 자격을 사용하여 사용자 관리를 참조하십시오.

악의적인 사용자 입력으로부터 보호

일반적으로 사용자가 입력한 내용이 안전하다고 생각하지 마십시오. 악의적인 사용자에게 있어 잠재적으로 위험한 정보를 클라이언트에서 응용 프로그램으로 보내는 것은 쉬운 일입니다. 악의적인 입력으로부터 보호하려면 다음 지침을 따릅니다.

  • ASP.NET 웹 페이지에서 사용자 입력을 필터링하여 스크립트가 포함되어 있을 수 있는 HTML 태그를 검사합니다. 자세한 내용은 방법: 문자열에 HTML 인코딩을 적용하여 스크립트를 이용한 공격으로부터 웹 응용 프로그램 보호를 참조하십시오.

  • 필터링되지 않은 사용자 입력은 표시하지 마십시오. 신뢰할 수 없는 정보를 표시하기 전에 HTML을 인코딩하여 잠재적인 위험이 있는 스크립트를 표시 문자열로 변환합니다.

  • 필터링되지 않은 사용자 입력은 데이터베이스에 저장하지 마십시오.

  • 사용자가 특정 HTML을 입력하는 것을 허용하려면 이를 수동으로 필터링합니다. 허용할 내용을 필터에 명시적으로 정의합니다. 악의적인 입력을 가려내기 위한 필터는 만들지 않는 것이 좋습니다. 그 이유는 악의적인 입력을 모두 예측하는 것은 매우 어렵기 때문입니다.

  • HttpRequest 개체의 HTTP 요청 헤더에서 가져오는 정보가 안전하다고 생각하지 마십시오. 쿼리 문자열, 쿠키 등에 대해서는 보호 수단을 사용합니다. 브라우저에서 서버로 보고되는 정보(사용자 에이전트 정보)가 응용 프로그램에 매우 중요한 정보인 경우 이 정보가 스푸핑될 수 있다는 사실을 명심해야 합니다.

  • 가능하면 중요한 정보는 숨김 필드 또는 쿠키 등과 같이 브라우저에서 액세스할 수 있는 위치에 저장하지 마십시오. 예를 들어, 암호는 쿠키에 저장하지 마십시오.

    참고:

    뷰 상태는 인코딩된 형식으로 숨김 필드에 저장됩니다. 기본적으로 뷰 상태에는 MAC(메시지 인증 코드)가 포함되어 있기 때문에 페이지에서 뷰 상태가 무단으로 변경되었는지 여부를 알 수 있습니다. 중요한 정보가 뷰 상태에 저장되어 있는 경우에는 페이지의 ViewStateEncryptionMode 속성을 true로 설정하여 암호화합니다.

안전한 데이터베이스 액세스

데이터베이스에는 보통 고유의 보안 기능이 있습니다. 웹 응용 프로그램 보안의 중요한 사항 중 하나는 응용 프로그램에서 데이터베이스에 안전하게 액세스할 수 있는 방법을 설계하는 것입니다. 다음 지침을 따릅니다.

  • 해당 데이터베이스 고유의 보안 기능을 사용하여 데이터베이스 리소스에 액세스할 수 있는 사용자를 제한합니다. 정확한 전략은 데이터베이스 및 응용 프로그램에 따라 다릅니다.

    • 응용 프로그램에서 가능한 경우, 통합 보안을 사용하여 Windows 인증 사용자만 데이터베이스에 액세스할 수 있도록 만듭니다. 통합 보안을 사용하는 것이 명시적인 자격 증명을 데이터베이스에 전달하는 것보다 안전합니다.

    • 응용 프로그램에 익명 액세스가 사용될 경우 권한이 매우 제한된 사용자를 하나 만들고 이 사용자로 연결하여 쿼리를 실행합니다.

  • 사용자 입력이 포함된 문자열을 연결하여 SQL 문을 만들지 마십시오. 대신 매개 변수가 있는 쿼리를 만들고 사용자 입력을 사용하여 매개 변수 값을 설정합니다.

  • 데이터베이스 로그인 자격 증명으로 사용할 사용자 이름과 암호를 저장해야 하는 경우 Web.config 파일에 저장하고 보호되는 구성을 사용하여 파일에 보안을 설정합니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

안전한 데이터 액세스에 대한 자세한 내용은 데이터 액세스 보안ADO.NET 응용 프로그램 보안을 참조하십시오.

보안상 위험하지 않은 오류 메시지 만들기

주의하지 않으면, 악의적인 사용자는 응용 프로그램에서 표시되는 오류 메시지를 통해 해당 응용 프로그램에 대한 중요한 정보를 추론할 수 있습니다. 다음 지침을 따릅니다.

  • 오류 메시지를 작성할 때 악의적인 사용자가 악용할 수 있는 사용자 이름 등의 정보를 표시하지 않도록 합니다.

  • 사용자에게 자세한 오류를 보여 주지 않도록 응용 프로그램을 구성합니다. 디버깅에 사용할 자세한 오류 메시지를 표시하려면 먼저 사용자가 웹 서버의 로컬 사용자인지 확인합니다. 자세한 내용은 방법: 안전한 오류 메시지 표시를 참조하십시오.

  • customErrors 구성 요소를 사용하여 서버에서 발생한 예외를 볼 수 있는 대상을 제어합니다.

  • 데이터베이스 액세스 등 오류가 발생하기 쉬운 상황에 대해 사용자 지정 오류 처리를 만듭니다. 자세한 내용은 ASP.NET 페이지 및 응용 프로그램의 오류 처리를 참조하십시오.

중요한 정보를 안전하게 보관

중요한 정보는 노출되지 않아야 하는 정보를 말합니다. 중요한 정보에는 일반적으로 암호 또는 암호화 키가 포함됩니다. 악의적인 사용자가 중요한 정보에 액세스할 수 있다면 해당 비밀에 의해 보호되는 데이터는 손상됩니다. 다음 지침을 따릅니다.

  • 응용 프로그램을 통해 브라우저와 서버 사이에서 중요한 정보가 전송되는 경우 SSL(Secure Sockets Layer)을 사용하는 것이 좋습니다. SSL로 사이트를 보안하는 방법에 대한 자세한 내용은 https://support.microsoft.com. Microsoft 기술 자료에서 문서 Q307267, "HOW TO: Secure XML Web Services with Secure Socket Layer in Windows 2000"을 참조하십시오.

  • 보호되는 구성을 사용하여 Web.config 또는 Machine.config 파일과 같은 구성 파일에 포함된 중요한 정보의 보안을 유지합니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

  • 중요한 정보를 저장해야 하는 경우 서버 코드처럼 다른 사용자가 볼 수 없는 폼이라도 웹 페이지에는 해당 정보를 보관하지 마십시오.

  • System.Security.Cryptography 네임스페이스에 제공된 강력한 암호화 알고리즘을 사용합니다.

안전한 쿠키 사용

쿠키를 사용하면 사용자별 정보를 편리하게 유지할 수 있습니다. 그러나 쿠키는 브라우저의 컴퓨터에 전송되기 때문에 스푸핑이나 다른 형태로 악용될 소지가 많습니다. 다음 지침을 따릅니다.

  • 쿠키에는 중요한 정보를 저장하지 않도록 합니다. 예를 들어 사용자 암호를 임시일지라도 쿠키에 저장하지 마십시오. 일반적으로 스푸핑될 경우 응용 프로그램을 손상시킬 수 있는 정보는 쿠키에 보관하지 않도록 합니다. 대신 쿠키에는 해당 정보가 있는 서버상의 위치에 대한 참조를 보관합니다.

  • 쿠키의 만료 날짜를 가능한 가장 짧게 설정합니다. 가능하면 영구 쿠키는 설정하지 않습니다.

  • 쿠키에 포함된 정보는 암호화하는 것이 좋습니다.

  • 쿠키의 SecureHttpOnly 속성을 true로 설정하는 것이 좋습니다.

서비스 거부 위협으로부터 보호

악의적인 사용자가 응용 프로그램에 손상을 주는 간접적인 방법 중 하나는 해당 응용 프로그램을 사용할 수 없게 만드는 것입니다. 악의적인 사용자는 응용 프로그램을 과다하게 사용하여 다른 사용자에게 서비스를 제공할 수 없게 만들기도 하고 단순히 응용 프로그램을 중단시키기도 합니다. 다음 지침을 따릅니다.

  • 오류 처리(예: try-catch)를 사용합니다. 실패에 대비하여 리소스를 해제하는 finally 블록을 포함시킵니다.

  • IIS에서 프로세스 조절을 사용하도록 구성합니다. 프로세스 조절 기능을 사용하면 특정 응용 프로그램에서 CPU 시간을 과다하게 사용하는 현상을 방지할 수 있습니다.

  • 사용자 입력을 사용하거나 저장하기 전에 제한된 크기를 초과하는지 여부를 테스트합니다.

  • 데이터베이스 쿼리에 크기를 제한하는 보호 수단을 사용합니다. 예를 들어, ASP.NET 웹 페이지에 쿼리 결과를 표시하기 전에 레코드 수가 정상적인지 확인합니다.

  • 응용 프로그램에 파일 업로드 기능이 포함된 경우 크기 제한을 설정합니다. Web.config 파일에서 다음과 같은 구문을 사용하면 maxRequestLength를 KB 단위로 지정하여 크기 제한을 설정할 수 있습니다.

    <configuration>
       <system.web>
            <httpRuntime maxRequestLength="4096" />
       </system.web>
    </configuration>
    

    또한 RequestLengthDiskThreshold 속성을 사용하여 대규모 업로드 및 폼 게시에 따른 메모리 오버헤드를 줄일 수도 있습니다.

참고 항목

개념

웹 응용 프로그램 보안 위협의 개요