ASP.NET 세션 상태 개요

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 세션 상태를 사용하여 사용자에 대한 값을 저장 및 검색합니다.

이 항목의 내용은 다음과 같습니다.

ASP.NET 세션 상태를 사용하면 사용자가 웹 응용 프로그램의 ASP.NET 페이지를 탐색할 때 사용자에 대한 값을 저장하고 검색할 수 있습니다. HTTP는 상태 비저장 프로토콜입니다. 이는 웹 서버가 페이지에 대한 각 HTTP 요청을 독립적인 요청으로 처리한다는 것을 의미합니다. 서버에서는 이전 요청 동안 사용된 변수 값을 알지 못합니다. ASP.NET 세션 상태는 제한된 시간 창에서 동일한 브라우저의 요청을 세션으로 식별하며 해당 세션 동안 변수 값을 유지하는 방법을 제공합니다. 기본적으로 ASP.NET 세션 상태는 모든 ASP.NET 응용 프로그램에 사용됩니다.

세션 상태 대신에 사용될 수 있는 방법은 다음과 같습니다.

  • ASP.NET 응용 프로그램의 모든 사용자가 액세스할 수 있는 변수를 저장하는 응용 프로그램 상태

  • 사용자 값을 만료하지 않고 데이터 저장소에서 유지하는 프로필 속성

  • 모든 ASP.NET 응용 프로그램이 사용할 수 있는 메모리에 값을 저장하는 ASP.NET 캐싱

  • 페이지에 값을 유지하는 뷰 상태

  • 쿠키

  • HTTP 요청에서 사용할 수 있는 HTML 폼의 쿼리 문자열 및 필드

서로 다른 상태 관리 옵션을 비교하려면 ASP.NET 상태 관리 권장 사항을 참조하십시오.

세션 변수

세션 변수는 HttpContext.Session 속성을 통해 노출되는 SessionStateItemCollection 개체에 저장됩니다. ASP.NET 페이지에서 현재 세션 변수는 Page 개체의 Session 속성을 통해 노출됩니다.

세션 변수의 컬렉션은 변수 이름이나 정수 인덱스로 인덱싱됩니다. 세션 변수는 세션 변수를 이름으로 참조하면 생성됩니다. 따라서 세션 변수를 선언하거나 이를 명시적으로 컬렉션에 추가할 필요가 없습니다. 다음 예제에서는 사용자의 이름과 성에 대한 세션 변수를 ASP.NET 페이지에서 만든 후 TextBox 컨트롤로부터 검색된 값을 변수에 설정하는 방법을 보여 줍니다.

Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

세션 변수에는 모든 유효한 .NET Framework 형식을 사용할 수 있습니다. 다음 예제에서는 StockPicks라는 세션 변수에 ArrayList 개체를 저장합니다. StockPicks 세션 변수에서 반환되는 값은 SessionStateItemCollection에서 검색할 경우 적절한 형식으로 캐스팅되어야 합니다.

// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
ms178581.alert_note(ko-kr,VS.100).gif참고:

InProc 이외의 세션 상태 모드를 사용할 경우 세션 변수 형식은 기본 .NET 형식 또는 serializable이어야 합니다. 이는 세션 변수 값이 외부 데이터 저장소에 저장되기 때문입니다. 자세한 내용은 세션 상태 모드를 참조하십시오.

세션 식별자

세션은 SessionID 속성을 사용하여 읽을 수 있는 고유 식별자로 식별됩니다. ASP.NET 응용 프로그램에 세션 상태를 사용하면 응용 프로그램의 페이지에 대한 각 요청을 브라우저에서 보낸 SessionID 값에 대해 검사합니다. SessionID 값을 지정하지 않으면 ASP.NET은 새 세션을 시작하며 응답과 함께 이 세션의 SessionID 값을 브라우저로 보냅니다.

기본적으로 SessionID 값은 쿠키에 저장됩니다. 그러나 "쿠키를 사용하지 않는" 세션의 경우 SessionID 값을 URL에 저장하도록 응용 프로그램을 구성할 수도 있습니다.

동일한 SessionID 값으로 계속해서 요청이 이루어지면 세션은 활성 세션으로 간주됩니다. 특정 세션에서 요청 사이의 시간이 지정한 제한 시간 값(분)을 초과하면 세션은 만료된 것으로 간주됩니다. 만료된 SessionID 값으로 요청을 수행하면 새 세션이 시작됩니다.

ms178581.alert_security(ko-kr,VS.100).gif보안 정보:

P:System.Web.SessionState.HttpSessionState.SessionID 값은 쿠키로 전송되든 URL의 일부로 전송되든 항상 일반 텍스트 형식으로 전송됩니다. 따라서 악의적인 사용자가 SessionID 값을 알아내 이를 서버에 대한 요청에 포함시키는 방법으로 다른 사용자의 세션에 액세스할 수 있게 됩니다. 세션 상태에 중요한 정보를 저장한 경우에는 SSL을 사용하여 SessionID 값이 포함된 브라우저와 서버 간의 모든 통신을 암호화하는 것이 좋습니다.

