세션 상태 보안

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 세션 상태를 사용하면 웹 응용 프로그램을 구성하는 서로 다른 ASP.NET 페이지를 탐색하는 사용자에 대해 값을 저장 및 검색할 수 있습니다. ASP.NET 세션 상태는 제한된 시간 창에서 동일한 브라우저의 요청을 세션으로 식별하며 해당 세션 동안 변수 값을 유지할 수 있습니다. 브라우저 세션은 세션 쿠키에서 식별되거나 "쿠키가 없는" 세션 상태를 구성한 경우 URL에서 식별됩니다.

ASP.NET 세션 상태는 모든 ASP.NET 응용 프로그램에서 기본적으로 활성화되어 있으며 세션 쿠키를 사용하여 브라우저 세션을 식별하도록 구성됩니다.

ASP.NET 세션 상태는 기본적으로 세션 변수 값을 메모리에 저장하지만 세션 변수 값을 상태 서버, SQL Server 또는 사용자 지정 세션 상태 저장소에 저장하도록 세션 상태를 구성할 수도 있습니다.

최선의 코딩 및 구성 방법을 따르면 응용 프로그램의 보안을 향상시킬 수 있지만 Microsoft Windows 및 IIS(인터넷 정보 서비스)용 최신 보안 패치를 비롯해 Microsoft SQL Server, Active Directory 및 응용 프로그램의 다른 데이터 소스를 위한 모든 패치를 사용하여 응용 프로그램 서버를 항상 최신 상태로 유지하는 것도 중요합니다.

안전한 코드 작성 및 응용 프로그램 보안을 위한 최선의 방법에 대해서는 Michael Howard 및 David LeBlanc가 공동으로 저술한 책인 Writing Secure Code와 Microsoft Patterns and Practices(http://www.microsoft.com/resources/practices/default.mspx)에서 제공하는 지침을 참조하십시오.

세션 상태 기능은 기본적으로 활성화되어 있습니다. 기본 구성 설정은 가장 안전한 값으로 설정되지만 응용 프로그램에 필요하지 않으면 세션 상태를 비활성화해야 합니다. 세션 상태 구성 설정 및 해당 기본값에 대한 자세한 내용은 sessionState 요소(ASP.NET 설정 스키마)를 참조하십시오.

구성 값 보안

응용 프로그램의 구성 파일에 중요한 정보를 저장할 때는 보호되는 구성을 사용하여 중요한 값을 암호화해야 합니다. 특히 중요한 정보로는 machineKey 구성 요소에 저장되는 암호화 키와 connectionStrings 구성 요소에 저장되는 데이터 소스 연결 문자열이 있습니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

연결 문자열

앞에서 설명한 것처럼 SQL Server, 세션 상태 서비스 또는 다른 데이터 소스를 실행하는 컴퓨터에 대한 연결 문자열에 저장된 중요한 정보는 안전하게 보호해야 합니다. 데이터 서버의 연결을 안전하게 유지하려면 보호되는 구성을 사용하여 구성의 연결 문자열 정보를 암호화하는 것이 좋습니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.

통합 보안을 사용하여 SQL Server에 연결

연결 문자열이 손상되고 사용자 ID와 암호가 노출되지 않도록 하려면 통합 보안을 사용하여 SQL Server를 실행하는 컴퓨터에 연결해야 합니다. 연결에 통합 보안을 사용하도록 지정하여 SQL Server를 실행하는 컴퓨터에 연결하면 세션 상태 기능에 프로세스 ID가 표시됩니다. 응용 프로그램 풀과 같이 ASP.NET을 실행하는 프로세스 ID는 기본 프로세스 계정이거나 제한된 사용자 계정이어야 합니다. 자세한 내용은 ASP.NET 가장세션 상태 모드를 참조하십시오.

응용 프로그램 및 데이터를 보호할 때는 세션 식별자가 네트워크를 통해 원하지 않는 소스에 노출되거나 응용 프로그램의 정보 누출에서 사용되지 않도록 해야 합니다. 다음 권장 사항을 통해 세션 식별자의 보안을 향상시킬 수 있습니다.

  • 응용 프로그램을 SSL(Secure Sockets Layer)로 보호합니다.

  • 세션 Timeout에 대해 작은 값을 지정합니다. 또한 클라이언트 스크립트를 사용하여 세션 제한 시간과 길이가 같은 클라이언트에 대해 리디렉션을 적용하거나 다음 예제처럼 AddHeader 메서드를 사용하여 새로 고침 머리글을 추가하는 방법을 고려합니다.

    Response.AddHeader("Refresh", Session.Timeout & ";URL=Logoff.htm"
    Response.AddHeader("Refresh", Session.Timeout + ";URL=Logoff.htm";
    
  • 쿠키가 없는 세션 사용을 피합니다. 쿠키가 없는 세션을 지정하면 세션 ID가 포함된 링크를 전자 메일로 보내거나 책갈피로 삽입하거나 저장하지 못하도록 사용자에게 경고 메시지가 표시됩니다.

  • AutoDetectUseDeviceProfile을 쿠키 모드로 지정하지 않습니다.

  • HttpSessionState.Abandon 메서드를 호출해야 하는 지점에서 사용자가 로그아웃하도록 합니다. 사용자가 로그아웃한 후에는 브라우저를 닫도록 경고 메시지를 표시합니다.

  • 쿠키가 없는 세션을 사용하는 경우 만료된 세션 식별자가 지정되면 항상 새로운 세션을 시작하도록 regenerateExpiredSessionIDtrue로 구성합니다.

중요한 데이터를 사용하는 응용 프로그램 페이지는 SSL(Secure Sockets Layer) 같은 표준 웹 보안 메커니즘을 사용하고 사용자가 로그인해야만 개인 정보 업데이트 또는 계정 삭제 같은 중요한 작업을 수행할 수 있도록 보호해야 합니다.

또한 페이지에 암호 및 사용자 이름 같은 중요한 기능 데이터가 일반 텍스트로 노출되어서는 안 됩니다. 이러한 정보를 표시하는 페이지는 SSL을 사용하고 인증된 사용자만 사용할 수 있도록 해야 합니다.

예외

중요한 정보가 원하지 않는 소스로 노출되지 않도록 하려면 응용 프로그램에서 자세한 오류 메시지를 표시하지 않거나 클라이언트가 웹 서버일 경우에만 자세한 오류 메시지를 표시하도록 구성합니다. 자세한 내용은 customErrors 요소(ASP.NET 설정 스키마)를 참조하십시오.

이벤트 로그

서버에서 Windows Server 2003을 실행 중인 경우 이벤트 로그를 보호하고 이벤트 로그의 크기, 보존 등과 관련된 매개 변수를 설정하여 간접적인 서비스 거부 공격을 막음으로써 응용 프로그램의 보안을 향상시킬 수 있습니다.

사용자 지정 세션 상태 저장소 공급자를 만들 때는 최선의 보안 방법에 따라 데이터베이스 작업을 수행할 때 SQL 명령 삽입 등의 공격을 피해야 합니다. 또한 사용자 지정 세션 상태 저장소 공급자를 사용할 때는 최선의 보안 방법으로 공급자를 검토했는지 확인합니다.

표시: