성공적인 웹 응용 프로그램 개발에 있어 어려운 과제 중 하나는 사용자가 응용 프로그램의 여러 페이지 간을 이동할 때 방문, 또는 세션에 대한 사용자 정보를 유지 관리하는 것입니다. HTTP는 상태 비저장 프로토콜이며 이것은 웹 서버가 페이지에 대한 각 HTTP 요청을 독립 요청으로 취급한다는 의미입니다. 즉, 이전 요청이 발생한 지 불과 몇 초 후에 현재 요청이 발생하더라도 서버에는 이전 요청에 대한 정보가 남지 않습니다. 이전 요청을 기억하지 못하는 것은 온라인 카탈로그와 같이 사용자가 카탈로그의 여러 페이지 간을 이동하는 동안 선택한 카탈로그 항목을 추적할 필요가 있는 응용 프로그램을 쓰기 어렵다는 것을 의미합니다.
ASP는 세션 정보 관리 문제에 대한 유일한 솔루션을 제공합니다. 서버에 의해 생성된 특정 사용자 ID와 ASP Session 개체를 사용하여 방문한 각 사용자를 식별하는 지능적인 응용 프로그램을 만들고 정보를 수집하면 응용 프로그램은 이러한 정보를 사용하여 사용자 기본 설정과 선택을 추적할 수 있습니다.
중요 ASP는 사용자 브라우저에 저장된 작은 파일인 HTTP 쿠키를 사용하여 사용자 ID를 할당합니다. 따라서 쿠키를 지원하지 않는 브라우저용 응용 프로그램을 만들거나 고객이 쿠키를 거부하도록 브라우저를 설정한다면 APS의 세션 관리 기능을 사용하지 말아야 합니다.
하나의 세션은 다음 네 가지 방식으로 시작할 수 있습니다.
지정된 시간 내에 사용자가 응용 프로그램의 페이지를 요청하지 않거나 새로 고치지 않으면 세션은 자동으로 끝납니다. 이 값은 기본적으로 20분입니다. 인터넷 정보 서비스 스냅인의 응용 프로그램 옵션 속성 시트에서 세션 시간 제한 속성을 설정하여 응용 프로그램에 대한 기본값을 변경할 수 있습니다. 웹 응용 프로그램의 요구 사항 및 서버의 메모리 용량에 따라 이 값을 설정합니다. 예를 들어, 사용자가 웹 응용 프로그램을 검색하면서 각 페이지를 단지 몇 분 동안만 보기를 원한다면 기본값에서 세션 시간 제한 값을 현저하게 줄일 수 있습니다. 세션 시간 제한이 너무 길어지면 세션을 너무 많이 열게 되어 서버의 메모리 리소스가 낭비될 수 있습니다.
특정 세션에 대해서 시간 제한 간격을 기본 응용 프로그램 시간 제한보다 짧게 설정하려면 Session 개체의 Timeout 속성을 설정할 수 있습니다. 예를 들어, 다음 스크립트는 시간 제한 간격을 5분으로 설정합니다.
<% Session.Timeout = 5 %>
또한, 시간 제한 간격을 Session Timeout 속성에 의해 결정되는 기본값보다 크게 설정할 수도 있습니다.
참고 Timeout은 상태를 지닌 세션에만 적용됩니다. 상태 없는 세션 동안 Session 개체는 컨텐트나 정적 개체를 포함하지 않습니다. 이 세션 형식은 요청을 처리하고 동일한 브라우저에서 다음 요청을 다시 작성한 후에 자동으로 종료됩니다.
또는 Session 개체의 Abandon 메서드를 사용하여 세션을 수동으로 종료할 수도 있습니다. 예를 들어, ACTION 매개 변수가 다음 명령을 포함하는 .asp 파일의 URL로 설정된 양식에 끝내기 단추를 제공할 수 있습니다.
<% Session.Abandon %>
참고 Session.Abandon을 시작하기에 앞서 실행 대기열에 있던 사용자 요청은 중단 중이던 세션의 컨텍스트 내에서 실행됩니다. Session.Abandon 실행이 완료되면, 새로 들어오는 요청이 세션에 연결되지 않습니다.
사용자가 지정된 응용 프로그램 내의 .asp 파일을 처음 요청하면 ASP는 SessionID를 생성합니다. 복잡한 알고리즘에 의해 만들어진 숫자인 SessionID는 고유하게 각 사용자 세션을 식별합니다. 새로운 세션의 시작 부분에서 서버는 사용자 웹 브라우저에 SessionID를 쿠키로 저장합니다.
SessionID 쿠키는 사용자가 세션 동안 응용 프로그램과 상호 작용하면 ASP가 사용자에 대한 정보를 서버의 "로커"에 저장할 수 있다는 점에서 로커 키와 유사합니다. HTTP 요청 헤더에서 전송된 사용자 SessionID 쿠키는 로커 키가 로커의 내용을 액세스하도록 하는 것과 같은 방식으로 이 정보를 액세스할 수 있도록 합니다. ASP는 페이지에 대한 요청을 받을 때마다 SessionID 쿠키에 대한 HTTP 요청 헤더를 확인합니다.
사용자 브라우저에서 SessionID 쿠키를 저장하면, 사용자가 다른 .asp 파일을 요청하거나 다른 응용 프로그램에서 실행 중인 .asp 파일을 요청하더라도 ASP는 동일한 쿠키를 다시 사용하여 세션을 추적합니다. 마찬가지로, 사용자가 일부러 중단하거나 세션 시간 제한을 받도록 하여 다른 .asp 파일을 요청하면 ASP는 동일한 쿠키를 사용하여 새로운 세션을 시작합니다. 서버 관리자가 서버를 다시 시작하거나 따라서 메모리에 저장된 SessionID 설정이 지워진 경우 또는 사용자가 웹 브라우저를 다시 시작한 경우에만 사용자가 새로운 SID 쿠키를 받습니다.
ASP는 SessionID 쿠키를 다시 사용하여 브라우저에 보내진 쿠키 수를 최소화합니다. 또한, ASP 응용 프로그램이 세션 관리를 필요로 하지 않는다고 판단되면 ASP가 세션을 추적 또는 사용자에게 SessionID 쿠키를 보내는 작업을 하지 않도록 지정할 수 있습니다.
ASP는 다음 상황에서 세션 쿠키를 보내지 않습니다.
<%@ EnableSessionState=False %>태그를 포함하는 페이지인 경우 자세한 내용은 세션 없는 ASP 페이지를 참조하십시오.
SessionID 쿠키는 웹 사이트 방문자 관리를 위한 영구적인 수단을 제공하지 않음을 주지해야 합니다. 서버 컴퓨터 메모리에 저장된 SessionID 정보는 쉽게 손실될 수 있습니다. 오랜 기간에 걸쳐 웹 응용 프로그램을 방문한 사용자를 추적하려면 사용자 웹 브라우저에 특별한 쿠키를 저장하고 쿠키 정보를 데이터베이스에 저장하여 사용자 ID를 만들어야 합니다. 자세한 내용은 쿠키 사용을 참조하십시오.
Session 개체는 정보를 저장할 수 있는 동적이고 상호 연결된 배열을 제공합니다. 스칼라 변수와 개체 변수를 Session 개체에 저장할 수 있습니다.
Session 개체에 변수를 저장하려면, Session 개체의 명명된 항목에 값을 할당합니다. 예를 들어, 다음 명령은 Session 개체에 두 개의 새로운 변수를 저장합니다.
<%
Session("FirstName") = "Jeff"
Session("LastName") = "Smith"
%>
Session 개체에서 정보를 검색하려면, 명명된 항목을 액세스합니다. 예를 들어, 다음 명령은 Session("FirstName")의 현재 값을 표시합니다.
Welcome <%= Session("FirstName") %>
Session 개체에서 사용자의 기본 설정을 저장한 다음, 이 기본 설정을 액세스하여 사용자에게 반환할 페이지를 결정할 수 있습니다. 예를 들어, 사용자가 응용 프로그램 첫 페이지의 내용을 텍스트 버전으로 지정하고, 이 선택 값을 이 응용 프로그램에서 사용자가 방문하는 모든 페이지에 적용하도록 할 수 있습니다.
<% If Session("ScreenResolution") = "Low" Then %>
This is the text version of the page.
<% Else %>
This is the multimedia version of the page.
<% End If %>
Session 개체에 개체 인스턴스를 저장할 수도 있지만 이렇게 하면 서버 성능이 저하됩니다. 자세한 내용은 개체 범위 설정을 참조하십시오.
Session 개체에 저장된 항목을 삭제하고 싶을 수도 있습니다. 예를 들어, 온라인 상점을 방문하는 사용자가 마음을 바꾼다든지, 구입한 물건 목록을 취소한다든지, 완전히 다른 제품을 선택하기로 결정하는 일은 자주 발생하는 일입니다. 이러한 경우에 적절하지 않은 값을 삭제하면 Session 개체를 쉽게 업데이트할 수 있습니다.
Session 개체의 Contents 컬렉션에는 세션에 대해서 저장된(HTML <OBJECT> 태그를 사용하지 않고 저장된) 모든 변수가 포함되어 있습니다. Contents 컬렉션의 Remove 메서드를 사용하면 세션 상태에 추가된 변수에 대한 참조를 선택적으로 제거할 수 있습니다. 다음 스크립트는 Remove 메서드를 사용하여 항목을 제거하는 방법, 즉 이 경우에는 Session 개체에서 사용자 할인 정보를 제거하는 방법을 보여 줍니다.
<%
If Session.Contents("Purchamnt") <= 75 then
Session.Contents.Remove("Discount")
End If
%>
Contents 컬렉션의 RemoveAll 메서드를 사용하여 세션에 저장된 모든 변수를 완전히 제거할 수도 있습니다.
Session.Content.RemoveAll()Remove 메서드를 사용하면 이름별 또는 색인별로 항목을 삭제하도록 선택할 수 있습니다. 다음 스크립트는 Session 개체에 저장된 값을 반복하는 방법과 색인별로 선택적으로 값을 제거하는 방법을 보여 줍니다.
<%
For Each intQuote in Session.Contents
If Session.Contents(intQuote) < 200 Then
Session.Contents.Remove(intQuote)
End If
Next
%>
ASP 세션 정보는 웹 서버에 저장되어 있습니다. 브라우저는 스크립트에서 세션 정보를 액세스할 수 있도록 동일한 웹 서버에서 페이지를 요청해야 합니다. 여러 웹 서버가 사용자 요청에 응답하는 책임을 공유하는 웹 서버 클러스터에서는 사용자 요청이 항상 동일한 서버에 라우팅되지는 않습니다. 대신, 별도의 소프트웨어가 사이트 URL에 대한 모든 요청을 당시 사용 가능한 서버로 분산시키는데 이러한 프로세스를 로드 균형 조정이라고 합니다. 로드 균형 조정을 사용할 경우, 웹 서버 클러스터에서 세션 정보를 유지 관리하는 것이 어려워집니다.
로드 균형 조정을 사용하는 사이트에서 ASP 세션 관리를 사용하려면 사용자 세션 내의 모든 요청이 동일한 웹 서버로 가는지 확인해야 합니다. 확인 방법 중 하나는 Response 개체를 사용하여 사용자 세션이 실행 중인 특정 웹 서버로 브라우저를 리디렉션하는 Session_OnStart 프로시저를 쓰는 것입니다. 응용 프로그램 페이지의 모든 링크가 상대 링크인 경우, 페이지에 대한 후속 요청은 동일한 서버로 라우팅됩니다.
예를 들어, 사용자는 http://www.microsoft.com이 있습니다. 이 요청은 로드 균형 조정에 의해 특정 서버(예: server3.microsoft.com)로 라우팅됩니다. ASP는 해당 서버에서 사용자 세션을 새로 만듭니다. Session_OnStart 프로시저에서, 브라우저는 지정된 서버로 리디렉션됩니다.
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
브라우저는 지정된 페이지를 요청하며, 원래 URL에서 특정 서버 이름을 참조로 하지 않은 한, 모든 후속 요청은 동일한 서버에 라우팅됩니다.
쿠키는 웹 서버가 사용자를 식별하기 위해 사용자의 웹 브라우저에 삽입하는 토큰입니다. 다음 번에 동일한 브라우저가 페이지 하나를 요청하면, 웹 서버에서 받은 쿠키를 보냅니다. 쿠키를 사용하면 정보 집합을 사용자와 연결시킬 수 있습니다. ASP 스크립트는 Response 및 Request 개체의 Cookies 컬렉션을 사용하여 쿠키의 값을 가져오고 설정할 수 있습니다.
쿠키 값을 설정하려면 Response.Cookies를 사용합니다. 쿠키가 없는 경우 Response.Cookies는 쿠키 하나를 만듭니다. 예를 들어, "VisitorID"라는 이름의 쿠키를 관련 값("49")과 함께 브라우저로 보내려면 다음 명령을 사용합니다. 이 명령어는 웹 페이지에서 <HTML> 태그 앞에 와야 합니다.
<% Response.Cookies("VisitorID") = 49 %>
현재 사용자 세션 동안에만 쿠키를 사용하려면 브라우저로 쿠키를 보내기만 하면 됩니다. 그러나, 사용자가 브라우저를 중단하고 다시 시작한 후에도 사용자를 식별하기 원한다면, 브라우저가 클라이언트 컴퓨터의 하드 디스크의 파일에 쿠키를 저장하도록 해야 합니다. 쿠키를 저장하려면, Response.Cookies의 Expires 속성을 사용하여 날짜를 미래의 임의의 날짜로 설정합니다.
<%
Response.Cookies("VisitorID") = 49
Response.Cookies("VisitorID").Expires = "December 31, 2001"
%>
여러 값을 지니는 쿠키가 있는데, 이러한 쿠키를 인덱스 쿠키라고 합니다. 인덱스 쿠키 값은 키로 할당됩니다. 특정 쿠키 키 값을 설정할 수 있습니다. 예를 들면 다음과 같습니다.
<% Response.Cookies("VisitorID")("49") = "Travel" %>
기존 쿠키가 키 값은 가지지만 Response.Cookies가 키 이름을 지정하지 않으면 기존 키 값이 삭제됩니다. 마찬가지로, 기존 쿠키가 키 값을 가지지 않았으나 Response.Cookies가 키 이름과 값을 지정하면 쿠키의 기존 값이 삭제되고 새로운 키 값이 만들어집니다.
쿠키 값을 가져오려면 Request.Cookies 컬렉션을 사용합니다. 예를 들어 사용자 HTTP 요청이 VisitorID=49를 설정한 경우 다음 문은 값 49를 가져옵니다.
<%= Request.Cookies("VisitorID") %>
이와 마찬가지로, 인덱스 쿠키에서 키 값을 가져 오려면 키 이름을 사용합니다. 예를 들어, 사용자 브라우저가 HTTP 요청 헤더의 다음 정보를 보내면
Cookie: VisitorID=49=Travel
다음 문은 Travel 값을 반환합니다.
<%= Request.Cookies("VisitorID")("49") %>
사용자 웹 브라우저의 ASP에 의해 저장되는 각 쿠키는 경로 정보를 포함하고 있습니다. 브라우저가 쿠키에 지정된 경로와 동일한 위치에 저장된 파일을 요청할 경우, 브라우저는 자동으로 서버에 쿠키를 전달합니다. 기본적으로, 쿠키 경로는 원래 쿠키를 생성한 .asp 파일을 포함하고 있는 응용 프로그램의 이름입니다. 예를 들어, UserApplication이라고 하는 응용 프로그램에 있는 .asp 파일이 쿠키를 만들어 사용자의 웹 브라우저가 그 응용 프로그램에 있는 모든 파일을 검색할 경우, 브라우저는 경로 /UserApplication을 포함하는 기타 쿠키와 함께 쿠키를 전달합니다.
기본 응용 프로그램 경로 이외의 쿠키에 대한 경로를 지정하려면 ASP Response.Cookies 컬렉션의 Path 속성을 사용하면 됩니다. 예를 들어, 다음 스크립트는 Purchases라는 쿠키에 경로 SalesApp/Customer/Profiles/을 할당합니다.
<%
Response.Cookies("Purchases") = "12"
Response.Cookies("Purchases").Expires = "January 1, 2001"
Response.Cookies("Purchases").Path = "/SalesApp/Customer/Profiles/"
%>
Purchases 쿠키를 포함하는 웹 브라우저가 경로 /SalesApp/Customer/Profiles/나 하위 디렉터리에 있는 파일을 요청할 때마다 브라우저가 서버에 쿠키를 전달합니다.
Microsoft Internet Explorer 4.0 이후 버전 및 Netscape 브라우저를 포함하여 여러 웹 브라우저는 쿠키 경로 정보를 보존합니다. 이것은 요청한 파일의 경로 정보가 저장된 쿠키 경로 정보와 다르면 브라우저가 쿠키를 서버로 보내지 않는다는 것을 의미합니다. 예를 들어, ASP에 있어 가상 디렉터리 /TRAVEL과 /travel은 동일한 ASP 응용 프로그램이지만, URL 정보를 보존하는 브라우저에 있어서는 /TRAVEL과 /travel이 서로 다른 두 개의 응용 프로그램입니다. .asp 파일에 대한 모든 URL이 동일한 정보를 지니는지 확인하여 사용자 브라우저가 저장된 쿠키를 전달하도록 합니다.
다음 문을 사용하여 쿠키 경로를 설정하면 응용 프로그램이나 경로와는 상관 없이 브라우저가 서버에서 파일을 요청할 때마다 웹 브라우저가 쿠키를 전달할 수 있습니다.
Response.Cookies("Purchases").Path =
그러나, 특정 응용 프로그램 밖에서 액세스해서는 안되는 민감한 정보가 쿠키에 포함되어 있을 경우에는 응용 프로그램을 구별하지 않은 채 쿠키를 서버에 전달하면 잠재적인 보안 문제를 일으킬 수 있습니다.
모든 브라우저가 쿠키를 지원하지는 않습니다. 쿠키를 지원하는 브라우저를 사용하는 경우에도 쿠키 지원을 해제하고 싶을 수 있습니다. 응용 프로그램이 쿠키를 지원하지 않는 브라우저에 응답해야 할 필요가 있다면 ASP 세션 관리를 사용할 수 없습니다.
이 같은 경우, 자체 메커니즘을 작성하여 응용 프로그램의 페이지 간에 정보를 전달해야 합니다. 일반적으로 두 가지 방법을 사용합니다.
http://MyServer/MyApp/start.asp?name=Jeff
그러나, 하나의 양식이 GET 메서드와 함께 제출되면 일부 브라우저는 쿼리 문자열에 전달된 모든 명시적 매개 변수를 무시합니다.
<FORM METHOD="POST" ACTION="/scripts/inform.asp"> <INPUT TYPE="text" NAME="city" VALUE=""> <INPUT TYPE="text" NAME="country/region" VALUE =""> <INPUT TYPE="hidden" NAME="userid" VALUE= <%= UserIDNum(i) %> <INPUT TYPE="submit" VALUE="Enter">
이 메서드를 사용하려면 사용자 정보를 전달하는 모든 링크 대상을 HTML 양식으로 코드화해야 합니다.
ASP 세션 관리를 사용하지 않으면 응용 프로그램에 대한 세션 지원을 해제해야 합니다. 세션을 사용할 수 있는 경우, ASP는 페이지를 요청하는 각 브라우저에 SessionID 쿠키를 보냅니다. 세션 지원을 해제하려면, 인터넷 정보 서비스 스냅인의 응용 프로그램 옵션 속성 시트에 있는 세션 정보 사용 확인란 선택을 해제합니다.
ASP를 사용하면 필요할 때까지 세션 추적 만들기를 연기하는 데 사용할 수 있는 세션 없는 페이지를 만들 수도 있습니다.
세션 없는 페이지는 다음을 수행하지 않습니다.
세션 없이 .asp 파일을 구성하려면 다음을 사용하십시오.
<%@ EnableSessionState=False %>
이 스크립트는 .asp 파일의 첫 번째 줄에 넣어야 합니다. 이 태그를 생략할 경우, 기본값이 세션 추적을 활성화합니다.
세션 없는 ASP 페이지는 시간이 많이 소요되는 세션 활동을 제거함으로써 서버의 응답 성능을 향상시킬 수 있습니다. 예를 들어, 두 개의 HTML 프레임(예: 한 프레임 집합에 포함되어 있는 프레임 1과 2)을 포함하고 있는 ASP 페이지의 경우를 고려해 보십시오. 프레임 1에는 복잡한 스크립트를 실행하는 .asp 파일이 포함되어 있는 반면, 프레임 2에는 좀더 단순한 .asp 파일이 포함되어 있습니다. ASP는 일련의 순서, 또는 순차적으로 세션 요청을 수행하기 때문에 프레임 1의 스크립트 실행을 마칠 때까지 프레임 2의 내용을 볼 수 없습니다. 그러나, 프레임 1에 대해 세션 없는 .asp 파일을 만들 경우, ASP 요청은 더 이상 순차적으로 실행되지 않고 프레임 1의 컨텐트가 실행을 마치기 전에 프레임 2의 컨텐트가 브라우저에 나타납니다.
서로 다른 프레임에 대한 여러 요청이 처리되는 방식은 사용자의 웹 브라우저 구성에 따라 다릅니다. .asp 파일이 세션 없이 구성되어 있더라도 요청을 순차적으로 처리하는 웹 브라우저도 있습니다.