쿠키를 사용하지 않는 SessionID

기본적으로 SessionID 값은 브라우저의 만료되지 않은 세션 쿠키에 저장됩니다. 그러나 Web.config 파일의 sessionState 섹션에서 cookieless 특성을 true로 설정하여 세션 식별자가 쿠키에 저장되지 않도록 지정할 수 있습니다.

다음 예제의 Web.config 파일에서는 쿠키를 사용하지 않는 세션 식별자를 사용하도록 ASP.NET 응용 프로그램을 구성합니다.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

ASP.NET에서는 페이지의 URL에 고유 세션 ID를 자동으로 삽입하여 쿠키를 사용하지 않는 세션 상태를 유지합니다. 예를 들어, 다음 URL은 ASP.NET에 의해 고유 세션 ID lit3py55t21z5v55vlm25s55를 포함하도록 수정되었습니다.

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

ASP.NET은 페이지를 브라우저에 보낼 경우 세션 ID 값을 링크에 포함하여 응용 프로그램 상대 경로를 사용하는 페이지의 모든 링크를 수정합니다. 절대 경로를 가진 링크는 수정되지 않습니다. 사용자가 이 방법으로 수정된 링크를 클릭하는 동안 세션 상태는 계속 유지됩니다. 그러나 클라이언트에서 응용 프로그램이 제공한 URL을 다시 작성하면 ASP.NET에서는 세션 ID를 확인하고 해당 요청을 기존 세션과 연결할 수 없게 됩니다. 이 경우 해당 요청을 처리하기 위한 새 세션이 시작됩니다.

세션 ID는 URL에서 응용 프로그램 이름 뒤의 슬래시와 나머지 파일 또는 가상 디렉터리 식별자의 사이에 포함됩니다. 이렇게 하면 ASP.NET에서는 요청에 SessionStateModule을 포함시키기 전에 응용 프로그램 이름을 확인할 수 있습니다.

ms178581.alert_note(ko-kr,VS.100).gif참고:

응용 프로그램의 보안을 강화하려면 응용 프로그램에서 Abandon 메서드를 호출해야 할 때 사용자가 응용 프로그램에서 로그아웃할 수 있도록 해야 합니다. 이렇게 하면 악의적인 사용자가 URL의 고유 식별자를 알아내고 이를 사용하여 세션에 저장된 개인 사용자 데이터를 검색하게 될 가능성이 줄어듭니다.

만료된 세션 식별자 다시 생성

쿠키를 사용하지 않는 세션에 사용된 세션 ID 값은 기본적으로 재활용됩니다. 즉, 만료된 세션 ID를 사용하여 요청이 만들어지면 해당 요청과 함께 제공된 SessionID 값을 사용하여 새 세션이 시작됩니다. 이로 인해 쿠키를 사용하지 않는 SessionID 값이 포함된 링크가 여러 브라우저에서 사용될 경우 세션이 뜻하지 않게 공유될 수 있습니다. 검색 엔진, 전자 메일 메시지 또는 다른 프로그램을 통해 링크가 전달될 경우 이 문제가 발생할 수 있습니다. 세션 식별자가 재활용되지 않도록 응용 프로그램을 구성하여 세션 데이터를 공유할 가능성을 줄일 수 있습니다. 이를 위해서는 sessionState 구성 요소의 regenerateExpiredSessionId 특성을 true로 설정합니다. 이렇게 하면 쿠키를 사용하지 않는 세션 요청이 만료된 세션 ID로 만들어질 때 새 세션 ID가 생성됩니다.

ms178581.alert_note(ko-kr,VS.100).gif참고:

만료된 세션 ID를 사용하여 요청이 수행될 때 HTTP POST 메서드가 사용되면 regenerateExpiredSessionIdtrue일 경우 게시된 모든 데이터가 손실됩니다. 이는 브라우저에서 새 세션 식별자가 URL에 있는지 확인하기 위해 ASP.NET이 리디렉션을 수행하기 때문입니다.

사용자 지정 세션 식별자

SessionID 값을 제공하고 해당 유효성을 검사하기 위해 사용자 지정 클래스를 구현할 수 있습니다. 이렇게 하려면 SessionIDManager 클래스를 상속하는 클래스를 만들고 고유한 구현을 사용하여 CreateSessionIDValidate 메서드를 재정의합니다. 예제를 보려면 CreateSessionID용으로 제공된 예제를 참조하십시오.

ISessionIDManager 인터페이스를 구현하는 클래스를 만들면 SessionIDManager 클래스를 바꿀 수 있습니다. 예를 들어 ISAPI 필터를 사용하여 HTML 페이지나 이미지 같이 ASP.NET이 아닌 페이지에 고유 식별자를 연결하는 웹 응용 프로그램이 있는 경우, 사용자 지정 SessionIDManager 클래스를 구현하여 이 고유 식별자를 ASP.NET 세션 상태와 함께 사용할 수 있습니다. 사용자 지정 클래스에서 쿠키를 사용하지 않는 세션 식별자를 지원하는 경우 세션 식별자를 URL로 보내고 가져오기 위한 솔루션을 구현해야 합니다.

