전화를 이용하여 PC 통신을 사용해본 사용자들이라면 하나의 아이디를 가지고 동시에 서비스에 접속하고자

할 때 한 사용자가 서비스가 중지되는 동시접속 방지의 기능을 본 적이 있을 것이다. 그러나 인터넷의 회원제

사이트에서는 이런 기능들을 찾아보기 힘들 것이다. 인터넷이라는 특성상 강제로 클라이언트를 종료하기 위

한 기능들이 부족하기 때문이다. 그렇지만 실제 상용의 서비스를 하는 사이트라면 한번씩은 이 문제에 대해

서 고민을 하게 된다. 만일 인터넷에서 동시접속을 방지하고자 한다면 어떻게 하면 좋을까? 지금부터 그 방법

을 공개하도록 하겠다.



1) 동시접속 방지의 밑그림



인터넷상에서 동시접속을 방지하고자 하면 어떤 알고리즘을 이용하면 가능할까? 지금부터 동시접속 방지를

위한 밑그림을 그려보겠다. 우선 홈페이지에 접속하는 클라이언트가 가지는 고유한 값이 있는지 알아보아야

한다. 크게 하드웨어적인 IP 주소가 있을 것이고, 서버에서 자동으로 할당되는 SessionID 값 등이 있을 것이

다. 이중 하드웨어적인 클라이언트의 접속 주소를 나타내는 IP 주소를 동시접속 방지의 핵심 키로 이용해 보

도록 하자. 처음 사용자가 접속하여 회원 로그인을 할 때 해당 클라이언트의 IP 주소를 테이블에 저장한다. 한

번 사이트에 접속하였으면 동적 IP를 사용하고 있어도 그 IP의 값이 변경되지 않는다. 이런 IP의 값을 사이트

이용 중 수시로 테이블에 저장되어 있는 값과 동일한지 검사하는 과정을 거친다. 한 사용자가 접속하여 사용

한다면 아무런 문제가 일어나지 않을 것이다. 그러나 동일한 아이디로 다른 사용자가 사이트의 접근을 시도하

는 경우 동시접속 방지의 기능이 수행되게 하여 동시접속을 방지하게 된다. 이미 한 사용자가 neovis라는 아

이디로 접속하여 사용하고 있는 상황에서 다른 사용자가 neovis라는 아이디로 접속을 시도한다고 생각해 보

자. 앞서 로그인 과정에서 클라이언트의 IP 주소를 저장한다고 하였다. 그렇기 때문에 다른 컴퓨터에서 접속

을 하게 되면 이미 저장되어 있는 IP 주소가 현재 접속을 시도하는 사용자의 IP 주소로 변경된다. 이렇게 되면

이미 로그인이 되어 있는 사용자는 어떻게 될까? 사이트 내에서 서비스를 이용할 때마다 현재 클라이언트의

IP 주소와 테이블에 저장되어 있는 값의 비교를 하는 동시접속 체크를 통해 IP 주소가 다른 값을 가지게 때문

에 자동으로 접속을 해제시켜 버리게 될 것이다. 이런 원리를 이용하여 인터넷에서 동시접속을 방지할 수 있

는 것이다.



두 대의 다른 클라이언트 컴퓨터를 사용하여 같은 사용자가 접속을 시도할 경우라도 먼저 접속한 컴퓨터에서

사이트 접속이 해제되기 때문에 서비스의 이용에서 사용자의 불편함은 없다. 또한 동적 IP를 사용하는 경우

나 컴퓨터가 다운되더라도 로그인 과정에서의 동시접속에 대한 확인절차가 없기 때문에 사용자는 아무런 기

능의 제약 없이 사이트로 접근할 수 있는 것이다. 단 두 사람이 동시에 접속할 때에만 체크를 하기 때문에 홈

페이지 상에서 훌륭히 동시 접속 사용자를 방지할 수 있다고 하겠다.



2) 동시접속 방지 모듈 구성하기



동시접속을 방지할 수 있는 방법을 알아보았다. 이런 알고리즘을 이용하여 실제 사이트에 적용할 수 있는 코

