DetailPage-MSS-KB

기술 자료

기술 자료: 899918 - 마지막 검토: 2006년 12월 11일 월요일 - 수정: 1.2

소개

이 문서에서는 Microsoft ASP.NET 세션 ID를 사용하는 방법과 이유를 설명합니다.

추가 정보

ASP.NET 세션 상태를 사용하면 서버 쪽 사용자별 데이터를 저장할 수 있습니다. 웹 응용 프로그램은 이 데이터를 사용하여 세션 상태가 인스턴스화한 사용자의 요청을 처리할 수 있습니다. 사용자의 세션 상태는 세션 ID로 식별되며 세션 ID는 다음 방법 중 하나를 통해 전달됩니다.
  • 세션 ID가 사용자의 브라우저로 전송되는 쿠키에 포함되어 있는 경우
  • 세션 ID가 URL에 포함되어 있는 경우. 이 방법은 쿠키 없는(Cookie-less) 세션이라고도 합니다.
세션 ID는 20개 문자열로 표현되는 120비트 임의의 숫자입니다. 문자열은 URL에 포함될 수 있도록 서식이 지정되어 있으므로 URL 인코딩을 수행할 필요는 없습니다. 예를 들어 쿠키 없는 세션에서 이 문자열을 사용할 수 있습니다. 세션 ID를 전달하는 가장 일반적인 방법은 세션 ID를 저장하는 쿠키를 사용하는 것입니다.

사용자가 처음 웹 브라우저를 열고 ASP.NET 세션 상태를 구현하는 웹 사이트로 이동하면 20 문자 값으로 된 "ASP.NET_SessionId"라는 이름의 쿠키가 브라우저로 전송됩니다.

사용자가 동일한 DNS 도메인 내에서 검색하는 동안 웹 브라우저는 이 쿠키를 이 쿠키의 원래 출처였던 도메인으로 계속 보냅니다.

예를 들어 ASP.NET 응용 프로그램인 app1.tailspintoys.com과 app2.tailspintoys.com이 있다고 가정합니다. 사용자가 app1.tailspintoys.com으로 이동했다가 app2.tailspintoys.com으로 이동하는 경우 두 응용 프로그램은 동일한 쿠키와 동일한 세션 ID를 사용하여 각 응용 프로그램 내에서 사용자의 세션 상태를 추적합니다. 두 응용 프로그램은 동일한 세션 상태를 공유하지는 않으며 단지 세션 ID만을 공유합니다.

따라서 여러 가지 이유로 세션 ID를 다시 사용할 수 있습니다. 예를 들어 세션 ID를 다시 사용하는 경우에는 다음과 같은 작업을 수행할 필요가 없습니다.
  • 사용자에게 유효한 세션 ID가 제공될 때 고유하게 암호화된 새 세션 ID 만들기
  • 단일 도메인에 있는 각 ASP.NET 응용 프로그램에 대해 새 세션 ID 만들기
로그온이 필요한 웹 응용 프로그램에서 로그오프 페이지나 옵션을 제공하는 경우에는 사용자가 웹 사이트에서 로그오프할 때 세션 상태를 지우는 것이 좋습니다. 세션 상태를 지우려면 Session.Abandon 메서드를 호출합니다. Session.Abandon 메서드를 사용하면 세션 상태 시간 제한이 만료될 때까지 기다리지 않고도 세션 상태를 플러시할 수 있습니다. 기본적으로 시간 제한은 20분의 슬라이딩 만료(Sliding Expiration) 방식으로 수행됩니다. 이 만료는 사용자가 웹 사이트에 요청을 하고 세션 ID 쿠키를 제공할 때마다 새로 고쳐집니다. Abandon 메서드는 세션 상태 개체에 세션 상태가 중단되어야 함을 나타내는 플래그를 설정합니다. 페이지 요청이 끝날 때 이 플래그가 검사되고 그 결과에 따라 작업이 수행됩니다. 따라서 사용자는 Abandon 메서드를 호출한 후 페이지 내에서 세션 개체를 사용할 수 있습니다. 페이지 처리가 완료되면 바로 세션이 제거됩니다.

처리 중 세션 상태 모드를 사용하는 경우에는 세션 상태 개체가 HttpCache에 저장됩니다. HttpCache는 다음 조건이 참일 경우 콜백 메서드를 지원합니다.
  • 캐시 항목이 제거됩니다.
  • Session State Manager가 캐시 항목이 제거될 때 호출될 Session_OnEnd 이벤트 처리기를 등록합니다.
Session State Manager가 캐시에 있는 세션 상태 개체를 제거할 때 HttpCache 관리자는 등록된 모든 콜백을 호출합니다. 실제로는 이 동작에 의해 Session_OnEnd 이벤트 처리기가 선택됩니다.

