안규 공부방

ACTIVE SERVER PAGE > 끊어지지 않는 세션 만들기

등록일 : 2017-07-04 18:30 조회수 : 93,819

이번내용은 http://www.neovis.pe.kr/ 홈페이지에서 발췌한 자료임을 알려드립니다.

10.1 끊어지지 않는 세션 만들기
회원용 사이트에서 회원 인증을 위해 일반적으로 세션 변수나 쿠키 값을
사용한다. 세션은 서버에 클라이언트마다 변수가 저장되는 형식을 가지고 있으며, 쿠키는
클라이언트에 저장되는 형식을 취한다. 일반적으로 쿠키를 사용할 수 있지만 보안상의
위험이 세션을 사용하는 경우보다 훨씬 높으므로 세션을 주로 사용하게 된다.
지금부터 세션을 이용할 때 발생할 수 있는 여러 가지 문제점들을 알아보고 그것을
해결할 수 있는 방안을 생각해 보도록 하자.

1) 세션은 휘발성 쿠키이다.
세션을 사용하는 가장 큰 장점은 사용자가 접속해 있는 동안에만 유지가 된다는 것이다.
사이트에 접속하여 있는 동안에 유지되고 브라우저가 종료되거나 다른 사이트로
이동하면 세션을 끊어지게 된다.
그러나 이런 장점이 실제 서비스를 하는 사이트에서 불편함을 줄 수 있다. global.asa나
웹 서버에서 설정되는 세션 유지시간은 일반적으로 20분으로 되어 있다. 이 세션
타임아웃 시간인 20분 안에 접속한 클라이언트가 아무런 동작을 하지 않으면 세션은
자동으로 끊어지게 되어버린다.
사이트 내에서의 이동이 자주 일어나면 아무런 문제가 없지만 동영상을 제공하는
사이트나 내용이 긴 컨텐트를 제공하는 사이트라면 20분의 시간은 너무 짧은 것이다.
그렇다고 세션의 타임아웃을 늘려서 서버에 설정하면 서버에 많은 부하를 주는 원인이
되기 때문에 이런 방식의 선택은 하지 않고 있는 실정이다.


이렇듯 우리가 사용하는 세션이라는 것은 서버에 저장되었다가 일정 시간동안 아무런
액션이 없으면 사라지는 휘발성 쿠키라이야기 할 수 있다. 그럼 세션을 사용하는 사이트에서
사용자의 불편을 줄이기 위해 해당 사이트에 접속하고 있는 동안에만 자동으로 유지시켜주는
방법은 없을까? 회원용 사이트에서 사용자들에게 더 좋은 서비스를 위한 방법이니 모두
고민해 보도록 하자.

2) 끊어지지 않는 세션 만들기
세션을 끊어지지 않게 유지하는 방법을 지금부터 알아보도록 하자. 우선 앞서
이야기하였듯이 세션 타임아웃의 변경은 없어야 할 것이다. 이런 조건을 만족
시켜주는 방법은 과연 무엇일까?

우선 세션이 유지되는 원리를 살펴보자. 세션이 처음 할당된 후 세션 타임아웃
이내에 클라이언트가 웹사이트 내에서 다른 페이지로 이동한다든지 새로 고침과
같은 일정 액션을 취하면 세션은 다시 할당되게 된다. 즉 세션의
타임아웃 시간만큼 다시 그 세션 변수를 사용할 수 있는 것이다. 이런 원리를
이용하여 세션이 끊어지지 않게 하는 방법을 만들 것이다.
즉 사용자가 해당 웹 페이지를 단순히 오픈만 하고 있어도 세션의 타임아웃
이전에 자동으로 세션을 할당하면 되는 것이다. 이것이 바로 해결책이다. 이해가 가는가?

지금까지 길게 설명하였지만 한마디로 요약하면 클라이언트가 보는 웹 페이지
에서 자동으로 세션타임아웃 이전에 다시 세션을 할당하면 된다는 것이다.
물론 클라이언트가 웹 브라우저를 종료하거나 다른 페이지를 읽게되면 세션은
끊어지게 될 것이다.
이런 과정을 수행하기 위해서 우리는 메타(meta) 태그를 이용하게 될 것이다.
클라이언트에서 특정 시간을 설정해놓고 그 시간 이후 페이지를 자동으로 읽게
하기 위한 유용한 태그이기 때문이다. 그럼 실제 이용할 수 있는 페이지를 만들어 보자.

3) session.asp 만들기
세션이 종료되지 않는 페이지를 만들어보자. meta 태그를 이용하여 20분 이전에 다시 페이지를
읽어 할당하게 된다.

① 간단한 페이지 만들기

가장 간단한 방법으로 페이지를 만들어 보자. 우선 해당 페이지는 프레임으로 구성되어 있어야 한다.
통으로 되어있는 페이지라면 session.asp 파일이 위치할 수 있도록 프레임을 하나 구성하도록 하자.
프레임을 나누는 페이지를 default.asp라 하고, 실제 세션을 유지하는 페이지를 session.asp라 하자.

● session.asp
----------------------------------------------------------------------------------------------------
<%
Session("name") = Request("name")
Session("userid") = Request("userid")
%>
<meta http-equiv="refresh" content="1140; url=session.asp?name=<%=Session("name")%>
&userid=<%=Session("userid")%>">
----------------------------------------------------------------------------------------------------

세션을 유지시켜주는 기능을 수행하는 페이지이다. 코드를 살펴보자. 우선 프레임을 정의하는 페이지에서
name과 userid에 로그인에 성공한 사용자의 이름과 아이디 값을 전송하게 된다. 프레임으로 정의되어 있기
때문에 처음 페이지가 읽혀지면 두 변수에 값은 할당되어 있게 된다. 이렇게 할당된 값을 다시 세션 변수에
저장하게 된다. 그러면 세션변수에는 Request로 받은 값이 저장되게 되는 것이다. 처음에는 이런 할당이
이루어지게 되고 이후에는 밑에 있는 meta 태그의 부분이 실행된다. meta 태그는 해당 페이지를 자동으로
다시 읽게 하는 기능이 있는데 content 이후의 숫자의 초가 지난 후에 페이지를 다시 읽게 되는 것이다.
즉 세션의 타임아웃이 20분이라 할 때 19분이 지나면 meta 태그에서 설정한 페이지가 자동으로 읽어지게
되는 것이다. url에 정의된 경로를 보자.
현재 읽고 있는 페이지인 session.asp 파일을 다시 읽게 된다. 페이지를 읽으면서 넘겨주는
변수는 name과 userid가 넘어가고 있다. 이제 어떻게 구성되는지 이해하겠는가?

처음 홈페이지에 접속한 뒤 로그인을 거치게 되면 프레임을 정의하는 페이지에서 session.asp로 사용자
아이디와 이름을 넘겨주게 된다. 이렇게 넘어온 아이디와 이름을 이용하여 곧바로 세션 변수로
할당하게 된다.
이런 상태로 해당 페이지가 19분이 지나게 되면 다시 session.asp 페이지를 읽게된다.
이때에는 meta 태그에서 정의한 사용자 이름과 아이디를 세션 변수에서 가져와 넘겨주게 된다. meta 태그를
이용하여 다시 session.asp를 읽게 되면 동일한 이름과 아이디로 세션 변수가 설정되게 된다.
이렇게 반복 실행을 거쳐 해당 페이지가 보여지는 동안에는 세션이 끊어지지 않고 계속 유지되게 된다.
이렇게 유지되는 세션을 이용하여 사용자는 접속 중간에 세션이 삭제되어 인증 문제를 일으키는 불편함을
격지 않아도 될 것이다.

그럼 실제 프레임을 정의하는 페이지를 살펴보자.

● default.asp
----------------------------------------------------------------------------------------------------
<%@ Language=VBScript %>
<frameset rows="0,177,*" frameborder="no" border="0" framespacing="0">
<frame name="session" scrolling="no" noresize src="session.asp?name=<%=Session("name")%>
&userid=<%=Session("userid")%>" marginwidth="0" frameborder="no">
<frame name="menu" scrolling="no" noresize src="menu.asp"  frameborder="no">
<frame name="main" noresize scrolling="auto" src="main.asp"  frameborder="no">
</frameset>
<html>
<head>
<title>Neovis's ASP</title>
</head>
<noframes>

<body bgcolor="#FFFFFF">
</body>
</noframes>
</html>
----------------------------------------------------------------------------------------------------
프레임을 나누는 첫 페이지의 코드이다. 이곳에서는 session.asp로 처음 아이디와 이름을
전송하는 역할을 수행한다.
넘겨주는 값은 세션 변수를 이용하고 있어 로그인이 되어 있거나 사이트가 오픈되어 있는 중에는 해당 사용자의
아이디와 이름이 전송되고, 처음 로그인이 되면 아무런 값도 넘어가지 않게 된다.
이렇게 하여 세션을 유지하는 가장 간단한 방법을 알아보았다. 로그인이 되면 로그인 처리과정에서 세션값을
할당하고 이것을 이용하여 프레임 셋을 나누는 페이지에서 세션 유지 페이지로 아이디와 이름을 전송하는
모습을 이루는 것이다. 그러나 앞서 이야기했듯이 이 방법은 아주 간단한 방법이라 하였다. 그럼 지금까지
만든 페이지에 문제가 있는 것일까? 각자 한번씩 고민해 보기 바란다.

② 보안처리 session.asp 만들기

앞서 만든 session.asp의 보안 부분을 고민해보자. 우선 default.asp 파일의 소스를 보면 자기의
아이디와 이름을 볼 수 있다. 이런 소스를 이용하여 사용자가 session.asp로 바로 접근을 시도한다면
아무런 여과장치 없이 세션 아이디와 이름의 값이 변경되어 버리는 심각한 보안의 문제가 발생한다.
즉 사용자가 해당 홈페이지에 접근한 뒤 session.asp를 직접 URL에 입력하여 접근을 시도할 때 문제가
발생한다는 것이다. 예를 들어 처음에는 아이디 'neovis'와 이름 '황재선'으로 로그인을 하였다가,
해당 URL에서 [session.asp?name=손님&userid=guest]로 접근하게 되면 세션변수의 값이 바로
변경되는 현상이 일어난다. 간단한 개인 홈페이지에서 사용하는 것이라면 크게 문제되지 않지만
상용의 홈페이지에서는 큰 문제가 되는 것이다.
그럼 이런 보안의 문제를 해결하면서 세션을 유지하는 방법은 없을까?

그 해결책으로 쿠키를 사용하는 방법을 도입해보자. 쿠키라는 것은 클라이언트에 저장되는 데이터이다.
처음 로그인을 할 때 해당 아이디를 쿠키값으로 저장한다. 이렇게 저장되어 있는 쿠키의 값은 해제
시간을 설정하지 않으면 해당 브라우저가 오픈되어 있는 동안에는 유지된다. 이런 특성을 이용하여 세션
유지를 위한 페이지를 오픈할 때 Request로 넘어오는 세션의 값과 처음 로그인 시 설정하였던 쿠키의
값이 같은지 검사하게 된다.
동일한 경우에는 세션을 유지하는 과정을 거치게 되는 것이고, 만일 다른 경우에는 자동으로 접속을
해제하면 된다. 이렇게 작업이 이루어지게 되면 처음 로그인을 한 뒤 session.asp 파일을 다른
아이디와 이름으로 접근하더라도 설정된 쿠키의 값과 전송되는 값이 다르기 때문에
세션이 할당되지 않게 된다. 이런 과정을 거치는 변경된 session.asp 코드를 살펴보자.

● session.asp
----------------------------------------------------------------------------------------------------
<%@ Language=VBScript %>
<%
name = Request("name")
userid = Request("userid")
if userid = Request.Cookies("userid") then
Session("name") = Request.Cookies("name")
Session("userid") = Request("userid")
else
Session.Abandon
end if
%>
<meta http-equiv="refresh" content="1140; url=session.asp?userid=
<%=Session("userid")%>&name=<%=Session("name")%>">
----------------------------------------------------------------------------------------------------

우선 default.asp에서 넘어오는 사용자의 이름과 아이디를 변수에 저장한다.
이렇게 사용자가 직접 입력을 하였거나 로그인을 거쳐 자동으로 전송되어 오는
값들을 저장한 변수를 이용하여 로그인할 때 지정한 쿠키값과 비교를 하게
된다. login_process.asp에서 userid와 name의 쿠키값이 설정되어 있어야 한다.
이렇게 비교를 거치게 되면 사용자가 임의로 입력한 name과 userid에 대해서는
인증을 거치게 되기 때문에 앞의 파일보다는 더 높은 인증 처리 과정을 거치게 된다.

이렇게 하여 끊어지지 않는 세션을 유지하는 페이지를 만들어 보았다. 그러나 이것은
단순한 사이트에 적용할 수 있는 방법일 뿐이다. 복잡한 서비스를 원한다면 인증 처리
부분이 보다 강화되어야 할 것이고, 아이디 이외의 정보들에 대해서는 데이터베이스에서
직접 데이터를 가져와 다시 할당하는 과정을 거쳐야 할 것이다. 직접 응용하여
처리해 보도록 하자.
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.