세션 모드

ASP.NET 세션 상태는 다양한 세션 변수 저장소 옵션을 지원합니다. 각 옵션은 세션 상태 Mode 형식으로 식별됩니다. 기본 동작은 ASP.NET 작업자 프로세스의 메모리 공간에 세션 변수를 저장하는 것입니다. 그러나 세션 상태가 개별 프로세스, SQL Server 데이터베이스 또는 사용자 지정 데이터 소스에 저장되도록 지정할 수도 있습니다. 응용 프로그램에 대해 세션 상태를 사용하지 않으려면 세션 모드를 Off로 설정하면 됩니다.

자세한 내용은 세션 상태 모드를 참조하십시오.

세션 이벤트

ASP.NET은 사용자 세션을 관리할 수 있도록 하는 두 개의 이벤트인, 즉 새 세션이 시작되면 발생되는 Session_OnStart 이벤트와 세션이 중단 또는 만료되면 발생되는 Session_OnEnd 이벤트를 제공합니다. 세션 이벤트는 ASP.NET 응용 프로그램의 Global.asax 파일에서 지정됩니다.

세션의 Mode 속성이 기본 모드인 InProc 이외의 값으로 설정되어 있으면 Session_OnEnd 이벤트가 지원되지 않습니다.

ms178581.alert_note(ko-kr,VS.100).gif참고:

ASP.NET 응용 프로그램의 Global.asax 파일 또는 Web.config 파일을 수정하면 응용 프로그램이 다시 시작되며 응용 프로그램 상태 또는 세션 상태에 저장된 값은 모두 손실됩니다. 일부 바이러스 백신 프로그램은 응용 프로그램에 있는 Global.asax 또는 Web.config 파일의 마지막으로 수정된 날짜와 시간을 업데이트할 수 있습니다.

자세한 내용은 세션 상태 이벤트를 참조하십시오.

세션 상태 구성

세션 상태는 system.web 구성 섹션의 sessionState 요소를 사용하여 구성합니다. @ Page 지시문에서 EnableSessionState 값을 사용하여 세션 상태를 구성할 수도 있습니다.

sessionState 요소를 사용하면 다음 옵션을 지정할 수 있습니다.

  • 세션이 데이터를 저장하는 모드

  • 클라이언트와 서버 간에 세션 식별자 값이 보내지는 방법

  • 세션 Timeout

  • 세션 Mode 설정에 기반하는 지원 값

다음 예제에서는 SQLServer 세션 모드에 맞게 응용 프로그램을 구성하는 sessionState 요소를 보여 줍니다. Timeout 값이 30분으로 설정되며 세션 식별자는 URL에 저장하도록 지정됩니다.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

응용 프로그램의 세션 상태를 비활성화하려면 세션 상태 모드를 Off로 설정합니다. 또한 응용 프로그램의 특정 페이지에 대해서만 세션 상태를 비활성화하려면 @ Page 지시문의 EnableSessionState 값을 false로 설정하면 됩니다. EnableSessionState 값을 ReadOnly 로 설정하면 세션 변수에 대한 읽기 전용 권한을 제공할 수도 있습니다.

동시 요청 및 세션 상태

각 세션마다 ASP.NET 세션 상태에 대해 단독으로 액세스하므로, 두 명의 사용자가 동시에 요청을 하면 각각의 세션에 대한 액세스 권한이 동시에 부여됩니다. 그러나 같은 세션에 대해 두 요청을 동시에 수행할 때, 즉 동일한 SessionID 값을 사용하는 경우 처음 받은 요청은 세션 정보에 대한 단독 액세스 권한을 얻지만 두 번째 요청은 첫 번째 요청이 완료되거나 첫 번째 요청의 잠금 제한 시간이 초과되어 정보에 대한 단독 잠금이 해제되어야 액세스 권한을 얻을 수 있습니다. @ Page 지시문의 EnableSessionState 값을 ReadOnly로 설정하면 읽기 전용 세션 정보를 요청해도 세션 데이터가 단독으로 잠기지 않습니다. 그러나 세션 데이터를 읽기 전용으로 요청하더라도 세션 데이터에 대한 읽기/쓰기 요청을 통해 설정된 잠금이 해제될 때까지 기다려야 합니다.

맨 위로 이동

다음 표에서는 System.Web.SessionState 네임스페이스에 있는 세션 상태와 관련된 주요 클래스를 보여 줍니다.

멤버

설명

SessionIDManager

ASP.NET 세션 상태의 고유 식별자를 관리합니다.

SessionStateItemCollection

세션 상태 변수를 저장하는 데 사용됩니다.

맨 위로 이동

표시: