다음을 통해 공유


ASP.NET 상태 관리 개요

업데이트: 2007년 11월

페이지가 서버에 게시될 때마다 웹 페이지 클래스의 새 인스턴스가 만들어집니다. 일반적인 웹 프로그래밍에서 이러한 작업을 수행하면 각 라운드트립 시 페이지와 해당 페이지에 있는 컨트롤과 관련된 모든 정보가 손실되었습니다. 예를 들어 사용자가 텍스트 상자에 정보를 입력하면 그 정보는 브라우저 또는 클라이언트 장치에서 서버로 보내는 라운드트립에서 손실됩니다.

일반적인 웹 프로그래밍의 이러한 제한을 해결하기 위해 ASP.NET에는 페이지 단위 및 응용 프로그램 단위로 데이터를 유지할 수 있는 여러 가지 옵션이 있습니다. 이러한 기능은 다음과 같습니다.

  • 뷰 상태

  • 컨트롤 상태

  • 숨겨진 필드

  • 쿠키

  • 쿼리 문자열

  • 응용 프로그램 상태

  • 세션 상태

  • 프로필 속성

뷰 상태, 컨트롤 상태, 숨겨진 필드, 쿠키 및 쿼리 문자열은 모두 다양한 방식으로 클라이언트에 데이터를 저장하는 작업과 관련되어 있습니다. 그러나 응용 프로그램 상태, 세션 상태 및 프로필 속성은 모두 서버의 메모리에 데이터를 저장합니다. 시나리오에 따라 각 옵션에는 각각 장단점이 있습니다.

클라이언트 기반 상태 관리 옵션

다음 단원에서는 페이지나 클라이언트 컴퓨터에 정보를 저장하는 상태 관리 옵션에 대해 설명합니다. 이러한 옵션을 사용할 때는 라운드트립 간에 서버에 정보가 보존되지 않습니다.

뷰 상태

ViewState 속성은 동일한 페이지에 대한 여러 요청 사이에 값을 유지하기 위한 사전 개체를 제공합니다. 이것은 페이지에서 라운드트립 사이에 페이지와 컨트롤 속성 값을 유지하기 위해 사용하는 기본 방법입니다.

페이지가 처리되면 페이지와 컨트롤의 현재 상태가 문자열로 해시되어 하나의 숨겨진 필드로 페이지에 저장되거나, ViewState 속성에 저장된 데이터 양이 MaxPageStateFieldLength 속성에 지정된 값을 초과하는 경우에는 여러 개의 숨겨진 필드로 페이지에 저장됩니다. 페이지를 다시 서버에 게시하면 페이지를 초기화할 때 페이지에서 뷰 상태 문자열을 구문 분석하고 페이지의 속성 정보를 복원합니다.

뷰 상태의 값을 저장할 수도 있습니다. 뷰 상태의 사용에 대한 자세한 내용은 ASP.NET 뷰 상태 개요를 참조하십시오. 뷰 상태 사용 시기에 대한 권장 사항은 ASP.NET 상태 관리 권장 사항을 참조하십시오.

컨트롤 상태

컨트롤이 제대로 작동하도록 하려면 컨트롤 상태 데이터를 저장해야 하는 경우가 있습니다. 예를 들어 서로 다른 정보가 표시되는 탭이 여러 개 있는 사용자 지정 컨트롤을 작성한 경우 해당 컨트롤이 예상대로 작동하도록 하려면 컨트롤이 라운드트립 간에 선택되는 탭을 인식해야 합니다. 이를 위해 ViewState 속성을 사용할 수 있지만 개발자가 페이지 수준에서 뷰 상태를 해제하여 컨트롤을 중단시킬 수 있습니다. 이 문제를 해결하기 위해 ASP.NET 페이지 프레임워크는 ASP.NET에서 컨트롤 상태라는 기능을 제공합니다.

ControlState 속성은 컨트롤 관련 속성 정보를 유지하는 데 사용할 수 있으며 ViewState 속성처럼 해제할 수 없습니다.

숨겨진 필드

ASP.NET에서는 HiddenField 컨트롤에 정보를 저장하여 표준 HTML 숨겨진 필드로 렌더링할 수 있습니다. 숨겨진 필드는 브라우저에서 보이도록 렌더링되지 않지만 표준 컨트롤과 마찬가지로 그 속성을 설정할 수 있습니다. 페이지가 서버로 전송될 때는 숨겨진 필드의 내용이 다른 컨트롤의 값과 함께 HTTP Form 컬렉션에 전송됩니다. 숨겨진 필드는 페이지에 직접 저장하는 페이지 관련 정보를 위한 리포지토리 역할을 합니다.

보안 정보:

악의적인 사용자가 숨겨진 필드의 내용을 보고 수정하는 것은 쉬운 일입니다. 중요한 정보나 응용 프로그램이 제대로 작동하는 데 필요한 정보는 숨겨진 필드에 저장하지 마십시오. 자세한 내용은 ASP.NET 상태 관리 권장 사항을 참조하십시오.

HiddenField 컨트롤은 단일 변수를 Value 속성에 저장하며 명시적으로 페이지에 추가해야 합니다. 자세한 내용은 HiddenField 웹 서버 컨트롤 개요를 참조하십시오.

