티스토리 뷰



[.NET/ASP.NET] - 실전 ASP.NET Session [1] - 쿠키를 이용한 상태관리와 위험성
[.NET/ASP.NET] - 실전 ASP.NET Session [2] - 상태관리의 종류
[.NET/ASP.NET] - 실전 ASP.NET Session [3] - 다양한 세션 관리 방법
[.NET/ASP.NET] - 실전 ASP.NET Session [4] - 세션상태 마이그레이션

 

 

ASP.NET 은 다양한 세션 관리 방법을 제공하여 줍니다. 서버의 자원은 제한적이기 때문에 In-of-process 방식이 아닌, Out-of-process 의 세션 관리 방법이 필요하다고 이전 시간에 말한바 있습니다. 이런 이유 이외에도, Worker Process 에 의해 세션이 관리된다면 프로세서가 어떤 오류로 인해 종료가 되면 세션도 함께 증발해 버리는 경우도 생깁니다. 이유가 가져다 대면 많지만, 어떤 세션 관리 방법이 있는지 알아보고, 자신의 사이트나 회사의 사이트에 어떻게 적용할 것인지 한번 생각해 봐도 좋을 내용이 될 것입니다.

 

1.    ASP.NET Session State Service

 

ASP.NET Session State Service 라는 서비스가 별도로 존재합니다. 이 서비스는 관리도구->서비스를 통해 프로세서를 시작/종료 할 수 있고, 디폴트로 시작 안함입니다. 이 프로세서는 ASP.NET Worker Process 와는 별도의 프로세서이기 때문에, IIS 가 중단이 되거나 오동작으로 인해 세션이 증발하는 경우는 없습니다.

 

 [그림1] 서비스의 ASP.NET Session State Service

 

위의 [그림1] 에서 시작버튼을 누르게 되면 ASP.NET Session State Service 를 시작할 수 있습니다.

 

우선 여기서, 주의할 부분이 있습니다. ASP.NET Session State Service 를 사용하기 위해서는 processModel 섹션의 webGarden 속성은 반드시 false 이여야 합니다. 갑자기 튀어나온, webGarden 속성은 또 뭐죠?? 이 속성은 다중 프로세서 CPU 에만 적용되는 항목인데 다중 프로세서에서 Worker Process 를 사용할 코어(Core)의 선호도를 지정할 수 있습니다. 만약, ASP.NET Session State Service processModel webGarden 을 함께 설정한다면, 가령 A 라는 세션을 다른 Worker Process 에서 처리를 하는 교착현상(?)이 발생할 수 있습니다.

 

processModel webGarden 참고

<processModel> 구성 문서에 틀린 webGarden 설명과 필드가 포함되어 있다

 

 

webGarden 의 속성을 임의로 바꾸고자 한다면, web.config 에서는 바꿀 수 없습니다. 왜냐하면, machine.config

 

<section name="processModel" type="System.Web.Configuration.ProcessModelSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineOnly" allowLocation="false"/>

 

allowDefinition="MachineOnly" 로 설정되어 있습니다. 이 값을 allowDefinition="MachineToApplication" 으로 변경하면, 웹 응용 프로그램의 web.config 에서 processModel 섹션을 재정의 할 수 있습니다.

 

다시 원점으로 돌아와서, 세선 관리를 ASP.NET Session State Service 로 지정하는 방법은 굉장히 간단합니다.

다음과 같이 web.config 를 변경하면, 세션 상태 관리를 ASP.NET Session State Service 로 지정할 수 있습니다.

 

<system.web>

       <sessionState mode="StateServer"

                      stateConnectionString="tcpip=localhost:42424">

</sessionState>

 

tcpip address IP 도 가능하며, 도메인으로도 가능합니다. 그리고 뒤의 42424 는 디폴트로 지정된 ASP.NET Session State Service Port 입니다. 만약, 로컬 서버가 아닌 원격 서버의 ASP.NET Session State Service 를 사용하기 위해서는 방화벽의 42424 포트를 허용해 주시면 됩니다.

 

