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

중복 로그인 처리 방법

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

Login 페이지를 모든 페이지에서 Include 로 사용한다는 가정하에 시작하겠습니다.
그리고 모든페이지에서의 로그인 여부는 로그인시 쿠키에 넣어준 값으로 체크를 합니다.

--------------------------------------------------------------------------
ex.)
if request.Cookies("test")("user_id") <> "" then 혹은 세션을 넣어준 쿠키와 실제 세션값과 비교
  ' 정상 로그인일 경우 처리되는 루틴
  로그인 처리된 로그인 페이지를 보여준다
else
   ' 비정상 로그인일 경우 처리되는 루틴
   로그인 처리안된 그러니깐 아이디와 패스워드를 입력할수 있는 페이지를 보여준다
end if
--------------------------------------------------------------------------

제가 생각한 방법은....

로그인여부에 따른 페이지 (login.asp)
로그인시 정보 저장 페이지 (login_insert.asp)
로그인 여부 체크 페이지 (login_chk.asp) 를 사용합니다.


일단 디비에 Login log 를 저장할수 있는 테이블(login_log 테이블) 을 만듭니다.
member_id 와 sessionid 과 log_time 의 필드를 만들었습니다.

이렇게 한후 로그인 확인시에

member_id와 sessionid 와 log_time 를 디비에 insert 합니다. (login_insert.asp)

그리고 쿠키에 member_id와 sessionid 각각 넣어줍니다.

Response.cookies("test")("User_id") = member_id
Response.cookies("test")("session_id") = session.SessionID

그리고 일단 로그아웃 루틴에서는 로그아웃시 

login_log 테이블에서 member_id 와 sessionid 와 log_time 을 쿠키에 넣은 정보를 이용해 
조건을 걸어주어 Delete 합니다..
그럼 일단은 정상적인 로그아웃시 login_log 테이블에는 접속했던 회원의 정보는 사라지겠죠?


그리고 (login_insert.asp) 에서 한가지 체크 할것이 있습니다
로그인 정보를 login_log 테이블에 insert 하기 전에
(login.asp) 에서 로그인 확인을 눌렀을 경우 넘겨준 
member_id 만을 가지고 login_log 테이블에 조건을 걸어 조회합니다.
그래서 해당 아이디 정보가 login_log 테이블에 있을경우에는 (해당 아이디로 이미 접속중 이란 얘기 겠죠)
현재 아이디와 현재 발생한 세션id 를 login_log 테이블 update 처리 합니다.
없을 아이디와 현재 발생한 세션id 경우에는 insert 합니다.(해당 아이디로 접속중이 아니란 얘기 겠죠)
그렇게 다시 (login_insert.asp) 를 이용해 로긴정보를 디비와 쿠키에 넣었다 칩시다.

그럼 tester 란 아이디로 접속 했다면 tester 란 아이디로 두명이 접속된 상태가 되겠지요???
이제 여기서 필요한 LOGIN_CHK.asp 를 모든 페이지에 인크루드된 login.asp 
안에 또다시 인클루드 합니다.

가장중요한 (login_chk.asp) 입니다.

--------------------------------------------------------------------------
( login_chk.asp 시작)

