ASP.NET 에서 아래와 같은 세션 MODE 를 제공해 줍니다.
모든 세션 상태에 대해 Session 제공자가 있습니다. 아래와 같은 다이어그램은 이들이 어떻게 연관되어 있는지 보여줄것입니다.
Fig : Session State 아키텍쳐
우리는 session state 제공자를 선택한 session state 를 기반으로 session state 제공자를 선택할 수 있습니다.
ASP.NET 은 SESSON ID 기반인 어떤 정보를 요청할때, 세션 상태 그리고 이와 일치한 제공자는 사용자를 기반으로 한 적합한 정보를 보내는데 책임을 가지고 있습니다. 아래의 테이블을 보면 Session Mode 에 대한 제공자 이름이 있습니다.
Session State Mode | State Provider |
InProc | In-Memory Object |
StateServer | Aspnet_state.exe |
SQLServer | DataBase |
Custom | CustomProvider |
이것들 이외에 또 다른 모드인 "Off" 가 있습니다. 만약에 세션에서 이 기능을 선택하면, 모든 어플리케이션에서 모든 페이지를 사용할 수 없게 됩니다. 그러나 우리의 목적은 세션을 사용하는 것이며, 그래서 우리는 4가지의 Session State Mode 를 살펴보고 있습니다.
만약에 session state 에 대해 고려한다면, 이는 웹어플리케이션에 어울리는 모든 설정을 의미합니다. Session State, 이는 자체적으로 봐도 매우 큰 부분이며, 이는 세션 환경에 대한 모든것을 말합니다. web.config 뿐만 아니라 코드 바하인드까지 말이죠. web.config 에서 <SessionState> 요소로 session 환경 설정을 사용합니다. 또다른 Mode 가 있는데, Timeout, StateConnecionString, Custom provider 등이 있습니다. connection 문자열 부분에 대한 각각에 대해 말해볼까 합니다.
Session Mode 를 설명하기 전에 Session Event 를 살펴볼 까 합니다.
ASP.NET 에 가능한 SESSION EVENT 의 2개 형식이 있습니다.
어플리케이션의 global.asax 파일에서 해당 이벤트 둘다 핸들링 할 수 있습니다. 새로운 세션은 session_start 이벤트 발생되어 초기화 되며, Session_End 이벤트 발생으로 세션이 해제 및 만료가 됩니다..
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
}
세션모드에는 총 4가지가 존재합니다. InProc, StateServer, Sql Server, Custom Session 이렇게 존재합니다.
하나씩 알아가보도록 하죠.
ASP.NET 에서 SESSION MODE 에 대하여 이미 이야기를 하였지만, ASP.NET SESSION 에서 아래와 같은 다른 TYPE 의 MODE 들이 있습니다.
만약에 Mode = "off" 가 web.config 에 설정되이 있으면, session 은 모든 어플리케이션에서 사용할 수 없습니다. 기술하게 되면...
ASP.NET 에서 이는 기본 SESSION MODE 입니다. 이는 SESSION 정보가 Application Domain 에 저장되어 있습니다. 이는 ASP.NET 어플리케이션 성능상 기본이 되는 최상의 SESSION MODE 입니다.
대신이 이에 대한 단점이 있습니다. 이는 만약에 SERVER 가 재시작을 하게 되면 데이터를 잃어버리게 된다는 것입니다. InProc 세션 mode 에 대한 약간의 장단점이 있습니다. 다시 이러한 요점을 다시 이야기할 까 합니다.
InProc Mode session 데이터는 이전에 말씀 드렸듯이 Application Domain 에 저장이 됩니다. 그래서 매우 유용합니다.
그래서 InProc 세션 모드는 Application Domain 에서 memory 객체에 session 데이터를 저장합니다. 이는 application pool 에서 worker process 에 의해 핸들링 됩니다. 그래서 만약에 server 가 재시작하게 되면, session 데이터를 잃어 버리게 될것입니다. 만약에 클라이언트가 데이터를 요청하면, state provider 가 in-memory 에서 데이터를 읽고 이를 클라이언트에 반환해 줍니다. web.config 에서 session mode 를 설정하며, 여기에 Timeout 을 설정할 수 있습니다.
해당 Session TimeOut 설정을 30초로 활성화 하였습니다. 이 또한 Code Behind 단 에서 설정을 할 수도 있습니다.
Session.TimeOut=30;
ASP.NET 의 Session 이벤트에는 두 가지 타입이 있습니다. 여기에는 Session_Start() 그리고 Session_End() 가 존재합니다. 이는 오직 Session_End() 이벤트를 제공하는 유일한 모드는 'InProc Mode session' 뿐입니다. 만약 session 이 timeout 시점이 넘게 되면 Session_End() 를 호출하게 됩니다. InProc Session State 에 대한 일반적인 flow 는 아래와 같습니다.
지금 Session_End() 메소드가 호출될때, 이는 Session 의 TimeOut 에 의존합니다. 이는 매우 빠른 매카니즘입니다. 왜냐면 어떤 직렬화에 대한 발생도 없으며, data 는 동일한 application domain 에서 머무를 것입니다.
InProc Session Mode 는 ASP.NET 의 기본 SESSION MODE 입니다. 이는 작은 웹사이트를 운영 및 사용자가 매우 적을시에 매우 도움이 될것입니다. Web Garden 의 경우 InProc 는 피해야 합니다. (이 부분에 대해서는 차후에 말씀드릴 예정)
장점 :
단점:
InProc Session 은 매우 빠르며, 공통이고 기본 매카니즘입니다. 그리고 만약 제약사항이 있습니다.
위의 논의에 따라 InProc은 매우 빠른 세션 저장 메커니즘이지만 소규모 웹 애플리케이션에만 적합하다는 결론을 내릴 수 있습니다. 서버를 다시 시작하거나 애플리케이션 도메인이 recycled(재활용)되면 InProc 세션 데이터가 손실됩니다. 또한 Web Farm 이나 Web Garden 시나리오에 적합하지 않습니다.
이제 이러한 문제를 극복하기 위해 사용할 수 있는 다른 옵션을 살펴보겠습니다.
먼저 StateServer 모드가 있습니다.
✅✅✅✅ 여기서 중요!! StateServer 알아두면 좋으므로 집중하자 !! ✅✅✅✅
StateServer Session mode 는 out-Proc 라고 불리우며, stand-alone 윈도우서비스를 사용합니다. 이는 iis 의 독립적이며, 분리된 서버에서 운영할 수 있습니다. 이 session state 는 전체적으로 aspnet_state.exe 파일에 의해 관리됩니다.
이 서버는 동일한 시스템상에서 운영합니다. 그러나 이는 웹 어플리케이션이 실행할 주요 application domain 의 바깥쪽에 있습니다. 만약에 asp.net 프로세스를 재시작해도 웹어플리케이션은 살아있습니다. 이러한 접근은 직렬화 및 역직렬화에 대한 오버해드로 인해 여러가지 단점을 가지고 있습니다. 또한 데이터 접근하는 비용이 또한 점차 증가됩니다.
이를 Out-Proc 세션 모드라고도 합니다. StateServer는 IIS와 독립적이며 별도의 서버에서도 실행할 수 있는 독립 실행형 Windows 서비스를 사용합니다. 이 세션 상태는 전적으로 aspnet_state.exe에서 관리합니다. 이 서버는 동일한 시스템에서 실행될 수 있지만 웹 애플리케이션이 실행되는 기본 애플리케이션 도메인 외부에 있습니다. 즉, ASP.NET 프로세스를 다시 시작하면 세션 데이터가 계속 유지됩니다. 이 접근 방식은 관련된 직렬화 및 역직렬화(serialization and de-serialization) 의 오버헤드로 인해 몇 가지 단점이 있으며 사용자가 세션 데이터를 검색할 때마다 응용 프로그램이 다른 프로세스를 참조해야 하기 때문에 데이터 액세스 비용도 증가합니다. (오버헤드 및 비용 증가)
StateServer 모드에서 세션 데이터는 IIS와 독립적인 별도의 서버에 저장되며aspnet_state.exe에 의해 처리됩니다 .이 프로세스는 Windows 서비스로 실행됩니다.Windows MMC 또는 명령 프롬프트에서 이 서비스를 시작할 수 있습니다. (ASP.NET State Service 서비스)
시작 유형을 Automatic(자동) 으로 변경하여 설정합니다. (기본은 수동임)
명령 프롬프트에서 "net start aspnet_state"를 입력하기만 하면 됩니다. 기본적으로 이 서비스는 TCP 포트 42424를 수신하지만 아래 그림과 같이 레지스트리 편집기에서 포트를 변경할 수 있습니다.
이제 StateServer 설정에 대한 web.config 구성을 살펴보죠. State Server 설정에 대해서 stateConnectionString 을 기술해야 합니다. 이는 ASP.NET State Server 를 실행 중인 시스템을 식별합니다. 기본적으로 stateConnectionString 은 IP 127.0.0.1(localhost) 및 포트 42424를 사용했습니다.
timeout 속성은 사용자가 웹 서버에 대한 연결을 유지할 수 있는 시간(분단위)입니다. 기본은 20분 입니다.
stateNetworkTimeout은 웹서버와 stateserver 간의 연결이 유휴 상태일 수 있는 시간(초단위)입니다. 기본값은 10초입니다.
<sessionState mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
timeout="20"
compressionEnabled="true" />
동일한 PC에서 실행되는 StateServer의 경우 IP 주소 127.0.0.1 또는 localhost를 사용할 수 있다는 점에 유의해야 합니다. 외부 서버의 경우 필요한 IP 주소와 포트를 지정합니다. 또한 StateServer 호스팅 서버의 모든 방화벽에 대해 포트가 열려 있는지 확인해야 합니다. StateServer 에 액세스하기 위해 원격 웹 서버에 대한 액세스를 허용하려면 아래와 같이 레지스트리 설정이 값 1로 설정되어 있는지 확인해야 합니다.
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 위치에서 AllowRemoteConnection 의 기본값(0) 을 1로 치환합니다. 이는 원격지 연결을 허용해 주는것을 의미합니다. 외부 웹서버로 부터 StateServer 를 사용하고자 할 경우, 연결자를 통해 접근 시 원격지 연결 허용을 해서 사용할수 있도록 해줍니다.
참고로 아래 Port 는 기본값(42424) 이며, StateServer 의 포트를 변경하고자 할 경우 변경 선택해서 값을 수정해 주면 됩니다. 포트 연결이 잘 되는지 telnet 명령어를 통해 검증을 하면 됩니다.
StateServer를 사용하려면 저장하려는 객체를 직렬화해야 하고 검색할 때 역직렬화해야 합니다. 아래에 예를 들어 설명했습니다.
StateServer는 또한 모든 웹 서버가 동일한 machineKey 값을 사용하도록 요구합니다. machineKey는 ViewState를 해독하는 데 사용되며 들어오는 데이터가 웹 서버 간에 번갈아 가면서 forms authentication cookie 를 형성합니다. 예를 들어 web.config에서 자동으로 생성된 다음, machinekey 는 다음과 같이 static key 로 대체되어야 합니다.
기존 : generated machine key
<machineKey validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"/>
현재 : static key 로 대체
<system.web>
<machineKey
validationKey='546BDC5ACBB3FF06721773CE3414AD26F9DE00A2188A3E03403115CF96FA85C78CA6808C02714B27E7DEFBFBAC1A49DACF722608953E1CEA407C21DB330EECE2'
decryptionKey='5C24B005CF68E6536FCE8040BFD79C27716AFB3620DF19E5'
validation='SHA1'/>
</system.web>
생성사이트 : http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx
웹 서버를 다시 시작할 때 불필요한 세션 데이터 손실을 방지하기 위해 StateServer 세션 모드를 사용합니다. StateServer는 aspnet_state.exe 프로세스에 의해 Windows 서비스로 유지됩니다. 이 프로세스는 모든 세션 데이터를 유지합니다. 그러나 StateServer 세션 모드에 데이터를 저장하기 전에 데이터를 직렬화해야 합니다.
위의 그림과 같이 클라이언트가 웹 서버에 요청을 보내면 웹 서버는 세션 데이터를 StateServer 에 저장합니다. StateServer는 현재 시스템이거나 다른 시스템일 수 있습니다. 그러나 IIS와는 완전히 독립적입니다. StateServer의 대상은 web.config stateConnectionString 설정에 따라 달라집니다. 127.0.0.1:42424로 설정하면 로컬 시스템 자체에 데이터가 저장됩니다. StateServer 대상을 변경하려면 IP를 변경하고 aspnet_state.exe가 해당 시스템에서 실행 중인지 확인해야 합니다. 그렇지 않으면 세션에 데이터를 저장하려고 시도하는 동안 다음 예외가 발생합니다.
세션에 개체를 저장할 때 직렬화해야 합니다. 해당 데이터는 State Provider를 사용하여 StateServer 시스템에 저장됩니다. 그리고 데이터를 검색할 때 State Provider는 데이터를 반환합니다. 전체 흐름은 아래 그림에 나와 있습니다.
다음은 StateServer 세션 모드를 사용하는 간단한 예입니다. 사용법을 쉽게 이해할 수 있도록 IIS에서 직접 이 샘플 웹 응용 프로그램을 만들었습니다.
1단계: Visual Studio > 파일 > 새로 만들기 > 웹 사이트를 엽니다. 위치를 HTTP로 선택하고 웹 애플리케이션을 생성합니다.
이제 IIS를 열면 웹 응용 프로그램의 이름으로 생성된 가상 디렉터리를 볼 수 있습니다. 제 경우에는 StateServer입니다.
2단계: roll 번호와 학생 이름을 사용하는 간단한 UI를 만듭니다. state server session 에 이름과 roll 번호를 저장합니다. 또한 StudentInfo 클래스를 만들었습니다. 이 클래스는 다음과 같습니다. 여기서 중요한 부분은 클래스에서 어트리뷰트에 [Serializable] 를 지정하여 "직렬화" 한 부분입니다.
[Serializable]
public class StudentInfo
{
//Default Constructor
public StudentInfo()
{
}
/// <summary>
/// Create object of student Class
/// </summary>
/// <param name="intRoll">Int RollNumber</param>
/// <param name="strName">String Name</param>
public StudentInfo(int intRoll, string strName)
{
this.Roll = intRoll;
this.Name = strName;
}
private int intRoll;
private string strName;
public int Roll
{
get
{
return intRoll;
}
set
{
intRoll = value;
}
}
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
}
이제 코드 비하인드 코드를 보면, 두 개의 버튼을 추가했습니다. 하나는 세션 저장용이고 다른 하나는 세션 검색용입니다.
protected void btnSubmit_Click(object sender, EventArgs e)
{
StudentInfo _objStudentInfo =
new StudentInfo(Int32.Parse( txtRoll.Text) ,txtUserName.Text);
Session["objStudentInfo"] = _objStudentInfo;
ResetField();
}
protected void btnRestore_Click(object sender, EventArgs e)
{
StudentInfo _objStudentInfo = (StudentInfo) Session["objStudentInfo"];
txtRoll.Text = _objStudentInfo.Roll.ToString();
txtUserName.Text = _objStudentInfo.Name;
}
3단계: 이미 설명한 대로 ASP.NET State Server 에 대한 web.config 를 구성합니다. 그리고 구성된 서버에서 aspnet_state.exe가 실행 중인지 확인하세요.
Step 4 : 어플리케이션을 실행합니다.
데이터를 입력하고, Submit 버튼을 선택합니다.
ASP.NET State Server 가 정확히 얼마나 유용한지 완전히 설명하는 다음과 같은 테스트가 있습니다.
1단계, 제대로 검증하기 위해, StudentInfo 클래스에서 [Serializable ] 키워드를 제거하고 응용 프로그램을 실행해 봅니다. Submit 버튼을 클릭하면 다음과 같은 오류가 발생합니다.
세션에 개체를 저장하기 전에 [Serializable ] 직렬화해야 한다는 것이 명확해 졌습니다. ^^
2단계: 어플리케이션을 실행하고, 애플리케이션을 실행하고 데이터를 저장합니다. IIS를 다시 시작하십시오.
InProc의 경우 이미 세션 데이터가 손실되었지만 StateServer의 경우 Restore Session 버튼을 클릭하면 StateServer 데이터가 IIS에 의존하지 않기 때문에 원래 데이터를 얻을 수 있습니다. 즉, 따로 보관하고 있습니다.
3단계: Windows 서비스 MMC에서 ASP.NET State Server 즉, aspnet_state.exe를 중지하고 데이터를 submit 합니다. 다음과 같은 오류가 발생합니다.
ASP.NET State Server 프로세스가 실행되고 있지 않기 때문입니다. 따라서 State Server Mode 를 사용할 때 위의 세 가지 사항을 명심해야 합니다.
그래서 위의 내용을 기반으로...
장점 :
단점 :
ASP.NET State Server 설명이 이제 끝났습니다.
다음 강의에서 여러분은 LoadBalance, Web farm, Web Garden 시나리오 상에 약간의 흥미로운 부분을 발견하실 겁니다.
🎈🎈📢📢📢 Session in ASP.Net webform - 강좌1 바로가기
🎈🎈📢📢📢 Session in ASP.Net webform - 강좌2 바로가기
🎈🎈📢📢📢 Session in ASP.Net webform - 강좌3 바로가기
🎈🎈📢📢📢 Session in ASP.Net webform - 강좌4 바로가기
번역 출처:
https://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net
Exploring Session in ASP.NET
This article describes Session in ASP.NET 2.0. Different types of Session and their configuration. Also describes Session on Web Farm, Load Balancer, and Web Garden scenarios.
www.codeproject.com
https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178586(v=vs.100)
Session-State Modes
Table of contents Session-State Modes Article 10/22/2014 9 minutes to read In this article --> ASP.NET session state supports several different storage options for session data. Each option is identified by a value in the SessionStateMode enumeration. The
learn.microsoft.com
Web Gardens, Web Farms, Clouds, and Session State in C# ASP .NET
Web Gardens, Web Farms, Clouds, and Session State in C# ASP .NET
www.primaryobjects.com
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=crossbow71&logNo=60130581086
.NET Framework 4.0에서 세션 처리 하기 (StateServer 이용)
SQL Server를 이용한 세션 처리 방법이 부담스럽다면... 윈도우의 서비스 중에 ASP.NET St...
blog.naver.com
https://blog.naver.com/crossbow71/60122354586
.NET Framework 4.0에서 세션 처리 하기 (SQLServer 이용)
기존엔 c:\Windows\Microsoft.Net\Framework\버전 하위에 있는 설치 스크립트 sql 파일을 이용해 ...
blog.naver.com
Session in ASP.Net Webform - 강좌4 (0) | 2022.12.27 |
---|---|
Session in ASP.Net Webform - 강좌3 (0) | 2022.12.27 |
Session in ASP.Net webform - 강좌1 (0) | 2022.12.27 |
asp.net webform 의 child page 에서 master page 에 접근하여 metadata tag 값 추가하는 방법. (0) | 2019.09.05 |
asp.net webform 의 HTTP Headers 브라우저 캐시 차단하는 방법 (2) | 2017.09.11 |