ASP.NET Session State Service 가 디폴트로 사용하는 42424 포트를 변경해 줄 필요도 생길 수 있습니다. 포트를 변경해 주는 UI 는 제공되지 않지만, 레지스트리를 변경하여 포트 번호를 바꿀 수 있습니다.

 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters

 

Port= a5b8 (42424)

 

Port 의 값을 16진수로 대응되는 값을 변경하시고, 반드시 ASP.NET Session State Service 재시작 하시면 변경된 포트를 통해 Service 를 이용할 수 있습니다.

 

간혹, ASP.NET Session State Service 를 시작하였음에도 동작하지 않을 경우, 위의 레지스트리 위치의 값을 확인해 보셔야 합니다.

 

AllowRemoteConnection=1

 

 

값이 1 이 아닌경우, 1로 변경하면 정상적으로 ASP.NET Session State Service 를 이용할 수 있습니다.

 

 

2.    SQL Server

 

SQL Server 를 이용하여 데이터베이스를 통해 세션 상태를 유지합니다. 물리적인 디스크를 통해 I/O 가 일어나므로 가장 느린 상태 관리 방법이지만, 세션의 휘발성의 염려가 없는 가장 안정된 서비스를 제공하는 방법 이기도 합니다.

 

우선, 세션으로 사용할 데이터베이스와 그 외 부수적인(테이블/저장 프로시져) 등을 생성해야 하는데, Visual Studio Command Prompt 를 통해 간단하게 생성할 수 있습니다.

 

 

C:\> aspnet_regsql.exe -S <MachineName> -E -ssadd -sstype p

 

 

[그림2] aspnet_regsql.exe 가 생성한 데이터베이스

 

위 명령을 수행하면 [그림2] 와 같이 ASPState 라는 데이터베이스가 생성이 됩니다. 만약 위의 명령줄에서

 

–sstype p

 

를 제거하면 tempdb 에 테이블이 생성 되어 집니다.

 

ASP.NET 1.1 에서 SQL Server 데이터베이스 생성하는 방법

HOWTO: 영구적으로 SQL Server 세션 상태를 관리할 있도록 ASP.NET 구성

 

데이터베이스가 정상적으로 만들어 졌다면, 다음과 같이 web.config 를 변경하여 상태관리 방법을 변경할 수 있습니다.

 

<system.web>

       <sessionState mode="SQLServer"

                      sqlConnectionString="server=localhost; uid=*******; pwd=********* ">

       </sessionState>

 

이전 포스팅에서 언급한 바, Out-of-process 를 통해 세션 상태를 관리하게 되면 Session 개체에 반드시 Serializable(직렬화할 수 있는) 개체만 Session 에 저장할 수 있습니다.

 

3.    구성 섹션을 암호화

 

본 섹션은 Out-of-process 와 관련이 없는 부분이지만, 경우에 따라 민감할 수 있습니다. 왜냐하면, web.config 를 통해 Server Farm 의 접속 정보가 잠재적으로 노출되어 있기 때문입니다. 서버의 .config 가 기본적으로 System.Web.HttpForbiddenHandler 로 지정되어 있어, 외부의 사용자는 web.config 의 내용을 알 수 없지만, 외부 개발자나 시스템 담당자 외에 공개가 되어서는 안되는 경우 구성 섹션을 암호화 하는 방법이 있습니다.

 

이 부분에 대해서는 아래의 MSDN 링크를 통해 보시면 됩니다.

Web.config 암호화

연습: RSA 컨테이너 만들기 내보내기

 

 

너무 포스팅을 쉬었는지 감을 조금 잃어버렸네요~ ^^; 다음 포스팅은 세션상태를 마이그레이션 하는 방법에 대해 보도록 할 예정입니다. MSSQL 로 제한된 세션 상태를 Oracle 에서 이용하도록 변경이 가능하며, 모든 로직을 감추고 분산처리 하는 방법, 이것을 활용한 SSO 시스템의 전반적인 설계까지 알아보도록 할 예정입니다.



댓글