드들을 만들어 보도록 하자. 각각의 코드들이 완벽하게 독립적으로 실행되는 것이 아니기 때문에 필요한 곳

에 직접 추가시켜 작업해야 원하는 효과를 얻을 수 있을 것이다.



① 로그인 처리 부분의 IP 주소 저장



회원 테이블이나 다른 로그인에 관련된 테이블에 로그인을 하는 사용자의 IP 주소를 저장하는 부분이 추가되

어야 한다. 단순히 기존의 필드의 값을 수정하는 쿼리문을 추가하면 되기 때문에 구현에 큰 문제점은 없을 것

이다.



----------------------------------------------------------------------------------------------------



strSQL = "update member set IP = '" & Request.ServerVariables("REMOTE_ADDR") & "' where USER_ID = '" &

USER_ID & "'"



IpUpdate = dbCon.execute(SQL)



----------------------------------------------------------------------------------------------------



회원 테이블인 member 테이블에 사용자의 IP 주소를 저장하는 IP 필드에 현재 접속하는 사용자의 IP 주소를

업데이트하는 쿼리문이다. 각 시스템에 맞게 이외의 다른 정보들도 같이 수정할 수 있으니 참고하기 바란다.



② 현재 접속 IP와 저장 IP 비교하기



이렇게 하여 저장된 IP 주소를 이용하여 사이트 이용 중 자신의 현재 IP 주소와 비교하는 과정을 거치게 된다.

실제 IP 주소의 값을 비교하는 코드는 다음과 같다.



----------------------------------------------------------------------------------------------------



<%



if Session("userid") <> "" then



' 접속한 사용자의 IP 주소 필드를 가져와 현재 IP 주소와 비교



strSQL = "select count(user_id) from member "



strSQL = strSQL & " where user_id='" & Session("userid") & "'"



strSQL = strSQL & " and ip = '" & Request.ServerVariables("REMOTE_ADDR") & "'"





Set Count_RS = dbCon.Execute(strSQL)





if Count_RS(0) = 0 then



' 중복 접속한 아이디 처리



' 사용자 사이트 환경에 맞게 에러 구문 처리



end if



end if



%>



----------------------------------------------------------------------------------------------------





위의 코드에서 보듯이 Count_RS(0)의 값이 0이면 처음 로그인을 하였을 때의 IP 주소와 현재 사용하고 있는 IP

의 주소가 다른 경우를 나타낸다. 이런 경우에는 앞서 살펴보았듯이 동일한 아이디로 접속하고 있는 경우이

기 때문에 해당 사용자에게 현재의 아이디가 중복 사용되고 있다는 메시지와 비밀번호 교환을 당부하는 메시

지를 출력하면서 현재 접속되어 있는 세션을 끊고 사이트의 처음으로 다시 이동하면 된다. 실제 이 부분의 코

드는 각 해당 사이트마다 환경이 다르므로 직접 넣어보기 바란다. 그리고 실제 동시접속을 방지하기 위해서

위의 코드를 하나의 파일로 만들어 모든 페이지에 인클루드를 시켜 사용하게 된다면 사이트 내에서 어떤 페이

지로 접속하더라도 중복 사용자 확인 과정을 거치게 되는 것이다. 각 사이트의 환경에 맞게 인클루드를 직접

넣어 테스트를 해 보자.



이렇게 하여 인터넷의 홈페이지에서 하나의 아이디를 가지고 중복으로 접속하는 것을 방지하는 방법에 대해

서 알아보았다. 예를 든 방법은 가장 기초적인 정보만 가지고 이용하기 때문에 부족한 부분이 많이 있을 수 있

다. 각 사이트의 관리자라면 IP 주소 이외의 기타 접속 시간이나 클라이언트의 환경을 저장하여 다양한 방법

으로 비교를 수행하는 방법들도 고려하여 모듈을 이용하면 더욱더 좋은 결과를 얻을 수 있을 것이다.
2009/05/26 13:41 2009/05/26 13:41

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다