페이지를 처리하는 동안 숨겨진 필드 값을 사용하려면 HTTP POST 명령을 사용하여 페이지를 전송해야 합니다. 숨겨진 필드를 사용하는 경우 페이지가 링크 또는 HTTP GET 명령에 대한 응답으로 처리되면 숨겨진 필드를 사용할 수 없습니다. 사용상의 권장 사항에 대해서는 ASP.NET 상태 관리 권장 사항을 참조하십시오.

쿠키

쿠키는 클라이언트 파일 시스템의 텍스트 파일에 저장되거나 클라이언트 브라우저 세션의 메모리에 저장되는 소량의 데이터입니다. 쿠키에는 서버가 페이지 출력과 함께 클라이언트에 전송하는 사이트 관련 정보가 들어 있습니다. 쿠키는 일시적(특정 만료 시간과 날짜가 지정된)이거나 영구적일 수 있습니다.

쿠키를 사용하여 특정 클라이언트, 세션 또는 응용 프로그램에 대한 정보를 저장할 수 있습니다. 쿠키가 클라이언트 장치에 저장되면 브라우저에서 페이지를 요청할 때 요청 정보와 함께 쿠키의 정보가 전달됩니다. 서버에서 쿠키와 해당 값을 읽을 수 있습니다. 일반적으로는 사용자가 이미 응용 프로그램에서 인증되었음을 나타내는 토큰(대부분 암호화된)을 저장합니다.

보안 정보:

브라우저에서는 쿠키를 처음 만든 서버로만 데이터를 다시 보낼 수 있습니다. 그러나 악의적인 사용자가 쿠키에 액세스하여 그 내용을 읽을 수 있습니다. 사용자 이름이나 암호 같은 중요한 정보는 쿠키에 저장하지 않는 것이 좋습니다. 대신 사용자를 식별하는 토큰을 쿠키에 저장한 다음 그 토큰을 사용하여 서버에서 중요한 정보를 조회하십시오.

쿠키 사용에 대한 자세한 내용은 CookiesASP.NET 상태 관리 권장 사항을 참조하십시오.

쿼리 문자열

쿼리 문자열은 페이지 URL 끝부분에 추가되는 정보입니다. 일반적인 쿼리 문자열의 예는 다음과 같습니다.

https://www.contoso.com/listwidgets.aspx?category=basic&price=100

위의 URL 경로에서 쿼리 문자열은 물음표(?)로 시작되며 "category"와 "price"라는 두 개의 특성/값 쌍으로 되어 있습니다.

쿼리 문자열은 상태 정보를 유지하는 단순하지만 제한적인 방법을 제공합니다. 쿼리 문자열은 제품 번호를 한 페이지에서 다른 페이지로 보내 처리하는 경우처럼 정보를 한 페이지에서 다른 페이지로 전달하는 간편한 방법입니다. 그러나 대부분의 브라우저 및 클라이언트 장치에서 URL 길이는 2083자로 제한됩니다.

보안 정보:

쿼리 문자열을 통해 전달되는 정보는 악의적인 사용자에 의해 무단으로 변경될 수 있습니다. 중요한 데이터는 쿼리 문자열을 통해 전달하지 마십시오. 또한 사용자는 URL을 책갈피로 지정하거나 다른 사용자에게 URL을 보내 URL과 함께 해당 정보를 전달할 수 있습니다. 자세한 내용은 ASP.NET 상태 관리 권장 사항방법: 문자열에 HTML 인코딩을 적용하여 스크립트를 이용한 공격으로부터 웹 응용 프로그램 보호를 참조하십시오.

페이지 처리 과정에서 쿼리 문자열 값을 사용할 수 있으려면 HTTP GET 명령을 사용하여 페이지를 전송해야 합니다. 다시 말해서 HTTP POST 명령에 대한 응답으로 페이지가 처리되는 경우에는 쿼리 문자열을 사용할 수 없습니다. 사용상의 권장 사항에 대해서는 ASP.NET 상태 관리 권장 사항을 참조하십시오.

서버 기반 상태 관리 옵션

ASP.NET에서는 클라이언트에서 정보를 유지하지 않고 서버에서 상태 정보를 유지하기 위한 여러 가지 방법을 제공합니다. 서버 기반 상태 관리를 통해 클라이언트로 전송되는 정보의 양을 줄이면 상태를 유지할 수 있지만 그러면 서버의 리소스를 많이 소모됩니다. 다음 단원에서는 응용 프로그램 상태, 세션 상태 및 프로필 속성의 세 가지 서버 기반 상태 관리 기능에 대해 설명합니다.

응용 프로그램 상태

ASP.NET을 사용하면 HttpApplicationState 클래스의 인스턴스인 응용 프로그램 상태를 사용하여 각 활성 웹 응용 프로그램에 대한 값을 저장할 수 있습니다. 응용 프로그램 상태는 웹 응용 프로그램의 모든 페이지에서 액세스할 수 있는 전역 저장 메커니즘이므로 서버 라운드트립 간에, 그리고 페이지 요청 간에 유지되어야 하는 정보를 저장하는 데 유용합니다. 자세한 내용은 ASP.NET 응용 프로그램 상태 개요를 참조하십시오.

