본문 바로가기

Microsoft/C# & ASP.NET

SQL 서버를 이용한 ASP.NET 세션관리[펌]

소프트웨어 개발, 특히 웹서비스를 꾸려나가는데 있어서 소규모 팀 혹은 개인이 단독으로 진행하다보면 눈 앞의 일들을 처리하는데 쫓겨, 서비스의 기반이라 할 수 있는 플랫폼, 설정 같은 민감한 부분의 대처를 미루는 경향이 생기는 것 같습니다.

저의 경우에는 ASP.NET 프로젝트에 있어서 세션관리방식이 그러했습니다. 매우 민망하게도.. 늘 /App_Code 아래의 .cs 파일을 수정할 때마다 고객이 로그아웃된다는 것을 알면서도, 되도록 야간에 유지보수하고 정말 급할 땐 가끔 주간에 코드를 수정했습니다. (아이 민망해라-_-)

하지만 얼마 전 본격적인 서비스를 가동하면서 잦은 코드 개선요구로 인해 기존처럼 해서는 안되겠다는 생각에 세션상태방식을 바꾸기로 결정했습니다.

그래서 찾은 방법이 바로 SQL Server 세션 상태 방식(Session State Mode).

짧게 설명하면 IIS 웹서버가 관리하던 세션 데이터를 SQL Server에 넣고 관리합니다.
장점은 IIS가 해당 웹사이트를 재시동해도 세션은 DB에 남아있기에 사이트가 다시 작동하면서 사용자 요청 받기 시작할 때 여전히 세션이 살아있다는 점입니다.

절차는 이렇습니다.

가) 명령어로 MS SQL Server에 ASP.NET 세션을 관리해줄 ASPState 데이터베이스를 생성합니다. 필요한 테이블, 저장 프로시저 등은 자동으로 만들어집니다.

명령어 - C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql -S localhost -U sa -
P your-password -ssadd -sstype p

저 같은 경우는 생성만 sa로 하고 운영아이디는 sa로 설정하지 않았습니다.

대신 저처럼 다른 계정으로 운영하시려면 ASPState의 db_owner 스키마까지는 필요없지만, db_datareader와 db_datawriter 역할은 필요합니다.

그리고 추가로 자동 생성되는 프로시저들에 대한 Execute 권한을 부여해야만 에러가 발생하지 않습니다.

 - 조금 헤맸습니다. -ㅅ-.



















나) 그리고 web.config 파일의 세션 항목을 설정해줍니다.

<system.web>
    <sessionState mode="SQLServer" sqlConnectionString="Server=(local); user id=ASPNETSS; password=what?" cookieless="false" timeout="80" />

이렇게만 해주면 된다니.. 참, 쉽죠잉? ^^a

*참고사항
윈도 운영체제 - 서비스의 ASP.NET State Service를 굳이 실행하지 않아도 SQLServer 모드는 동작합니다



ASP에서는 세션이 프로세스상에서 만 관리 되었다. ASP.NET도 프로세스에서 저장하고 관리하는 것이 기본 옵션이다. 그러나 ASP.NET은 추가적인 Session 관리 방식을 제공하고 있다.

크게 in-process 모드와 out-process 모드 두 가지로 분류된다.

in-process 는 위에서 말한 어플리케이션 프로세스 안에 저장 되고 관리 되는 형식의 기본 세션 관리 방식이다. (전원을 끄거나 IIS 다시 시작 하면 세션 정보가 모두 지워진다. 세션 정보의 공유도 불가능하다.)

out-process 방식은 또 2가지로 나누어 진다. SQL 을 이용한 방식과 Session State Server를 이용한 방식이다.

항목in-processout-process
IIS재시작세션정보 사라짐세션정보 유지
세션정보공유불가부분적으로 가능
설정<방식간단복잡

여기에서는 out-process 방식 중 SQL을 이용한 방식에 대한 세션관리의 설정 방법을 설명 하려고 한다.

1. web.config 설정

<configuration>
<system.web>
<sessionState mode="SQLServer"
sqlConnectionString="data source=[서버이름];
user id=[sql접근계정];
password=[접근비밀번호];"
cookieless="false"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
mode
- 우리는 SQLServer 모드를 사용 할 것이기 때문에 SQLServer 라고 적어준다.

sqlConnectionString
- [서버이름] 에 sql서버의 주소를 적어준다.
- [sql접근계정] 에는 sql 서버에 접속할 계정을 적어주고,
- [접근비밀번호] 에는 비밀 번호를 적어 준다.

cookieless
- 이 옵션은 쿠키를 허용하지 않는 클라이언트에 대해 세션을 사용하기 위한 옵션이다. (세션의 상태를 서버와 클라이언트 동기화를 위한 방법으로 쿠키를 사용하기 때문이다.) 이 부분에 대해서는 다음에 기회가 되면 그때 설명 하고, false 로 설정해서 쿠키를 허용한 많은 사용자를 대상으로 설정하도록 하자.

timeout
- 세션 타임아웃 시간이다.

2. sql server 설정
systemroot\Microsoft.NET\Framework\versionNumber (일반적으로 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 )에보면
  • InstallSqlState.sql
  • InstallPersistSqlState.sql
  • UninstallSqlState.sql
  • UninstallPersistSqlState.sql
4개의 파일을 찾아 볼 수 있다.
SQL을 이용한 방법은 2가지가 있는데 방식은 같지만 세션의 저장 위치가 다르다는 것이다. temp 데이터 베이스를 사용하는 방법과 ASPState 데이터베이스를 생성해 사용하는 방법이다.

temp 데이터 베이스의 경우 서버의 전원을 껐다 킨다든지 하는 SQL 서버의 임시 보관이 지워지면 세션 정보도 역시 지워지게 된다. 그러나 ASPState 를 사용하는 경우 전원을 껐다 켜도 세션에 대한 정보가 살아 있게된다.

InstallSqlState.sql은 임시 데이터베이스에서 작동하도록, InstallPersistSqlState.sql 은 ASPState 데이터 베이스에서 작동되도록 하는 쿼리 파일이다. 자신에게 맞는 쿼리를 실행하면 된다. uninstall은 각각을 제거 하는 것 쿼리로 구성된다.

모드를 변경 할 경우에는 UnInstall을 실행 하고 나서 새로운 모드를 설치 해야 한다.

installSqlState.sql 또는 InstallPersistSqlState.sql 파일을 쿼리 분석기를 이용해서 master에서 실행한다.

그리고 세션 서버에 접속할 계정을 sql 서버에 생성 하고, ASPState, tempdb 해당하는 데이터베이스에 dbo 권한으로 접근 할 수 있도록 설정 하면 된다.

이렇게 해서 세션 서버 설정이 끝났다. 세션 사용은 기존의 사용법과 동일 하다.
요렇게 설정을 하고, 세션관련 테이블을 불러다가 보면 아래 그림과 같이 표시된다.

사용자 삽입 이미지
이렇게 사용을 하면 세션에 대한 정보를 수집하기도 편리해진다.
세션 시작 시간, 만료시간, 갱신시간, 갱신 회수 등을 볼 수 있다.
이런 정보를 이용해서 더 좋은 서비스를 만들어 내는 것은 개발자의 몫입니다

'Microsoft > C# & ASP.NET' 카테고리의 다른 글

C# Regular Expression (정규식 기호)  (0) 2012.10.23
리플렉션을 이용한 동적 코드 생성  (0) 2012.09.25
asp.net Callback  (0) 2012.09.21
[Microsoft Enterprise Library 5.0  (0) 2012.09.18
C# Func 와 Action  (0) 2012.09.01