if trim(request.Cookies("wfhouse")("user_id")) <> "" then 혹은 세션을 넣어준 쿠키와 실제 세션값가 비교
  '''''''''' 쿠키 아이디가 있다는 것은 로그인 상태라는 얘기 겠죠
  '''''''''' 이부분 때문에 서버에 부하가 걸릴지도 모르지만 큰 문제는 없을것 같습니다.
  ''''''''' 매페이지 마다 (login.asp) 를 인쿨르드 하여 (login.asp)에 인클루드한 (login_chk.asp) 
  ''''''''' 도 매 페이지마다 루틴을 타게 되죠..그래서 좀 걸리지만 그래두 뭐.. ^^
    
  위에서 tester 접속한 두명이 같은 아이디와 각각의 세션아이디 쿠키를 가지고 있겠죠?
  로긴정보를 넣어준 login_log 테이블를 현재 member_id 쿠키와 sessionid 쿠키를 조건으로
  조회합니다.그럼 rs.recordcount 나 값의 유무를 가지고 다음 과 같은 루틴을 처리 합니다.   
  
  if rs.rscordcount > 0 then
    '''''' 현재 쿠키의 정보가 login_log 테이블과 일치 할경우
    '''''' 이경우는 두번째 접속자가 정상적인 접속 자라는 얘기가 되겠죠
    '''''' 이럴경우 그냥 ( login_chk.asp) 는 끝나게 되죠..
    '''''' 그래서 두번째 접속자는 어느 페이지를 가던지 정상적으로 이용이 가능 하죠.    
  else
    '''''' 현재 쿠키의 정보가 login_log 테이블과 불일치 할경우
    '''''' 현재 로그인이 비정상적일 경우(다른 컴퓨터나 브라우저에서 로그인 하였을때)
    '''''' 첫번째로 tester 란 아이디로 접속 했을 경우 겠죠..
    '''''' 다음과 같은 루틴을 넣어주고 ( login_chk.asp) 끝나게 됩니다.
    '''''' 먼저 쿠키 정보들을 없애 줍니다.
    '''''' 그리고 메세지를 뿌려 주고 메인 화면으로 넘깁니다.
    '''''' 그러면 쿠키정보가 없기 때문에 메인화면의 로그인 페이지 
    '''''' (login.asp) 는 접속전의 페이지 즉 아이디와 패스워드를 입력하게 하는 페이지가 뜨겠죠 
    '''''' 맨위의 ex) 참고 하시구요 ㅋㅋㅋ 다 아시겠지만..초보분들을 위해..
    
    If Request.Cookies("test").HasKeys Then
         Response.Cookies("test")("user_id")=""
         response.expires=0
         Response.Cookies("test").Expires = Date-1
    End If
        
    session.Abandon()
    %>
    <Script Language="JavaScript">
    <!--
        alert('중복로그인 혹은 시간초과로 로그아웃 됩니다.')
        location.href="/index.asp";
    //-->
    </Script>
        
  end if
end if
(login_chk.asp 끝)
--------------------------------------------------------------------------

그럼 이단으로 넘어 가면....
비정상적으로 로그인 되었다면 login_log 테이블에 그대로 정보가 
남아있겠죠?? 이건 global.asp 에서 
session_onend 에서 세션 타임 아웃일경우 
세션 아이디 정보를 가지고 login_log 테이블의 정보를 지워주는것으로 
불안은 하지만 처리가 될수 있겠습니다.


그럼 정리 하여 드린다면.................
한 아이디로 A 라는 사람이 6시10분에 로긴 했는데
B 라는 사람이 6시 20분에 로긴을 하면
login_log 테이블에는 B라는 사람의 아이디와 세션아이디가 들어 있게됩니다.
그럼 A 라는 사람은 아무 액션을 취하지 않는 다면 그페이지는 볼수 있겠지만
만약 다름 페이지로 넘긴다면 위에 (login_chk.asp) 에 의해
메세지가 띄어지고 로그인전의 메인 페이지로 넘어 가게 됩니다.
이렇게 해서 중복 로그인은 체크가 되겠구요
A 라는 사람은 재접속해서 패스워드를 바꾼다던지 
사이트 주인에게 아이디 도용건으로 신고가 가능하겠죠..

근데... 이 로직의 문제는.... 사람이 많아 질경우...부하가 걱정된다는점..이지만..
비정상 로그아웃으로(브라우저를 그냥 껐거나 컴터가 죽었을겨우)
다시 접속을 하여도 문제가 되지 않으면서도 중복 로그인을 막을수 있다는 점입니다.
그리고 최악의 경우 서버가 죽었다면(이런일은 없어야 겠지만) 
서버 살리면서 login_log 테이블 내용을 없애주면 
서버 죽기전 login_log 테이블은 깨끗해 지겠죠 ^^


많은 태클로 지금 하고 있는 사이트에 조금이나마 도움을 받고자
에효 되지도 않는 실력으로  이딴 것도 팁이라고 오려 봅니다...
그럼 모두 모두 즐프 하시길 바랍니다.


p.s 아참 그리고 동영상 같은걸 보실경우 세션 문제로 
세션이 없어질 경우가 생겨 동영상 다 본후에 시간초과 로 로그인이 끝어질 경우가 
생길건데요...그런경우 팁란 아래에 보면 '끊어지지 않는 세션' 에 관한 팁을 
이용 하시거나 아니면 재접속을 하게 해야줘 쿠하핫...

728x90
반응형
LIST