WEB개발

동시접속 차단을 위한 방법..ASP

스쿠터로세계일주 2013. 7. 25. 23:59

동접 막는 방법...참...구하기 힘들다. 결국 날코딩으로 걍 만들었다.


우선 검색해보면 별별방법이 다 있다. 쿠키에 세션아이디를 저장해서 하나느니..

아이피를 이용하는건 어쩌느니...

디비에 저장해놓고 어쩌고.. 다들 어쩌고..뿐이다. 그래서 뭐 어쩌라고..어찌알라고??;;;


동접을 막는 방법을 ASP에서 구현하려면, IIS에서 세션아이디로 해당 세션아이디의 연결을 다 끊어버리는게 있으면 매우 매우 좋겠으나! (디비에서 프로세스아이디로 작업을 종료하듯..) 없다고..없어..없음..없을랑가몰라~


결국 디비를 이용해야 한다. 여기서 문제. 그럼 기준을 세션아이디로 하느냐. 아이피로 하느냐?


순수한 동접차단은 세션아이디로 해야한다. 문제는 동일 피씨에서 열어도 브라우저가 달라지면 세션도 달라져서 다른것 끊어버린다는것..ㄷ ㄷ ;;;


그래서 좀 오픈마인드로 동일 아이피혹은 동일 아이피대역대까지는 봐주면서 해줄수도 있겠으나..그건 선택의 몫이고, 난 세션아이디로 매우 속좁게 만들었다. 우리사이트는 유료사이트니까..;;


방법은 간단하다. 핵심은 세션아이디(아이피를 이용하면 아이피)를 고유값으로 이용해서 로그인시 DB에 저장한다. 아이피, 회원아이디, 세션아이디, 로그인시간 등등..정보를 저장


그리고 같은 아이디로 접속한 기록이 있는지(DB)에서 살펴본다.  세션아이디가 같다면 상관 없지만 세션아이디가 다른 동일아이디 접속기록이 있으면? 디비에서 해당 세션아이디의 기록을 지워버린다.


그렇다면..디비에서 지웠는데 어떻게 접속한 다른 컴터의 세션이 끊기냐고??

당 연 히 페이지를 열때마다 디비에 접속에서 세션정보를 확인해야 한다. 함수하나 만들어놓고, 공통페이지에 세션체크하는 기능을 실행해주면 된다.


우와? 매 페이지 접속마다 세션체크한다고 디비에 접속하면 과부하걸려 사이트 죽는거 아닌감?....지금이 90년대도 아니고..서버가 286도 아니고...쿼리문에 with(nolock) 만 넣어도 과부하 걸릴일 없다. 


이렇게 하는게 가장 확실한 방법이고 그냥 이렇게 구현했다. 울 사이트는 유료사이트라..아이디비번 뿌리면 X망하는거다.


대충 소스는..페이지마다 접속해서 확인하는 ASP 함수는..

이 소스의 쿼리실행은 DBH 프레임웍을 이용한건데..인터넷에서 구한거라..


'========================================================================

'   동시접속을 막기위한 세션체크

'========================================================================

Sub USP_SESSION_CHECK()


Set DBH = new clsDBHandler '인스턴트 생성 

Call DBH.DBConnection()


Dim Prm(0)


Prm(0) = Array("@bi_uIdx" , adVarChar, adParamInput, 50, Session("bi_uIdx"))


Set SESSIONRs = Server.CreateObject("ADODB.Recordset")


Set  SESSIONRs =  DBH.ExecSPReturnRS("[2013].[dbo].[USP_SESSION_CHECK]", Prm)


If SESSIONRs.EOF = False And SESSIONRs.BOF = False Then 


'Call RW("LOGINRs(0)",LOGINRs(0))


If SESSIONRs(0) <> "" And Not isnull(SESSIONRs(0)) Then


Call RW("SESSIONRs",SESSIONRs(0))

If CStr(SESSIONRs(0)) <> CStr(Session.sessionid) Then

session.abandon()

Session.Contents.RemoveAll()

Call alertMsg("다른 접속으로 인해 접속이 끊어졌습니다. 메인으로 이동합니다.", "goto", "/")


End If 

End If 


End If


End Sub 


'========================================================================

'   동시접속을 막기위한 세션체크

'========================================================================


CALL USP_SESSION_CHECK() '페이지마다 이걸 넣어주면 세션이 겹치면 잘라버린다.




프로시저는



BEGIN TRAN

BEGIN TRY 

/*******************  쿼리영역 *******************/


delete FROM [2013].[dbo].[TBL_LOG_MEM_LOGIN] where bi_Idx in (select top 1 bi_Idx FROM [2013].[dbo].[TBL_LOG_MEM_LOGIN] with(nolock) 

where [bi_memIdx] = @bi_uIdx and vc_SessionId = @vc_SessionId order by [bi_Idx] desc); --테이블에 있는 아이디는 같은데 현재 나와 세션아이디가 다른 기록을 지워버린다.

SELECT TOP 1 [vc_SessionId]  FROM [2013].[dbo].[TBL_LOG_MEM_LOGIN] with(nolock) where [bi_memIdx] = @bi_uIdx order by [bi_Idx] desc;

/*******************  쿼리영역 *******************/

COMMIT TRAN

END TRY

BEGIN CATCH 

IF @@ERROR > 0 

BEGIN

ROLLBACK TRAN 

SELECT '' as [vc_SessionId] ;

END

END CATCH



이 결과값 받아서 잘 처리됐으면 이용하고..그러면 다른컴퓨터는 다른페이지 열때 디비에 자기 세션아이디와 아이디로 접속기록이 없으니까 자동으로 CALL USP_SESSION_CHECK() 함수가 세션을 다 날려버린다.


결론은...이런정도의 작업은 과감히 디비 써주자...프로시져를 잘 짜주면 된다.