세션을 이용한 사용자 정의 인증 기능을 구현하기
앞서 구현했던 예제는 쿠키를 이용하여 사용자 정의 인증 기능을 구현해 본 예제였습니다. 그러나 개발자가 직접 사용자 인증 기능을 구현할 경우에는 쿠키 외에도 세션을 사용할 수 있습니다.

세션이란 웹 서버와 접속한 클라이언트 사이에 생성되는 서버의 메모리 공간으로 개별 사용자마다 독립된 세션을 가지게 됩니다. 따라서 개발자가 이 개별 세션에 사용자의 인증 정보를 담아두고 필요할 때마다 확인함으로써 사용자의 인증 여부를 판단할 수 있는 것이지요.

쿠키는 클라이언트의 하드 디스크에 문자열 형태로 보관되기 때문에 유출의 위험성이 세션을 이용하는 것에 비해 높습니다. 그러나 세션을 사용하게 되면 결과적으로 서버의 메모리에 데이터를 저장하는 것이므로 무분별한 데이터의 저장은 결국 웹 서버의 성능 저하로 이어지게 마련이지요.

또한 세션은 쿠키가 브라우저를 종료하거나 또는 일정 시간이 지나면 만료되어 제거되는 것과 달리 생성된 시간 이후로 일정 시간이 지날 때까지 사용자가 페이지를 요청하지 않으면 세션이 파기됩니다. 만일 지정된 시간 내에 다른 페이지를 요청한다면 다시 처음부터 지정된 시간 동안 요청을 대기하게 됩니다.

결국 개발자가 선택할 수 있는 쿠키와 세션 사이에는 각자 일장일단이 존재하는 만큼 잘 생각하고 현재 진행하는 프로젝트에 적합한 방법을 적용해야 할 것입니다.

CustomAuth 프로젝트에 이번에는 WebForm2.aspx 웹 폼 페이지와 SessionLogin.aspx 웹 폼 페이지를 추가해 보겠습니다. WebForm2.aspx 페이지는 SessionLogin.aspx 페이지를 통해 인증 과정을 거친 후에만 접근할 수 있는 페이지이며 SessionLogin.aspx 페이지는 사용자의 인증 정보를 검사하고 이것을 세션에 보관하는 페이지 입니다.

WebForm2.aspx 페이지 구현하기
WebForm2.aspx 페이지는 쿠키를 사용하는 WebForm1.aspx 페이지와 완전히 똑 같은 UI를 사용합니다. 따라서 WebForm1.aspx 페이지의 테이블 및 컨트롤들을 모두 복사하여 WebForm2.aspx 페이지에 붙여 넣기 해도 무방합니다.

다음으로 WebForm2.aspx.cs 파일에 다음의 코드를 추가합니다.

1

private void Page_Load(object sender, System.EventArgs e) {

2

        if (Session.Count <= 0)

3

        Response.Redirect("SessionLogin.aspx?ReturnUrl=WebForm2.aspx", true);

5

 

6

        string data = string.Empty;

7

        foreach(string key in Session.Keys)

8

               data += string.Format("{0}: {1}<br>", key, Session[key]);

9

        label1.Text = data;

10

}

WebForm1.aspx.cs 파일의 코드와 달라진 점을 한 번 찾아봅시다. 2번 라인에서는 인증 통과 여부를 판단하기 위해 Session.Count 속성의 값을 검사하고 있습니다. SessionLogin.aspx 페이지를 통해 인증 과정을 마쳤다면 당연히 세션에 인증 정보가 저장되어 있을 것이므로 Count속성 값이 0보다 큰 어떤 값을 가지게 되겠지요.

따라서 Count 속성 값이 0보다 작거나 같다는 것은 사용자가 인증 과정을 통과하지 않았거나 또는 인증 과정을 통과했다 하더라도 세션 만료 시간 내에 다른 페이지에 대한 요청을 보내지 않아 세션이 파기된 상태라고 생각할 수 있겠지요. 따라서 이 경우에는 3번 라인과 같이 SessionLogin.aspx 페이지로 이동하여 인증 절차를 거치게 합니다.

만일 인증을 완료하고 세션이 아직 활성화 되어 있다면 7번 라인과 같이 foreach 구문을 이용하여 세션에 저장된 모든 키를 가져와 그 값을 Label 컨트롤에 출력합니다.

다음으로 로그 아웃 버튼을 클릭했을 때의 이벤트를 처리할 핸들러 메서드를 다음과 같이 작성합니다.

1

protected void button1_Click(object sender, EventArgs e) {

2

        Session.Abandon();

3

        Response.Redirect("SessionLogin.aspx?ReturnUrl=WebForm2.aspx", true);

4

}

세션을 사용하는 경우 세션 내의 정보를 제거하는 것은 쿠키에 비교해 쉬운 편에 속합니다. 2번 라인과 같이 Abandon 메서드를 호출해 주면 현재 세션에 저장된 모든 키와 값을 제거할 수 있습니다. 물론 Remove 메서드를 호출하여 각 키를 개별적으로 제거할 수도 있습니다.

SessionLogin.aspx 페이지 구현하기
다음은 인증 과정을 실행하고 인증 정보를 세션에 보관하는 SessionLogin.aspx 페이지를 구현해 보겠습니다. 이 페이지 역시 앞서 작성한 Login.aspx 페이지와 완전히 동일한 UI를 제공합니다. 따라서 Login.aspx 페이지의 테이블과 컨트롤을 그대로 붙여 넣기 하여 페이지를 구성해도 무방합니다.

다음으로 SessionLogin.aspx.cs 페이지에 다음과 같이 코드를 추가합니다.

1

protected void button1_Click(object sender, EventArgs e) {

2

        if ((UserID.Value == "admin") &&

3

               (Password.Value == "pass")) {

4

               Session.Add("auth_id", UserID.Value);

5

               Session.Add("nick", NickName.Value);

6

 

7

               if (Request.QueryString["ReturnUrl"] != null)

8

               Response.Redirect(Request.QueryString["ReturnUrl"], true);

9

               else

10

                       Response.Redirect("WebForm2.aspx", true);

11

        }

12

        else

13

               label1.Text = "인증에 실패했습니다.";

14

}

2번 및 3번 라인은 앞서 작성한 예제와 동일한 방법으로 사용자 인증 정보를 확인합니다. 사용자가 올바른 ID와 비밀 번호를 입력했으면 ID와 닉네임을 4번 및 5번 라인의 코드와 같이 Session.Add 메서드를 이용하여 추가해 주면 됩니다.

나머지 코드는 ReturnUrl 쿼리 스트링 변수 값을 이용하여 이전 페이지로 돌아가는 코드입니다.

이상으로 ASP.NET이 제공하는 인증 방법들을 이용하여 사용자 인증 기능을 간단하게 구현해 보았습니다. 지금까지 구현해 본 예제들은 여러분이 실제로 실무에서 사용하기에는 부족한 면이 너무나 많지만 실무에서 활용할 수 있는 기본 개념들은 모두 포함되어 있습니다.

Posted by 초이^^ 트랙백 0 : 댓글 0