웹 페이지와 해당 컨트롤에 대한 상태 정보를 유지 관리하는 것이 필요합니다. 그러나 웹 애플리케이션은 상태 비저장 프로토콜인 HTTP 프로토콜을 기반으로 구축되므로 상태 정보를 유지하는 것이 매우 어려워집니다. 이러한 문제를 해결하기 위해 ASP.NET 2.0 기술은 세션, 쿠키, 뷰 상태, 제어 상태, 숨겨진 필드, 쿼리 문자열, 개인화된 사용자 구성(프로필) 등을 사용하는 등 다양한 솔루션을 제공합니다. ASP.NET 2.0 기술을 사용하여 서버 컨트롤을 만들려면 상태 정보를 유지하는 것도 매우 중요합니다. 주요 솔루션은 뷰 상태와 컨트롤 상태를 사용하는 것입니다. 본 글에서는 뷰 상태(ViewState)에 대한 기본 지식을 자세하게 설명하고, 일반적인 응용을 통해 뷰 상태를 적용하는 방법을 소개합니다.
보기 상태 개요
보기 상태는 페이지와 페이지의 컨트롤이 서버에서 클라이언트로, 그리고 클라이언트에서 다시 왕복하는 동안 상태 정보를 유지할 수 있도록 하는 매우 중요한 기술입니다. 이러한 방식으로 웹과 같은 무상태 환경 위에 상태를 유지하고 지속적으로 실행되는 페이지 효과를 생성할 수 있습니다. 이 섹션에서는 주로 작동 메커니즘, 응용 프로그램 방법, 저장된 데이터 유형, 성능 및 보안, 뷰 상태 차단(ASP.NET 2.0의 새로운 기능), 뷰 상태의 장점과 단점을 소개합니다.
(1)
실행 메커니즘의 보기 상태에 대한 구체적인 실행 프로세스는 다음과 같습니다. 사용자가 .aspx 페이지를 요청할 때마다 .NET 프레임워크는 먼저 관련 컨트롤의 상태 데이터를 문자열로 직렬화한 다음 이를 다음과 같은 이름의 파일로 만듭니다. __VIEWSTATE 숨겨진 필드의 Value 값이 클라이언트로 전송됩니다. 페이지가 처음으로 요청되면 서버 컨트롤도 처음으로 실행됩니다. __VIEWSTATE라는 숨겨진 필드에는 일반적으로 비어 있거나 null인 컨트롤의 기본 정보만 포함됩니다. 후속 포스트백 이벤트에서는 이전 포스트백에서 사용 가능한 서버 컨트롤의 속성 상태가 ViewState에 저장됩니다. 이를 통해 서버 컨트롤은 현재 처리되는 포스트백 이벤트가 발생하기 전에 상태를 모니터링할 수 있습니다. 이러한 프로세스는 .NET 프레임워크에 의해 처리되며 사용자의 경우 .aspx 페이지를 실행하면 연속 실행 효과가 나타납니다.
(2) 저장된 데이터 유형
뷰 상태는 여러 유형의 데이터를 저장할 수 있으며, 운영 효율성을 높이기 위해 뷰 상태 자체에도 공통 유형에 최적화된 직렬화 방법 세트가 포함되어 있습니다. 기본적으로 뷰 상태 직렬화 방법에서 지원하는 데이터 유형에는 String, Int32, Unit, Color, Array, ArrayList, HashTable 및 사용자 정의 유형 변환기 TypeConverter가 포함됩니다.
뷰 상태는 위에 나열된 유형을 포함하는 Array, ArrayList 및 HashTable 개체에 대해 최적화되었습니다. 따라서 컨트롤에서 뷰 상태를 사용할 때는 위의 단순 데이터 유형과 최적화된 유형으로 사용을 제한해야 합니다. 여기서는 값 유형을 다른 유형으로 변환하고 표준 값 및 하위 속성에 액세스하는 통합 방법을 제공하는 사용자 정의 유형 변환기 TypeConverter에 중점을 두어야 합니다. 예를 들어 TypeConverter를 사용하여 문자열을 숫자 값으로 변환하거나 숫자 값을 문자열로 변환할 수 있습니다. 유형 변환기가 없는 경우 페이지 프레임워크는 .NET 프레임워크에서 제공하는 이진 직렬화 기능을 사용하여 개체를 직렬화합니다. 이 프로세스는 리소스를 많이 소모합니다.
(3) 성능 및 보안
뷰 상태를 사용할 때 개체를 먼저 직렬화한 다음 포스트백을 통해 역직렬화해야 합니다. 따라서 ViewState 성능에 대해 알아야 합니다. 기본적으로 컨트롤의 ViewState는 활성화되어 있습니다. ViewState를 사용할 필요가 없으면 끄는 것이 가장 좋습니다. 다음 상황에서는 ViewState가 더 이상 필요하지 않습니다. (1) 컨트롤이 서버 측 이벤트를 정의하지 않습니다(현재 컨트롤 이벤트는 모두 클라이언트 측 이벤트이며 포스트백에 참여하지 않습니다). 동적 또는 데이터 바인딩된 속성 값이 없습니다. 보기 상태를 끄는 방법은 컨트롤의 EnableViewState 값을 "false", 즉 EnableViewState="false"로 설정하는 것입니다.
기본적으로 보기 상태와 관련된 콘텐츠가 컴파일되어 클라이언트로 전송되면 독자는 페이지의 HTML 코드에서 __VIEWSTATE 숨겨진 필드 콘텐츠를 볼 수 있습니다. 이는 의미 없는 문자열이며 Base64 인코딩을 통해 관련 콘텐츠를 인코딩하는 .NET 프레임워크의 결과입니다. 클라이언트와 서버 간에 일반 텍스트로 주고받으며 전송됩니다. 비밀번호, 계정, 연결 문자열 등과 같은 민감한 콘텐츠가 관련된 경우와 같은 경우에는 기본 방법을 사용하는 것이 매우 안전하지 않습니다. 이를 위해 .NET 프레임워크는 ViewState에 대해 두 가지 보안 메커니즘을 제공합니다.
확인 메커니즘:
EnableViewStateMAC="true" 특성을 설정하여 .NET 프레임워크에 ViewState 데이터에 해시 코드를 추가하도록 지시할 수 있습니다(해시 코드는 A입니다). 길이가 160비트인 SHA1 유형이므로 실행 성능에 심각한 영향을 미칩니다.) 포스트백 이벤트가 발생하면 해시 코드가 다시 설정되며 원래 해시 코드와 일치해야 합니다. 이를 통해 전송 과정에서 ViewState가 변조될 수 있는지 여부를 효과적으로 확인할 수 있습니다. 기본적으로 .NET Framework는 SHA1 알고리즘을 사용하여 ViewState 해시 코드를 생성합니다. 또한 아래와 같이 machine.config 파일에서 <machineKey>를 설정하여 MD5 알고리즘을 선택할 수도 있습니다: <machineKey 유효성 검사="MD5" />. MD5 알고리즘은 SHA1 알고리즘보다 성능이 좋지만 보안 수준도 충분하지 않습니다.
· 암호화 메커니즘은
암호화를 사용하여 ViewState 필드의 실제 데이터 값을 보호합니다. 먼저 위에서 설명한 대로 EnableViewStatMAC="true"를 설정해야 합니다. 그런 다음 machineKey 유효성 검사 유형을 3DES, 즉 <machineKey 유효성 검사 키="AutoGenerate" decryptionKey="AutoGenerate" 유효성 검사="3DES" />로 설정합니다. 이는 ASP.NET에서 3DES 암호화 알고리즘을 사용하여 ViewState 값을 암호화하도록 지시합니다.
(4) 뷰 상태 차단
위 내용은 뷰 상태에 대한 몇 가지 기본 지식을 소개합니다. 그러나 일부 독자들은 혼란스러울 수 있습니다. 어떤 경우에는 뷰 상태 데이터가 매우 커지면 어떻게 될까요? 이는 분명히 의도하지 않은 결과를 초래할 것입니다. 이를 위해 ASP.NET 2.0에는 "상태 보기 차단"이라는 새로운 기능이 추가되었습니다. 보기 상태의 데이터 양이 너무 커지면 보기 상태 청크는 자동으로 데이터를 여러 청크로 나누고 숨겨진 여러 양식 필드에 데이터를 배치합니다.
보기 상태 청크를 활성화하려면 MaxPageStateFieldLength 속성을 단일 보기 상태 필드에 허용되는 최대 크기(바이트)로 설정합니다. 페이지가 서버에 다시 게시되면 페이지는 페이지 초기화 단계 중에 보기 상태 문자열을 구문 분석하고 페이지의 속성 정보를 복원합니다. 기본 설정은 -1입니다. 이는 최대 크기가 없으며 보기 상태가 청크로 분할되지 않음을 의미합니다.
(5) 장점 및 단점
뷰 상태를 사용하면 다음과 같은 세 가지 장점이 있습니다. 1. 응용 프로그램 및 세션에 비해 서버 리소스를 덜 소모합니다. 보기 상태 데이터가 클라이언트 컴퓨터에 기록되기 때문입니다. 2. 유지 관리가 쉽습니다. 기본적으로 .NET 시스템은 제어 상태 데이터의 유지 관리를 자동으로 활성화합니다. 3. 보안 기능이 강화되었습니다. 뷰 상태의 값은 유니코드 구현에 대해 해시, 압축 및 인코딩되므로 숨겨진 필드를 사용하는 것보다 더 안전합니다.
뷰 상태를 사용하면 다음과 같은 세 가지 단점이 있습니다. 1. 성능 고려 사항. 보기 상태는 페이지 자체에 저장되기 때문에 큰 값이 저장되면 보기 상태가 청크되어 있어도 페이지를 표시하고 보낼 때 사용자의 속도가 느려질 수 있습니다. 2. 장비 제한. 모바일 장치에는 대량의 보기 상태 데이터를 저장할 메모리 용량이 충분하지 않을 수 있습니다. 따라서 장치에서 서버 컨트롤을 이동할 때 다른 구현 방법이 사용됩니다. 3. 잠재적인 보안 위험. 보기 상태는 페이지의 하나 이상의 숨겨진 필드에 저장됩니다. 뷰 상태는 데이터를 해시된 형식으로 저장하지만 변조될 수 있습니다. 페이지 출력 소스를 직접 보면 숨겨진 필드의 정보를 볼 수 있어 잠재적인 보안 문제가 발생할 수 있습니다.
일반적인 애플리케이션
ASP.NET 2.0 기술을 사용하여 서버 컨트롤을 개발하는 과정에서 뷰 상태를 사용할 수 있는 측면이 많이 있습니다. ViewState 사전을 사용하여 서버 컨트롤 속성을 구현하는 것이 일반적입니다. ViewState는 System.Web.UI.StateBag 유형입니다. 서버 제어 속성 값을 저장할 수 있는 키/값 쌍 사전입니다. 다음은 일반적인 예를 사용하여 ViewState의 적용 방법을 보여줍니다.
사용자 지정 서버 컨트롤 LabelInViewState에서는 두 가지 속성 Text 및 TextInViewState가 구현됩니다. 전자는 개인 변수를 사용하여 생성되고 후자는 ViewState를 사용하여 구현됩니다. 이들은 모두 텍스트 내용을 가져오거나 설정하는 데 사용됩니다. 커스텀 컨트롤 구현 파일 LabelInViewState.cs의 소스코드는 다음과 같습니다.
시스템 사용;System.Collections.Generic 사용; System.ComponentModel 사용;System.Text 사용; System.Web 사용; System.Web.UI 사용; System.Web.UI.WebControls;네임스페이스 WebControlLibrary{ 사용 [DefaultProperty("텍스트")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] 공개 클래스 LabelInViewState : WebControl { private string _text; //Text 속성 구현 public string Text { 얻다 { return (_text == null) ? string.Empty : _text; } 설정 { _text = 값 } } //ViewState를 사용하여 TextInViewState 속성 구현 public string TextInViewState { 얻다 { String s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty : s); } 설정 { ViewState["TextInViewState"] = 값 } } // RenderContents 메서드를 재정의합니다. protected override void RenderContents(HtmlTextWriter 출력) { output.Write("텍스트 = "); 출력.쓰기(텍스트); 출력.쓰기("<br/>"); output.Write("TextInViewState = "); 출력.쓰기(TextInViewState); } } } |
<%@ 페이지 언어="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ 네임스페이스 등록="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <스크립트 runat="서버"> void Button1_Click(객체 전송자, EventArgs e) { 데모라벨.텍스트 = TextBox1.Text; decoLabel.TextInViewState = TextBox2.Text; } </스크립트> <html xmlns="http://www.w3.org/1999/xhtml"> <헤드 runat="서버"> <title>뷰 상태 ViewState 사용 </title> </머리> <바디 스타일="글꼴 크기: 작음;"> <form id="form1" runat="server"> <div> 이름: |
페이지에 표시된 위 코드에는 두 개의 텍스트 상자, 두 개의 단추 및 사용자 지정 서버 컨트롤 LabelInViewState가 포함되어 있습니다. 이벤트 핸들러 Button1_Click에 표시된 것처럼 "제출" 버튼을 클릭하면 LabelInViewState 컨트롤이 텍스트 상자의 텍스트를 가져와 표시합니다. 애플리케이션 렌더링은 그림 1과 2에 나와 있습니다.
그림 1 제출 버튼 클릭 | 그림 2 새로고침 버튼 클릭 |