세션을 중단하더라도 세션 ID 쿠키는 사용자 브라우저에서 제거되지 않습니다. 따라서 세션이 중단된 직후 동일한 응용 프로그램에 대한 모든 새 요청에는 동일한 세션 ID가 사용됩니다. 단, 세션 상태 인스턴스는 새로 만들어집니다. 이와 동시에 사용자가 동일한 DNS 도메인 내에서 다른 응용 프로그램을 여는 경우 한 응용 프로그램에서 Abandon 메서드가 호출된 후에도 사용자는 자신의 세션 상태를 잃어버리지 않습니다.

세션 ID를 다시 사용하지 않으려는 경우도 있습니다. 이 경우 세션 ID를 다시 사용하지 않을 때 예상되는 결과를 충분히 이해하고 있다면 다음 코드 예제와 같이 세션을 중단하고 세션 ID 쿠키를 지우십시오.
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
이 코드 예제에서는 서버에서 세션 상태를 지우고 세션 상태 쿠키를 null로 설정합니다. null 값은 실제로 브라우저에서 쿠키를 지웁니다.

사용자가 응용 프로그램에서 로그오프하지 않았는데 세션 상태 시간 제한이 만료된 경우 브라우저가 닫히지 않았다면 응용 프로그램은 동일한 세션 상태 쿠키를 사용할 수 있습니다. 이러한 동작으로 인해 사용자는 로그온 페이지로 이동하게 되며 사용자의 세션 상태 쿠키가 제공됩니다. 로그온 페이지(login.aspx)를 열 때 반드시 새로운 세션 ID가 사용되도록 하려면 null 쿠키를 클라이언트로 다시 보냅니다. 이렇게 하려면 쿠키를 응답 컬렉션에 추가합니다. 그런 다음 응답 컬렉션을 다시 클라이언트로 보냅니다. null 쿠키를 보내는 가장 간단한 방법은 Response.Redirect 메서드를 사용하는 것입니다. 이 쿠키 컬렉션에는 항상 ASP.NET_SessionId의 값이 들어 있습니다. 따라서 Response.Redirect 루프를 만드는 경우 이 쿠키의 존재 여부는 테스트할 수 없습니다. 로그온 페이지로 리디렉션할 때 쿼리 문자열을 설정할 수 있습니다.

또는 다음 코드 예제에서처럼 로그온 페이지로 이미 리디렉션되었는지 여부는 다른 쿠키를 사용하여 확인할 수 있습니다. ASP.NET 쿠키와 함께 두 번째 쿠키를 사용하여 로그온 페이지를 열려고 시도하는 행위를 차단하고 보안을 강화할 수 있도록 다음 코드 예제에서는 FormsAuthentication 클래스를 사용하여 쿠키 데이터를 암호화하고 해독합니다. 그런 다음 5초의 시간 제한을 설정합니다.
private void Page_Load(object sender, System.EventArgs e)
{ 
if( !IsPostBack && 
( Request.Cookies["__LOGINCOOKIE__"] == null ||
Request.Cookies["__LOGINCOOKIE__"].Value == "" ) )
{
//At this point, we do not know if the session ID that we have is a new
//session ID or if the session ID was passed by the client. 
//Update the session ID.

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

//To make sure that the client clears the session ID cookie, respond to the client to tell 
//it that we have responded. To do this, set another cookie.
AddRedirCookie();
Response.Redirect( Request.Path );
}

//Make sure that someone is not trying to spoof.
try
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt( Request.Cookies["__LOGINCOOKIE__"].Value );

if( ticket == null || ticket.Expired == true ) 
throw new Exception();

RemoveRedirCookie();
}
catch
{
//If someone is trying to spoof, do it again.
AddRedirCookie();
Response.Redirect( Request.Path );
}


Response.Write("Session.SessionID="+Session.SessionID+"<br/>");
Response.Write("Cookie ASP.NET_SessionId="+Request.Cookies["ASP.NET_SessionId"].Value+"<br/>");
} 

private void RemoveRedirCookie() 
{ 
Response.Cookies.Add(new HttpCookie("__LOGINCOOKIE__", "")); 
} 

private void AddRedirCookie()
{

FormsAuthenticationTicket ticket = 
new FormsAuthenticationTicket(1,"Test",DateTime.Now,DateTime.Now.AddSeconds(5), false,""); 
string encryptedText = FormsAuthentication.Encrypt( ticket ); 
Response.Cookies.Add( new HttpCookie( "__LOGINCOOKIE__", encryptedText ) );
}




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx) 에 참여하시기 바랍니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 1.1
키워드: 
kbhowto kbinfo KB899918
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store