Session 이야기

ASP.NET 2008. 10. 22. 14:07

ASP.NET 세션 상태는 세션 데이터에 대한 여러 가지 저장소 옵션을 지원합니다. 각 옵션은 SessionStateMode 열거형의 값에 의해 식별됩니다. 다음 목록에서는 사용할 수 있는 세션 상태 모드를 설명합니다.

응용 프로그램 Web.config 파일에 있는 sessionState 요소의 mode 특성에 SessionStateMode 열거형 값을 할당하면 ASP.NET 세션 상태에서 사용할 모드를 지정할 수 있습니다. InProcOff 이외의 모드를 사용하려면 이 항목의 뒷부분에 나오는 연결 문자열 값과 같은 추가 매개 변수가 필요합니다. System.Web.SessionState.HttpSessionState.Mode 속성 값에 액세스하면 현재 선택한 세션 상태를 볼 수 있습니다.

InProc 모드: 웹 서버의 메모리에 세션 상태를 저장합니다. 기본값입니다

In-process 모드는 기본 세션 상태 모드이며 InProc SessionStateMode 열거형 값을 사용하여 지정합니다. In-process 모드에서는 로컬 웹 서버의 메모리에 세션 상태 값과 변수를 저장합니다. 이 모드는 Session_OnEnd 이벤트를 지원하는 유일한 모드입니다. Session_OnEnd 이벤트에 대한 자세한 내용은 세션 상태 이벤트를 참조하십시오.

Caution note주의
응용 프로그램 Web.config 파일의 processModel 요소에서 webGarden 특성을 true로 설정하여 웹 가든 모드를 사용하는 경우 InProc 세션 상태 모드를 사용하지 마십시오. 이 모드를 사용하면 같은 세션의 다른 요청을 다른 작업자 프로세스에서 처리하는 경우 데이터가 손실될 수 있습니다.

StateServer 모드 : ASP.NET 상태 서비스라는 별도의 프로세스에 세션 상태를 저장합니다. 이 모드에서는 웹 응용 프로그램이 다시 시작되는 경우 세션 상태가 유지되며 웹 팜의 여러 웹 서버에서 세션 상태를 사용할 수도 있습니다.

StateServer 모드를 사용하려면 먼저 ASP.NET 상태 서비스가 세션 저장소에 사용된 서버에서 실행되는지 확인해야 합니다. ASP.NET 상태 서비스는 ASP.NET 및 .NET Framework가 설치될 때 서비스로 설치됩니다. ASP.Net 상태 서비스는 다음 위치에 설치됩니다.

systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

StateServer 모드를 사용하도록 ASP.NET 응용 프로그램을 구성하려면 응용 프로그램 Web.config 파일에서 다음을 수행합니다.

  • sessionState 요소의 mode 특성을 StateServer로 설정합니다.

  • stateConnectionString 특성을 tcpip=serverName:42424로 설정합니다.

    Note참고

    StateServer 모드를 사용할 때 응용 프로그램의 보안을 강화하려면 구성 파일의 sessionState 섹션을 암호화하여 stateConnectionString 값을 보호하는 것이 좋습니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화을 참조하십시오.

다음 예제에서는 SampleStateServer라는 원격 컴퓨터에 세션 상태가 저장되는 StateServer 모드의 구성 설정을 보여 줍니다.

<configuration>  <system.web>    <sessionState mode="StateServer"      stateConnectionString="tcpip=SampleStateServer:42424"      cook!eless="false"      timeout="20"/>  </system.web></configuration>
Note참고

세션 상태에 저장된 개체가 serialize 가능해야만 모드가 StateServer로 설정됩니다. Serialize 가능 개체에 대한 자세한 내용은 SerializableAttribute클래스를 참조하십시오.

웹 팜에서 StateServer 모드를 사용하려면 웹 팜에 속하는 모든 응용 프로그램에 대해 웹 구성의 machineKey 요소에 같은 암호화 키를 지정해야 합니다. 시스템 키를 만드는 방법에 대한 자세한 내용은 http://support.microsoft.com의 Microsoft 기술 자료에서 문서 313091, "Visual Basic .Net을 사용하여 Forms 인증에서 사용할 키를 만드는 방법"을 참조하십시오.

SQLServer 모드 : SQL Server 데이터베이스에 세션 상태를 저장합니다. 이 모드를 사용하면 웹 응용 프로그램을 다시 시작해도 세션 상태가 보존되며 웹 팜에 있는 여러 웹 서버에서 세션 상태를 사용할 수 있게 됩니다.

Note참고

세션 상태에 저장된 개체가 serialize 가능해야만 모드가 SQL Server일 수 있습니다. Serialize 가능 개체에 대한 자세한 내용은 SerializableAttribute 클래스를 참조하십시오.

SQLServer 모드를 사용하려면 먼저 SQL Server에 ASP.NET 세션 상태 데이터베이스가 설치되어 있는지 확인해야 합니다. 이 항목의 뒷부분에서 설명된 대로 Aspnet_regsql.exe 도구를 사용하여 ASP.NET 세션 상태 데이터베이스를 설치할 수 있습니다.

SQLServer 모드를 사용하도록 ASP.NET 응용 프로그램을 구성하려면 응용 프로그램 Web.config 파일에서 다음을 수행합니다.

  • sessionState 요소의 mode 특성을 SQLServer로 설정합니다.

  • sqlConnectionString 특성을 SQL Server 데이터베이스에 대한 연결 문자열로 설정합니다.

    Note참고

    SQLServer 모드를 사용할 때 응용 프로그램의 보안을 강화하려면 구성 파일의 sessionState 섹션을 암호화하여 sqlConnectionString 값을 보호하는 것이 좋습니다. 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화을 참조하십시오.

다음 예제에서는 "SampleSqlServer"라는 SQL Server에 세션 상태가 저장되는 SQLServer 모드의 구성 설정을 보여 줍니다.

<configuration>  <system.web>    <sessionState mode="SQLServer"      sqlConnectionString="Integrated Security=SSPI;data         source=SampleSqlServer;" />  </system.web></configuration>
Note참고

구성 파일에서 sessionState 요소의 sqlConnectionString 특성을 사용하여 SQL Server와의 신뢰된 연결을 지정하면 SessionStateModule은 SQL Server 통합 보안을 사용하여 SQL Server에 연결합니다. ASP.NET 프로세스 ID나 identity 구성 요소에 지정된 사용자 자격 증명(있는 경우)을 사용하여 연결합니다. <identity impersonate="true" />를 지정하고 sessionState 구성 요소의 useHostingIdentity 특성을 false로 설정하면 IIS의 가장된 ID를 대신 사용하도록 지정할 수도 있습니다. ASP.NET 프로세스 ID에 대한 자세한 내용은 ASP.NET 프로세스 ID 구성ASP.NET 가장을 참조하십시오.

웹 팜에 SQLServer 모드를 구성하려면 각 웹 서버의 구성 파일에서 sessionState 요소의 sqlConnectionString 특성이 같은 SQL Server 데이터베이스를 가리키도록 설정합니다. SQL Server 데이터베이스의 세션 상태를 공유하는 모든 웹 서버에서 IIS 메타베이스에 있는 ASP.NET 응용 프로그램 경로가 같아야 합니다. 응용 프로그램 경로가 서버 간에 서로 다른 경우 이 문제를 해결하는 단계에 대한 자세한 내용은 http://support.microsoft.com의 Microsoft 기술 자료에서 문서 325056, "PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode"를 참조하십시오.

Aspnet_regsql.exe 도구를 사용한 세션 상태 데이터베이스 설치

SQL Server에 세션 상태 데이터베이스를 설치하려면 웹 서버의 systemroot\Microsoft.NET\Framework\versionNumber 폴더에 있는 Aspnet_regsql.exe 도구를 실행합니다. 이 명령에 다음 정보를 지정합니다.

  • -S 옵션을 사용하여 SQL Server 인스턴스 이름을 지정합니다.

  • SQL Server에 데이터베이스를 만들 수 있는 권한을 가진 계정의 로그온 자격 증명을 지정합니다. -E 옵션을 사용하여 현재 로그온한 사용자를 사용하거나, -U 옵션을 사용하여 사용자 ID를 지정하고 -P 옵션을 사용하여 암호를 지정합니다.

  • -ssadd 명령줄 옵션을 사용하여 세션 상태 데이터베이스를 추가합니다.

    기본적으로 Aspnet_regsql.exe 도구를 사용하여 SQL Server Express Edition에 세션 상태 데이터베이스를 설치할 수 없습니다. Aspnet_regsql.exe 도구를 사용하여 SQL Server Express Edition 데이터베이스를 설치하려면 먼저 다음과 같이 T-SQL 명령을 사용하여 Agent XPs SQL Server 옵션을 설정해야 합니다.

    EXECUTE sp_configure 'show advanced options', 1RECONFIGURE WITH OVERRIDEGOEXECUTE sp_configure 'Agent XPs', 1RECONFIGURE WITH OVERRIDEGOEXECUTE sp_configure 'show advanced options', 0RECONFIGURE WITH OVERRIDEGO

    Agent XPs 옵션을 사용할 수 없는 SQL Server Express Edition의 모든 인스턴스에 대해 이 T-SQL 명령을 실행해야 합니다.

기본적으로 Aspnet_regsql.exe 도구는 SQLServer 모드를 지원하는 저장 프로시저가 포함된 ASPState라는 데이터베이스를 만듭니다. 세션 데이터 자체는 기본적으로 tempdb 데이터베이스에 저장됩니다. -sstype 옵션을 사용하여 세션 데이터의 저장소 위치를 변경할 수도 있습니다. 다음 표에서는 -sstype 옵션에 사용할 수 있는 값을 지정합니다.

옵션설명

t

SQL Server tempdb 데이터베이스에 세션 데이터를 저장합니다. 이 옵션이 기본값입니다. tempdb 데이터베이스에 세션 데이터를 저장하는 경우 SQL Server가 다시 시작되면 세션 데이터가 손실됩니다.

p

tempdb 데이터베이스 대신 ASPState 데이터베이스에 세션 데이터를 저장합니다.

c

사용자 지정 데이터베이스에 세션 데이터를 저장합니다. c 옵션을 지정하는 경우에는 -d 옵션을 사용하여 사용자 지정 데이터베이스 이름도 포함해야 합니다.

예를 들어, 다음 명령은 "SampleSqlServer"라는 SQL Server 인스턴스에 ASPState라는 데이터베이스를 만들고 세션 데이터도 ASPState 데이터베이스에 저장되도록 지정합니다.

aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p

Note참고

ASP.NET 1.0 또는 ASP.NET 1.1을 실행하는 경우 영구 SQL Server 데이터베이스에 세션 상태를 저장하도록 ASP.NET을 구성하는 데 Aspnet_regsql.exe 도구를 사용할 수 없습니다. 하지만 영구 데이터베이스에 세션 상태를 저장하는 스크립트를 사용할 수 있습니다. 자세한 내용은 http://support.microsoft.com에서 Microsoft 기술 자료 문서 311209, "HOWTO: 영구적으로 SQL Server 세션 상태를 관리할 수 있도록 ASP.NET 구성"을 참조하십시오. 또는 ASP.NET 1.0이나 ASP.NET 1.1이 실행되는 웹 서버에서 ASP.NET 2.0 세션 상태 스키마가 설치되어 있는 SQL Server로 영구 세션 상태를 디렉션할 수도 있습니다.

SQLServer 모드에서는 SQL Server를 실행하는 여러 대의 컴퓨터가 장애 조치 클러스터로 작동하도록 구성할 수 있습니다. 장애 조치 클러스터란 SQL Server를 실행하는 두 대 이상의 동일한 컴퓨터로 단일 데이터베이스의 데이터를 저장합니다. SQL Server를 실행하는 컴퓨터 중 하나에서 오류가 발생하면 클러스터의 또 다른 서버에서 요청을 넘겨받아 처리하기 때문에 세션 데이터가 손실되지 않습니다. 장애 조치 클러스터용으로 SQL Server 모드를 구성하려면 Aspnet_regsql.exe 도구를 실행할 때 -sstype p를 지정해야 합니다. 이렇게 하면 tempdb 데이터베이스 대신 ASPState 데이터베이스에 세션 데이터가 저장됩니다. SQL Server 클러스터에서는 tempdb 데이터베이스에 세션 상태를 저장하는 기능이 지원되지 않습니다. 장애 조치 클러스터용으로 SQL Server 모드를 설정하는 방법에 대한 자세한 내용은 http://support.microsoft.com에서 Microsoft 기술 문서 323262, "How to use ASP.NET session state SQL Server Mode in a failover cluster"를 참조하십시오.

Custom 모드 : 사용자 지정 세션 상태 저장소 공급자를 사용하여 세션 상태 데이터를 저장할 경우 지정합니다. CustomMode로 ASP.NET 응용 프로그램을 구성하는 경우에는 sessionState 구성 요소의 providers 하위 요소를 사용하여 세션 상태 저장소 공급자 형식을 지정해야 합니다. add 하위 요소를 사용하여 공급자 형식을 지정하고 공급자의 형식 이름을 지정하는 type 특성과 공급자 인스턴스 이름을 지정하는 name 특성을 모두 사용합니다. 그런 다음 sessionState 요소의 customProvider 특성에 공급자 인스턴스 이름을 지정합니다. 그러면 해당 공급자 인스턴스를 사용하여 세션 데이터를 저장 및 검색하도록 ASP.NET 세션 상태를 구성합니다.

다음 예제에서는 ASP.NET 세션 상태에서 사용자 지정 세션 상태 저장소 공급자를 사용하도록 지정하는 Web.config 파일의 요소를 보여 줍니다.

<configuration>  <connectionStrings>    <add name="OdbcSessionServices"       connectionString="DSN=SessionState;" />  </connectionStrings>  <system.web>    <sessionState       mode="Custom"      customProvider="OdbcSessionProvider">      <providers>        <add name="OdbcSessionProvider"          type="Samples.AspNet.Session.OdbcSessionStateStore"          connectionStringName="OdbcSessionServices"           writeExceptionsToEventLog="false" />      </providers>    </sessionState>  </system.web></configuration>

사용자 지정 세션 상태 저장소 공급자에 대한 자세한 내용은 세션 상태 저장소 공급자 구현을 참조하십시오.

Note참고

사용자 지정 세션 상태 저장소 공급자는 SQL Server와 같이 보안된 리소스에 액세스할 때 ASP.NET 프로세스 ID나 identity 구성 요소에 지정된 사용자 자격 증명(있는 경우)을 사용합니다. <identity impersonate="true" />를 지정하고 sessionState 구성 요소의 useHostingIdentity 특성을 false로 설정하면 IIS의 가장된 ID를 대신 사용하도록 지정할 수도 있습니다. ASP.NET 프로세스 ID에 대한 자세한 내용은 ASP.NET 프로세스 ID 구성ASP.NET 가장을 참조하십시오.

Posted by 퓨전마법사
,