ASP 강의 시리즈(19) 세션 관리
저자:Eve Cole
업데이트 시간:2009-05-30 19:58:38
웹 애플리케이션을 성공적으로 개발하는 데 있어 어려운 점 중 하나는 사용자가 방문 또는 세션 중에 애플리케이션의 페이지에서 페이지로 이동하는 동안 사용자 정보를 유지하는 것입니다. HTTP는 상태 비저장 프로토콜입니다. 즉, 웹 서버는 페이지에 대한 각 액세스를 관련 없는 액세스로 처리합니다. 현재 액세스 후 며칠 내에 액세스가 발생하더라도 서버는 이전 액세스에 대한 정보를 유지하지 않습니다. 전에. 이전 방문에 대한 메모리 부족으로 인해 사용자가 카탈로그의 여러 페이지 사이를 이동하는 동안 선택한 카탈로그 항목을 추적해야 하는 온라인 카탈로그와 같은 애플리케이션을 작성하기가 어렵습니다.
ASP는 세션 정보 문제를 관리하기 위한 고유한 솔루션을 제공합니다. ASP 세션 개체와 서버에서 생성된 특수 사용자 ID를 사용하면 들어오는 각 사용자를 식별하고 응용 프로그램에서 사용하는 정보를 수집하여 사용자의 기본 설정이나 콘텐츠 선택을 추적할 수 있는 지능형 응용 프로그램을 만들 수 있습니다.
ASP는 HTTP 쿠키를 통해 사용자 ID를 설정합니다. HTTP 쿠키는 사용자의 브라우저에 저장되는 작은 파일입니다. 따라서 쿠키를 지원하지 않는 브라우저용 응용 프로그램을 만들거나 클라이언트가 브라우저에서 쿠키를 허용하지 않도록 설정한 경우 ASP의 세션 관리 기능을 사용하지 마십시오.
애플리케이션이 시작되거나 종료될 때 실행되는 스크립트를 작성할 수도 있습니다.
세션 시작 및 종료 세션은 세 가지 방법으로 시작할 수 있습니다.
새 사용자는 Global.asa 파일에 Session_OnStart 프로시저가 포함된 응용 프로그램의 .asp 파일을 식별하는 URL에 대한 액세스를 요청합니다.
사용자는 Session 개체에 값을 저장합니다.
사용자는 응용 프로그램의 .asp 파일을 요청하고 응용 프로그램의 Global.asa 파일은 <OBJECT> 태그를 사용하여 세션 범위가 있는 개체의 인스턴스를 만듭니다.
사용자가 지정된 시간 동안 애플리케이션의 어떤 페이지도 요청하거나 새로 고치지 않으면 세션이 자동으로 종료됩니다. 이 기간의 기본값은 20분입니다. 인터넷 서비스 관리자의 "응용 프로그램 옵션" 속성 페이지에서 "세션 시간 초과" 속성을 설정하여 응용 프로그램의 기본 시간 초과 제한 설정을 변경할 수 있습니다. 이 값은 웹 애플리케이션의 요구 사항과 서버의 메모리 공간에 따라 설정되어야 합니다. 예를 들어 웹 응용 프로그램을 검색하는 사용자가 각 페이지에 몇 분 동안만 머물도록 하려면 기본 세션 시간 초과 값을 줄여야 합니다. 세션 시간 초과 값이 너무 길면 열려 있는 세션이 너무 많아 서버의 메모리 리소스가 고갈됩니다.
특정 세션에 대해 기본 시간 초과 값보다 작은 시간 초과 값을 설정하려면 Session 개체의 Timeout 속성을 설정하면 됩니다. 예를 들어 다음 스크립트는 시간 초과 값을 5분으로 설정합니다.
<%Session.Timeout = 5%>
기본 설정보다 큰 시간 초과 값을 설정할 수도 있습니다. Session.Timeout 속성에 따라 시간 초과 값이 결정됩니다.
Session 개체의 Abandon 메서드를 통해 명시적으로 세션을 종료할 수도 있습니다. 예를 들어 테이블에 종료 버튼을 제공하려면 버튼의 ACTION 매개 변수를 다음 명령이 포함된 .asp 파일의 URL로 설정합니다.
<% 세션.포기 %>
SessionID 및 쿠키 정보
사용자가 지정된 응용 프로그램에서 처음으로 .asp 파일을 요청하면 ASP는 SessionID를 생성합니다. SessionID는 각 사용자 세션을 고유하게 식별하는 복잡한 알고리즘에 의해 생성된 숫자입니다. 새 세션이 시작될 때 서버는 세션 ID를 사용자의 웹 브라우저에 쿠키로 저장합니다.
SessionID는 사용자가 세션 중에 응용 프로그램과 상호 작용할 때 ASP가 사용자 정보를 서버의 "안전한" 저장소에 저장할 수 있다는 점에서 키와 매우 유사합니다. 키를 사용하여 금고에 있는 항목에 액세스할 수 있는 것처럼 "금고"의 내용은 HTTP 요청 헤더에 전송된 사용자의 SessionID 쿠키를 통해 액세스할 수 있습니다. ASP는 페이지 요청을 받을 때마다 HTTP 요청 헤더를 확인하여 SessionID 쿠키를 얻습니다.
SessionID 쿠키가 사용자의 브라우저에 저장된 후에도 ASP는 사용자가 다른 .asp 파일을 요청하거나 다른 응용 프로그램에서 실행되는 .asp 파일을 요청하는 경우에도 여전히 쿠키를 재사용하여 세션을 추적합니다. 마찬가지로, 사용자가 의도적으로 세션을 중단하거나 세션 시간 초과를 허용한 다음 다른 .asp 파일을 요청하면 ASP는 동일한 쿠키를 사용하여 새 세션을 시작합니다. 서버 관리자가 서버를 다시 시작하거나 사용자가 웹 브라우저를 다시 시작하는 경우에만 메모리에 저장된 SessionID 설정이 지워지고 사용자는 새로운 SessionID 쿠키를 받게 됩니다.
SessionID 쿠키를 재사용함으로써 ASP는 사용자의 브라우저로 전송되는 쿠키 수를 최소화합니다. 또는 ASP 응용 프로그램에 세션 관리가 필요하지 않다고 결정한 경우 ASP가 세션을 추적하고 사용자에게 SessionID를 보내는 것을 방지할 수 있습니다.
ASP는 다음과 같은 상황에서는 세션 쿠키를 보내지 않습니다.
애플리케이션의 세션 상태가 비활성화되었습니다.
ASP 페이지는 세션 없는 것으로 정의됩니다. 즉, 페이지에 <%@ EnableSessionState=False %> 태그가 포함되어 있습니다.
SessionID 쿠키는 웹 사이트를 여러 번 방문하는 사용자를 영구적으로 추적하는 방법을 제공하지 않습니다. 서버 메모리에 저장된 SessionID 정보는 쉽게 손실될 수 있습니다. 시간이 지남에 따라 웹 응용 프로그램을 방문하는 사용자를 추적하려면 사용자의 웹 브라우저에 특수 쿠키를 저장하고 쿠키 정보를 데이터베이스에 저장하여 사용자 ID를 만들어야 합니다.
세션 객체에 데이터 저장
Session 개체는 정보를 저장할 수 있는 동적 연관 배열을 제공합니다. 세션 개체에 숫자 변수와 개체 변수를 저장할 수 있습니다.
Session 개체의 명명된 항목에 값을 할당하여 변수를 Session 개체에 저장할 수 있습니다. 예를 들어 다음 명령은 Session 개체에 두 개의 새 변수를 저장합니다.
<%
Session("FirstName") = "제프"
세션("성") = "스미스"
%>
이 명명된 항목에 액세스하여 Session 개체에서 정보를 얻을 수 있습니다. 예를 들어 Session("FirstName")의 현재 값을 표시합니다.
환영합니다 <%= Session("FirstName") %>
Session 객체에 사용자의 기본 설정을 저장한 다음 기본 설정에 액세스하여 사용자에게 보낼 페이지를 결정할 수 있습니다. 예를 들어, 사용자가 애플리케이션의 첫 번째 페이지에서 텍스트 전용 버전의 콘텐츠를 지정하고 이 선택 사항을 사용자가 방문하는 애플리케이션의 모든 후속 페이지에 적용하도록 허용할 수 있습니다.
<% If Session("ScreenResolution") = "낮음" Then %>
이것은 페이지의 텍스트 버전입니다.
<%다른%>
이것은 페이지의 멀티미디어 버전입니다.
<% 종료 조건 %>
Session 개체에 개체 인스턴스를 저장할 수도 있지만 그렇게 하면 서버 성능에 영향을 미칩니다.
웹 팜 세션 관리
ASP 세션 정보는 웹 서버에 저장됩니다. 브라우저는 세션 정보에 액세스하는 데 사용되는 스크립트를 얻기 위해 웹 서버의 페이지를 요청해야 합니다. 웹 팜(많은 웹 서버가 사용자 요청에 대한 응답 책임을 공유하는 경우)에서 사용자 요청은 항상 동일한 서버로 라우팅되는 것이 아니라 "로드 밸런싱" 프로세스라고 하는 특수 소프트웨어에 의해 URL로 라우팅됩니다. 무료 서버에 할당됩니다. 로드 밸런싱 프로세스로 인해 웹 팜에서 세션 정보를 보존하기가 더 어려워졌습니다.
부하 분산된 사이트에서 ASP 세션 관리를 사용하려면 사용자 세션에 대한 모든 요청이 동일한 웹 서버로 전달되는지 확인해야 합니다. 한 가지 접근 방식은 응답 개체를 사용하여 브라우저를 사용자 세션을 실행하는 웹 서버로 리디렉션하는 Session_OnStart 프로시저를 작성하는 것입니다. 애플리케이션 페이지의 모든 링크가 상대적인 경우 페이지에 대한 모든 향후 요청은 동일한 서버로 라우팅됩니다.
예를 들어, 사용자가 사이트의 범용 URL인 http://www.microsoft.com을 요청하여 응용 프로그램에 액세스하려고 합니다. 부하 분산 프로세스는 요청을 server3.microsoft.com 서버로 라우팅합니다. ASP가 이 서버에서 새 사용자 세션을 생성했습니다. Session_OnStart 프로세스 중에 브라우저는 지정된 서버로 리디렉션됩니다.
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
브라우저는 지정된 페이지를 요청하고 이후의 모든 요청은 동일한 서버로 라우팅됩니다.
쿠키 사용
쿠키는 웹 서버가 사용자를 나타내기 위해 사용자의 웹 브라우저에 삽입하는 토큰입니다. 다음에 동일한 브라우저가 페이지를 요청할 때 웹 서버에서 받은 쿠키를 보냅니다. 쿠키를 사용하면 일련의 정보가 사용자와 연결될 수 있습니다. ASP 스크립트는 응답 및 요청 개체의 쿠키 컬렉션을 사용하여 쿠키 값을 가져오고 설정합니다.
쿠키 설정
쿠키 값을 설정하려면 Response.Cookies를 사용하세요. 쿠키가 존재하지 않으면 Response.Cookies는 새 쿠키를 생성합니다. 예를 들어 쿠키 이름("planet")과 관련 값("Mars")을 브라우저로 보내려면 다음 명령을 사용하십시오. 이 명령은 웹 페이지의 <HTML> 태그 앞에 나타나야 합니다.
<% Response.Cookies("planet")="화성" %>
현재 사용자 세션 동안에만 쿠키를 사용하려면 브라우저에 쿠키를 보내면 됩니다. 그러나 사용자가 브라우저를 종료하거나 다시 시작한 후에 해당 사용자를 인식하려면 브라우저가 컴퓨터의 하드 드라이브에 쿠키를 저장하도록 강제해야 합니다. 쿠키를 저장하려면 Response.Cookies의 Expires 속성을 사용하고 날짜를 미래의 날짜로 설정하세요.
<%
Response.Cookies("행성") = "화성"
Response.Cookies("planet").Expires = "1999년 1월 1일"
%>
쿠키는 여러 값을 가질 수 있습니다. 이러한 쿠키를 인덱스 쿠키라고 합니다. 각 쿠키 값에는 키워드가 할당됩니다. 특정 쿠키 키워드의 값을 설정할 수 있습니다. 예를 들어:
<% Response.Cookies("planet")("Mars")="SpaceMissions" %>
기존 쿠키에 키워드 값이 있지만 Response.Cookies가 키워드 이름을 지정하지 않으면 키워드 값이 삭제됩니다. 마찬가지로 기존 쿠키에 키워드 값이 없지만 Response.Cookies가 키워드의 이름과 값을 지정하는 경우 기존 쿠키 값이 삭제되고 새 키-값 쌍이 생성됩니다.
쿠키 받기
쿠키 값을 얻으려면 Request.Cookies 컬렉션을 사용하십시오. 예를 들어, 사용자의 HTTP 요청이 planet=Mars로 설정된 경우 다음 명령문은 Mars 값을 얻습니다.
<%= Request.Cookies("행성") %>
마찬가지로, 색인화된 쿠키에서 키워드 값을 얻으려면 키워드 이름을 사용하십시오. 예를 들어, 사용자가 다음과 같은 HTTP 요청을 하는 경우:
행성=화성&화성=SpaceMission
다음 스크립트는 SpaceMissions 값을 반환합니다.
<%= Request.Cookies("행성")("화성") %>
쿠키 경로 설정 ASP가 사용자의 웹 브라우저에 저장한 각 쿠키에는 경로 정보가 포함되어 있습니다. 브라우저가 쿠키에 지정된 경로와 동일한 위치의 파일을 요청하면 브라우저는 자동으로 쿠키를 서버에 전달합니다. 기본적으로 쿠키 경로는 원래 쿠키를 생성한 .asp 파일이 포함된 응용 프로그램 이름에 해당합니다. 예를 들어 UserApplication이라는 응용 프로그램의 .asp 파일이 쿠키를 생성하는 경우 사용자의 웹 브라우저가 이 응용 프로그램의 파일을 검색할 때마다 브라우저는 이 쿠키도 서버로 전달합니다.
기본 응용 프로그램 경로와 다른 쿠키 경로를 선언하려면 ASP Response.Cookies 컬렉션의 Path 속성을 사용하세요. 예를 들어, 다음 스크립트는 SalesApp/Customer/Profiles/ 경로를 구매라는 쿠키에 할당합니다.
<%
Response.Cookies("구매") = "12"
Response.Cookies("Purchases").Expires = "2001년 1월 1일"
Response.Cookies("Purchases").Path = "/SalesApp/Customer/Profiles/"
%>
구매 쿠키가 포함된 웹 브라우저가 /SalesApp/Customer/Profiles/ 경로 또는 해당 하위 디렉터리에 있는 파일을 요청할 때마다 브라우저는 쿠키를 서버에 전달합니다.
Microsoft Internet Explorer 4.0 및 Netscape 브라우저를 포함한 많은 웹 브라우저는 쿠키 경로의 대소문자를 보존합니다. 즉, 요청한 파일의 경우가 예약된 쿠키 경로와 다른 경우 브라우저는 쿠키를 서버에 전달하지 않습니다. 예를 들어 ASP의 경우 가상 디렉터리 /TRAVEL 및 /travel은 동일한 ASP 응용 프로그램이지만 URL 대소문자를 유지하는 브라우저의 경우 /TRAVEL 및 /travel은 서로 다른 두 응용 프로그램입니다. 사용자의 브라우저가 저장된 쿠키를 전달할 수 있도록 .asp 파일에 대한 모든 URL의 대소문자가 동일한지 확인해야 합니다.
원하는 경우 다음 명령문을 사용하여 응용 프로그램이나 경로에 관계없이 사용자의 웹 브라우저가 서버에서 파일을 요청할 때마다 쿠키가 전달되도록 쿠키 경로를 설정할 수 있습니다.
Response.Cookies("구매").Path = "/"
그러나, 애플리케이션을 구분하지 않고 쿠키를 서버에 보내는 경우, 지정된 애플리케이션 이외의 프로그램에서 접근할 수 없는 민감한 정보가 쿠키에 포함되어 있는 경우 보안 문제가 발생할 수 있다는 점에 유의하시기 바랍니다.
쿠키를 사용하지 않고 상태 보존 모든 브라우저가 쿠키를 지원하는 것은 아닙니다. 쿠키를 지원하는 브라우저를 사용하더라도 일부 사용자는 쿠키 지원을 끄는 것을 선호할 수 있습니다. 응용 프로그램이 쿠키를 지원하지 않는 브라우저에 응답해야 하는 경우 ASP 세션 관리를 사용해야 합니다.
ASP 세션 관리를 사용하지 않는 경우 응용 프로그램 페이지 간에 정보를 전달하는 자체 메커니즘을 작성해야 합니다. 이 작업을 수행하는 일반적인 방법에는 두 가지가 있습니다.
URL의 쿼리 문자열에 매개변수를 추가합니다. 예를 들어:
http://MyServer/MyApp/start.asp?name=제프
그러나 일부 브라우저는 양식이 GET 메소드로 제출될 때 쿼리 문자열에 전달된 명시적 매개변수를 삭제합니다.
테이블에 숨겨진 값을 추가합니다. 예를 들어 다음 HTML 테이블에는 암시적 컨트롤이 포함되어 있습니다. 이 컨트롤은 실제 양식에 나타나지 않으며 사용자의 웹 브라우저에 표시되지 않습니다. HTTP POST 메소드를 통해 양식은 사용자가 제공한 정보 외에 사용자 ID를 전달합니다.
<FORM METHOD="POST" ACTION="/scripts/inform.asp">
<INPUT TYPE="텍스트" NAME="도시" VALUE="">
<INPUT TYPE="텍스트" NAME="국가" VALUE="">
<INPUT TYPE="숨김" NAME="사용자 ID" VALUE= <%=UserIDNum(i) %>
<INPUT TYPE="제출" VALUE="입력">
이 방법을 사용하려면 사용자 정보를 전송하는 모든 링크 대상이 HTML 테이블로 인코딩되어야 합니다.
현재 ASP 세션 관리를 사용하고 있지 않다면 응용 프로그램에 대한 세션 지원을 끄십시오. 세션이 활성화되면 ASP는 ASP 페이지를 요청하는 각 브라우저에 SessionID 쿠키를 보냅니다. 세션 지원을 끄려면 인터넷 서비스 관리자의 응용 프로그램 옵션 속성 페이지에서 세션 상태 사용 확인란을 선택 취소하세요.
세션 없는 ASP 페이지
또한 ASP는 세션 추적이 필요한 ASP 페이지에 사용자가 액세스할 때까지 세션 생성을 연기하는 데 사용할 수 있는 세션 없는 페이지를 생성하는 기능을 제공합니다.
세션 없는 페이지는 다음 기능을 수행하지 않습니다.
Session_OnStart 프로시저를 실행합니다.
세션 ID 쿠키를 보냅니다.
세션 개체를 만듭니다.
<OBJECT> 태그를 사용하여 생성된 내장 세션 개체 또는 세션 범위 개체에 액세스합니다.
다른 세션 요청과 순차적으로 실행됩니다.
.asp를 세션 없이 구성하려면 다음 명령문을 사용하십시오.
<%@ EnableSessionState=거짓 %>
이 스크립트는 다른 스크립트보다 먼저 .asp 파일의 첫 번째 줄에 배치해야 합니다. 기본적으로 이 플래그를 생략하면 세션 추적이 활성화됩니다.
세션 없는 ASP 페이지는 시간이 많이 걸릴 수 있는 세션 작업을 제거하여 서버 응답 성능을 향상시킵니다. 예를 들어, 다음과 같은 상황을 생각해 보십시오. ASP 페이지에는 프레임 세트에 두 개의 HTML 프레임(프레임 1과 프레임 2)이 포함되어 있습니다. 프레임 1에는 복잡한 스크립트를 실행하는 .asp 파일이 포함되어 있고, 프레임 2에는 간단한 .html 파일이 포함되어 있습니다. ASP는 세션 요청을 순차적으로(즉, 연속적으로) 실행하기 때문에 프레임 1에 대한 스크립트가 실행될 때까지 프레임 2의 내용을 볼 수 없습니다. 그러나 프레임 1을 세션 없는 것으로 설정하면 ASP 요청은 더 이상 순차적으로 처리되지 않으며 브라우저는 프레임 2의 콘텐츠를 처리하기 전에 프레임 1의 콘텐츠 실행이 완료될 때까지 기다릴 필요가 없습니다.
그러나 서로 다른 프레임에 대한 여러 요청을 처리하는 방법은 궁극적으로 사용자 웹 브라우저의 구성에 따라 다릅니다. 일부 웹 브라우저는 .asp 파일의 세션 없는 구성을 무시하고 계속해서 요청을 순차적으로 처리할 수 있습니다.