본문 바로가기
마루아라는 개발쟁이/ASP

같은 아이디로 동시접속 하는걸 방지하는 방법

by 마루아라 이야기 2022. 12. 6.

이 방법을 대한 정보를 얻을려고 정말 여러군데의 게시판 QnA를 돌아다니면 정보를 모아봤습니다.

근데 정작 중요한 건 100%의 답은 없다는 것입니다.

저도 지금 제가 하는 방법이 완벽한 방법이라고 자신 있게 말 할 수는없지만 꼼수로 사용하기에는 부족함이

없다고 생각 합니다. 사설이 길었네요.^^



1. 로그 테이블을 만듭니다.

     컬럼으로는 idx(자동증가키)컬럼, 아이디컬럼, 저장시간(now())컬럼, session.sessionID컬럼

2. 로그인 처리 페이지에서

    session("userid") = "아이디값" 과 request.cookie("tmpUserid") = "아이디값"

    세션과 쿠키에 각가 아이디 값을 담습니다.

    세션을 끊는 방법은 session.Abandon()과 세션만료시간이 지나는 겁인데

    참고로 session.Abandon()을 하더라도 session.sessionId값이 남아있습니다.



    로그 테이블에 테이터를 저장 시킵니다.



3. 최초접속파일(index.asp나 index.htm)을 0픽셀 프레임을 포함한 프레임셋을 만듭니다.

   0픽셀 페이지 body에 onload이벤트와 onunload이벤트를 만듭니다.

   onunload이벤트가 발생할때 로그테이블의 테이터를 삭제합니다.

   이때 삭제구문은 :

   DELETE  FROM  로그테이블

WHERE id = user_id

AND idx in (select top 1 idx from 로그테이블 where  id = user_id)

   아이디 값을 비교해서 삭제시켜 주는데 서브쿼리를 이용해서 일치하는 값의 최상의 한컬럼 삭제 합니다.

   새로고침을 하게되면 onload이벤트 부터 발생하기 때문에 컬럼에 데이터가 먼저 삽입됩니다.





  onload 이벤트가 발생하면

  쿠키값과  세션값 두값이 모두 공백이 아닐때만 삽입을 합니다.

  (즉 if request.cookie("tmpUserid") <> "" and session("userid") <> "" Then 데이터 인서트 end if)



4. 그럼 이제 사용자가 페이지를 빠져나갈때의 경우의 수를 살펴보겠습니다.

  1) 로그아웃 버튼을 눌러서 정상적으로 빠져나간다.

     이때는 session.sessionID값과 일치하는 테이블을 삭제시켜 주면됩니다.

아까도 말했듯이 session.Abandon()을 하더라도 session.sessionID값은 사라지지 않습니다.



  2) 로그아웃을 하지않고 윈도우의 x를 눌러서 빠져나간다.

     이때는 onunload이벤트가 발생하면서 request.cookie("tmpUserid")의 값과 동일한 아이디가

있는컬럼을 삭제합니다.

쿠키에 값을 저장하면 timeout을 지정하지 않는이상 페이지를 빠져나가기 전까지는 쿠키값이 사라

지지 않습니다.



  3) 새로고침을 하게 되면

     이때는 onload이벤트가 세션값도 있고 쿠키값도 있을때만 로그테이블에 삽입을 하게 됩니다.



  4) 세션값이 timeout되어서 소멸될때

     session값이 공백일때 시작페이지를로 새로고침되게 합니다.

자바스크립트를  parent.location.href = "index.htm"  이용하면 됩니다.

그럼 시작페이지에서 onunload가 되면서 컬럼은 삭제되지만

세션값이 없기때문에 onload가 되어서 컬럼은 삽입되지 않는다.





* 각페이지마다 새세을 체크하는 구문이 있어야 함.



  5) 정전이라든지 윈도우 에러로 예기치 못한 상태에서 페이지가 꺼질때는 ... 이때는 어쩔수 없습니다.

     전 login.asp파일 상단에 시간을 비교해서 입력된지 4시간이상되는 로그컬럼은 삭제되도록 제약을 걸어

놨습니다.

이때 발생할 수 있는 문제가 4시간 동안 로그인을 할 수 없다는 문제와,

4시간 이상사용하면 중복로그인이 될 수 있다는 문제가 있을 수 있습니다.

머리를 더 싸메면 더 좋은 방법이 있을 수 있겠지만 실무에서 일하고 있는이상 이문제로 언제까

지 시간을 잡아먹을 수는

없는 노릇이라서 여기까지만 생각 했습니다.



### 이건 어떻게 보면 간단한 방법인데. 퍼포먼스는 모르겠습니다.

로그테이블 만드는 것은 위의 것과 같고.

각 페이지를 옮길때 마다 로그테이블의 시간을 업데이트 시킵니다.

그리고 로그인 테이블에 시간을 비교해서 30분 이상된 로그는 자동 삭제시키는 것입니다.



주저리 주러리 말이 길었습니다. 그럼 조금이라도 프로그래밍의 도움이 되길 바라며 즐프하세요!!!
출처 : http://www.taeyo.pe.kr/

728x90
반응형
LIST