본문 바로가기
php개발자(백엔드) /php

php 동시로그인 방지 개발하기(초간단)

by 장김치 2019. 5. 9.

대부분의 유료콘텐츠를 제공하는 홈페이지나 앱 등에서는

동시접속자를 방지하는 프로그램이 동작한다.

 

카카오톡만해도 본인인증을 마친 최대 5개 디바이스 동시로그인이 가능하고

멜론이나 온라인 영상강의를 하는 교육서비스에서도 종종 볼수있는 기능이다.

 

이번에 개발하는 사이트는 고도화된 보안 프로세스가 적용될 정도의 동시접속방지 기능이 아니라서

세션값을 가지고 다른 기기(혹은 브라우저)에 로그인하는 경우 다른곳을 모두 일괄 로그아웃 시키는 정도였다.

 

정말 별거 아닌데

조금만 깊게 생각하거나 플로우를 명확하게 하지 않으면

멘붕에 빠지기 쉽다. 나처럼 ㅠㅠ... 😭

 

 

그래서 쉽게 생각하는게 중요하다!!!

 

 

프로세스 동작순서

1. A에서 최초 로그인시 해당 세션값 DB저장

3. B에서 두번째 로그인

4. A에서 다른 페이지 이동 or 새로고침 시 다른 기기에서 로그아웃됨을 알리고 로그아웃 프로세스 동작

 

 

 

 DB 구조 
id 테이블 인덱스(AUTO_INCREMENT)
type 활성화타입(A:활성화, B:비활성화)
sesstion 세션값
mem_idx 사용자 구분 인덱스

(로그인 시간 계산이 필요한 경우는 추가로 넣어주면 된다)

 

 

 

개발 프로세스

1. 로그인시 세션값 가져오기

$sesstion = session_id();

 

id type session mem_idx
1 A 가나다 99

↑ A에서 최초로그인한 데이터

 

 

2. 기존 DB에 있는 사용자세션 비활성화 시키기 

UPDATE session_table SET type='B' WHERE mem_idx='$mem_idx'

id type session mem_idx
1 B 가나다 99

 


3. DB에 현재 사용자세션 저장

INSERT INTO session_table ('session', 'type', 'mem_idx') VALUES ('$sesstion', 'A', '$mem_idx')

id type session mem_idx
1 B 가나다 99
2 A 라마바 99

↑ 기존 세션 비활성화 처리 후 B에서 로그인한 데이터 삽입

 

 

4. 사이트 내 모든 페이지 헤더영역에서 DB에 있는 세션정보+활성화타입 비교 후 로그아웃 시켜주기

SELECT type FROM session_table WHERE mem_idx='$mem_idx' AND sesstion = '$session'

 

if(type == 'B')

{

   alert('중복로그인이 감지되었습니다.');

   // 로그아웃 동작 코드삽입

}

 

이렇게 작업이 끝나고 다시 A에서 로그인한다면 B사이트에서는 로그아웃되고 DB 데이터는 다음과 같다.

id type session mem_idx
1 B 가나다 99
2 B 라마바 99
3 A 가나다 99

 

 

DB에 기존정보를 삭제해도 되지만

혹시나 서비스중에 중복로그인 접속여부를 알고싶어하는 클라이언트가 발생할수도 있으니 

일단 저장해놓기로 했다.

 

'php개발자(백엔드) > php' 카테고리의 다른 글

연도별 group by 해서 목록 노출  (0) 2020.04.09
php 앞글자 가져오기  (0) 2019.06.03
php resize png black background  (0) 2019.04.04
var_dump  (0) 2017.01.12
$_FILES [엑셀업로드 관련]  (0) 2016.12.01