ASP.NET 세션 관리 [예제]
⚡ 스마트 요약
ASP.NET 세션 관리는 상태를 저장하지 않는 HTTP 애플리케이션이 요청 간에 사용자 데이터를 기억할 수 있도록 합니다. 이 문서에서는 ViewState, 키-값 쌍을 저장하는 Session 객체, 실제 작동 예제, 세션 상태 모드, 타임아웃 구성 및 세션 상태의 장점에 대해 설명합니다.
ASP.NET 세션 관리
모든 웹 애플리케이션이 작동하는 HTTP 프로토콜은 상태 비저장 프로토콜입니다. 무상태라는 것은 정보가 한 요청에서 다른 요청으로 유지되지 않는다는 것을 의미합니다.
예를 들어, 이름을 위한 텍스트 상자 하나와 비밀번호를 위한 텍스트 상자 하나가 있는 로그인 페이지가 있다면, 해당 페이지에서 로그인 버튼을 클릭하면 애플리케이션은 사용자 이름과 비밀번호가 다음 페이지로 전달되도록 해야 합니다.
ASP.Net에서는 이러한 기능을 여러 가지 방법으로 구현합니다. 첫 번째 방법은 ViewState라는 개념을 이용하는 것입니다. ASP.Net은 모든 컨트롤의 내용을 ViewState에 자동으로 저장하고, 다음 페이지로 전달합니다. 이는 ViewState라는 속성을 통해 이루어집니다.
개발자가 뷰 상태에서 무엇이든 변경하는 것은 이상적이지 않습니다. ASP.Net에서만 처리해야 하기 때문입니다.
ASP.NET 세션 개체
다른 방법은 "세션 개체"라는 개체를 사용하는 것입니다. Session 객체는 애플리케이션의 수명주기 전반에 걸쳐 사용할 수 있습니다. 세션 개체에 키-값 쌍을 원하는 수만큼 저장할 수 있습니다. 따라서 모든 페이지에서 아래 코드 줄을 통해 Session 개체에 값을 저장할 수 있습니다.
Session["Key"] = value
이 코드는 값을 세션 객체에 저장하며, 'key' 부분은 값에 이름을 지정하는 데 사용됩니다. 이렇게 하면 나중에 해당 값을 검색할 수 있습니다. 값을 검색하려면 아래 명령문을 실행하면 됩니다.
Session["Key"]
ASP.NET 세션 개체 예
이 예제에서는 페이지의 이름 입력란에 입력된 이름을 Session 객체에 저장할 것입니다. 그런 다음 해당 값을 검색하여 페이지에 표시할 것입니다. 아래 코드를 Demo.aspx.cs 파일에 추가해 보겠습니다.
protected void btnSubmit_Click(object sender, EventArgs e) { Session["Name"] = txtName.Text; Response.Write(Session["Name"]); lblName.Visible = false; txtName.Visible = false; lstLocation.Visible = false; chkC.Visible = false; chkASP.Visible = false; rdMale.Visible = false; rdFemale.Visible = false; btnSubmit.Visible = false; }
Code 설명:-
- 첫 번째 코드 줄은 이름 텍스트 상자 컨트롤의 값을 가져와 세션 개체에 저장합니다. Session[“Name”]과 같이 코드를 지정함으로써 해당 속성에 “Name”이라는 이름을 부여하는 것입니다. 속성에 이름을 지정하면 나중에 해당 값을 더 쉽게 가져올 수 있습니다.
- 다음 코드 줄은 Session 개체에서 저장된 값을 검색합니다. 그런 다음 'Response.Write' 메서드를 통해 이 값을 클라이언트에 다시 씁니다.
- 마지막으로 폼의 모든 컨트롤을 숨깁니다. 이렇게 하지 않으면 모든 컨트롤과 응답 값이 함께 표시됩니다.
위와 같이 변경하면 다음과 같은 결과가 나타납니다.
출력:
출력에서 name의 Session 값이 검색되어 브라우저에 표시된 것을 볼 수 있습니다.
ASP.NET 세션 상태 모드
ASP.NET은 세션 데이터를 여러 위치에 저장할 수 있으며, 이를 세션 상태 모드라고 합니다. 선택하는 모드는 성능, 확장성, 그리고 애플리케이션 재시작 시 데이터 유지 여부에 영향을 미칩니다. 아래 표는 각 모드를 비교한 것입니다.
| 모드 | 상태가 저장되는 곳 | 가장 좋은 |
|---|---|---|
| InProc | 웹 서버 메모리에 저장됩니다(기본값). | 단일 서버 애플리케이션; 가장 빠르지만 재시작 시 데이터가 손실됩니다. |
| 상태서버 | 별도의 ASP.NET 상태 서비스 프로세스 | 웹 팜; 애플리케이션 재시작 후에도 유지됨 |
| SQLServer | SQL Server 데이터베이스 | 내구성이 뛰어나고 확장 가능한 상태 관리가 필요한 웹 팜 |
| 관습 | 사용자가 구현하는 사용자 지정 공급자 | Redis와 같은 전문 매장 |
| 떨어져서 | 세션 상태가 비활성화됨 | 세션이 필요 없는 애플리케이션 |
InProc는 기본값이며 가장 빠르지만, 로드 밸런싱 배포의 경우 StateServer 또는 SQLServer를 사용하여 여러 서버에서 세션을 사용할 수 있도록 유지합니다.
ASP.NET에서 세션 시간 초과를 설정하는 방법
세션은 영구적으로 지속되지 않으며, 일정 시간 동안 활동이 없으면 만료됩니다. 웹 설정 파일(web.config)에서 sessionState 요소를 사용하여 이 시간 제한을 설정할 수 있으며, 시간 제한 값은 분 단위입니다.
<configuration> <system.web> <sessionState mode="InProc" timeout="20" /> </system.web> </configuration>
코드로 설정할 수도 있습니다. Session.Timeout = 30;기본 타임아웃은 20분입니다. 타임아웃 시간을 짧게 설정하면 서버 메모리가 더 빨리 해제되고 보안이 향상되는 반면, 타임아웃 시간을 길게 설정하면 사용자가 더 오랫동안 로그인 상태를 유지할 수 있습니다.
세션 상태의 장점과 단점
세션 상태는 편리하지만, 크게 의존하기 전에 고려해야 할 장단점이 있습니다.
장점:
- 상점과 같은 사용자별 데이터를 저장하는 데 사용하기 간편합니다.ping 장바구니 또는 로그인 정보.
- 문자열뿐만 아니라 복잡한 객체도 저장할 수 있습니다.
- 데이터는 서버에 저장되므로 클라이언트 측 저장소보다 안전합니다.
단점 :
- InProc 모드는 서버 메모리를 많이 사용하며 웹 팜 전체로 확장되지 않습니다.
- 세션 데이터는 세션 시간 초과 또는 애플리케이션 재시작 시(InProc 모드에서) 손실됩니다.
- 사용자별로 많은 양의 데이터를 저장하면 부하가 심할 때 성능 저하를 초래할 수 있습니다.