응용 프로그램 상태는 특정 URL이 요청될 때마다 생성되는 키/값 사전에 저장됩니다. 이 구조에 응용 프로그램 관련 정보를 추가하여 페이지 요청 간에 정보를 저장할 수 있습니다.

응용 프로그램 관련 정보를 응용 프로그램 상태에 추가하고 나면 서버에서 이 개체를 관리합니다. 사용상의 권장 사항에 대해서는 ASP.NET 상태 관리 권장 사항을 참조하십시오.

세션 상태

ASP.NET을 사용하면 HttpSessionState 클래스의 인스턴스인 세션 상태를 사용하여 각 활성 웹 응용 프로그램 세션에 대한 값을 저장할 수 있습니다. 개요를 보려면 ASP.NET 세션 상태 개요를 참조하십시오.

세션 상태는 범위가 현재 브라우저 세션까지라는 점을 제외하면 응용 프로그램 상태와 비슷합니다. 서로 다른 사용자가 응용 프로그램을 사용하고 있는 경우 각 사용자 세션은 다른 세션 상태를 갖게 됩니다. 또한 같은 사용자가 응용 프로그램을 끝냈다가 나중에 다시 시작해도 두 번째 사용자 세션은 처음과 다른 세션 상태를 갖게 됩니다.

세션 상태는 서버 라운드트립 간에, 그리고 페이지 요청 간에 유지해야 하는 세션 관련 정보를 저장하기 위한 키/값 사전 구조입니다. 자세한 내용은 ASP.NET 세션 상태 개요를 참조하십시오.

세션 상태를 사용하여 다음 작업을 수행할 수 있습니다.

  • 브라우저 또는 클라이언트 장치 요청을 고유하게 식별하고 이 요청을 서버의 개별 세션 인스턴스로 매핑할 수 있습니다.

  • 동일한 세션 내의 여러 브라우저 또는 클라이언트 장치 요청에 사용하기 위해 서버에 세션 관련 데이터를 저장할 수 있습니다.

  • 적절한 세션 관리 이벤트를 발생시킬 수 있습니다. 또한 이들 이벤트를 활용하는 응용 프로그램 코드를 작성할 수도 있습니다.

응용 프로그램 관련 정보를 세션 상태에 추가하고 나면 서버에서 이 개체를 관리합니다. 지정한 옵션에 따라 세션 정보를 쿠키, out-of-process 서버 또는 Microsoft SQL Server를 실행하는 컴퓨터에 저장할 수 있습니다. 사용상의 권장 사항에 대해서는 ASP.NET 상태 관리 권장 사항을 참조하십시오.

프로필 속성

ASP.NET은 사용자 관련 데이터를 저장할 수 있는 프로필 속성이라는 기능을 제공합니다. 이 기능은 사용자의 세션이 만료될 때 프로필 데이터가 손실되지 않는다는 점을 제외하면 세션 상태와 비슷합니다. 프로필 속성 기능은 일정한 형식으로 저장되며 개별 사용자와 연관되어 있는 ASP.NET 프로필을 사용합니다. ASP.NET 프로필을 사용하면 사용자가 고유한 데이터베이스를 만들어 유지 관리하지 않고도 사용자 정보를 쉽게 관리할 수 있습니다. 또한 프로필은 응용 프로그램의 모든 지점에서 액세스할 수 있는 강력한 형식의 API를 사용하여 사용자 정보를 사용할 수 있도록 합니다. 프로필에는 모든 형식의 개체를 저장할 수 있습니다. ASP.NET 프로필 기능은 형식이 안전한 방식으로 데이터를 사용할 수 있도록 하는 동시에 거의 모든 종류의 데이터를 정의하고 유지할 수 있는 일반 저장소 시스템을 제공합니다.

사용자 프로필을 사용하려면 프로필 공급자를 구성해야 합니다. ASP.NET에는 SQL 데이터베이스에 프로필 데이터를 저장할 수 있도록 하는 SqlProfileProvider 클래스가 포함되지만 프로필 데이터를 사용자 지정 형식, XML 파일 같은 사용자 지정 저장 메커니즘, 심지어는 웹 서비스로도 저장하는 프로필 공급자 클래스를 직접 만들 수도 있습니다.

프로필 속성에 저장되는 데이터는 응용 프로그램 메모리에 저장되지 않으므로 IIS(인터넷 정보 서비스) 다시 시작 및 작업자 프로세스 다시 시작 시에도 데이터가 손실되지 않고 유지됩니다. 또한 프로필 속성은 웹 팜이나 웹 가든에서처럼 여러 프로세스 간에도 유지할 수 있습니다. 자세한 내용은 ASP.NET 프로필 속성 개요를 참조하십시오.

참고 항목

개념

ASP.NET 상태 관리 권장 사항

ASP.NET 쿠키 개요

ASP.NET 뷰 상태 개요

ASP.NET 세션 상태 개요

ASP.NET 응용 프로그램 상태 개요

ASP.NET 프로필 속성 개요