테스트 사이트 - 개발 중인 베타 버전입니다

[그누보드용] 중복로그인 방지 TIP

· 7개월 전 · 580 · 5

순서대로 적용하시면 됩니다.

 

01. 세션 저장할 디비생성 

 

[code]

CREATE TABLE user_sessions (
    mb_id VARCHAR(50) PRIMARY KEY,  -- 사용자 ID
    session_id VARCHAR(255) NOT NULL,  -- 세션 ID
    last_login_device VARCHAR(255),  -- 마지막 로그인 디바이스 정보
    last_login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 마지막 로그인 시간
);

[/code]

 

02. /bbs/login_check.php 에 세션 처리하는 부분

 

[code]

// 동시접속처리 관련 부분 시작 ----------------------------------------------------------- 
if( $mb['mb_id'] ) { 
    $sql = "DELETE FROM user_sessions WHERE mb_id = '".$mb['mb_id']."'";
    sql_query($sql);

    // 새로운 세션 ID 생성
    $session_id = session_id();  // 현재 세션 ID

    // 디바이스 정보(예: User-Agent) 추출 (선택사항)
    $last_login_device = $_SERVER['HTTP_USER_AGENT'];

    // 새로운 세션 정보 DB에 저장
    $sql = "INSERT INTO user_sessions (mb_id, session_id, last_login_device) 
            VALUES ('{$mb['mb_id']}', '{$session_id}', '{$last_login_device}')"; 
            
            //echo $sql;
            //exit;
            
    sql_query($sql);

    // 세션 쿠키를 통해 현재 세션 ID를 설정 (보통 PHP 세션을 사용하면 자동으로 설정됨)
    $_SESSION['session_id'] = $session_id; 
}
// 동시접속처리 관련 부분 끝 -----------------------------------------------------------

[/code]

 

03. /common.php  에 기존로그인한 유저가 다른페이지로 이동했을때 세션체크하여 로그아웃시키는 부분

[code]

if ($member['mb_id']) {
    
    // ip 체크루틴
    $sqlDup="select count(*) as CNT from user_sessions ";
    $sqlDup.=" where mb_id='".$member['mb_id']."' and session_id='".$_SESSION['session_id']."'";
    $resultDup=sql_fetch($sqlDup);
    
    if($resultDup['CNT'] =="0"){
        
        //echo "<script>alert('중복로그인은 불가능합니다.');</script>";
        
        if(function_exists('social_provider_logout')){
            social_provider_logout();
        }

        // 이호경님 제안 코드
        session_unset(); // 모든 세션변수를 언레지스터 시켜줌
        session_destroy(); // 세션해제함

        // 자동로그인 해제 --------------------------------
        set_cookie('ck_mb_id', '', 0);
        set_cookie('ck_auto', '', 0);
        // 자동로그인 해제 end --------------------------------

        if($member['mb_level'] == '7'){
            $link = G5_URL.'/brandadm/';
        } else {
            if ($url) {
                if (substr($url, 0, 2) == '//')
                    $url = 'http:' . $url;

                $p = @parse_url(urldecode($url));
                /*
                    // OpenRediect 취약점관련, PHP 5.3 이하버전에서는 parse_url 버그가 있음 ( Safflower 님 제보 ) 아래 url 예제
                    // http://localhost/bbs/logout.php?url=http://sir.kr%23@/
                */
                if (preg_match('/^https?:\/\//i', $url) || $p['scheme'] || $p['host']) {
                    alert('url에 도메인을 지정할 수 없습니다.', G5_URL);
                }

                if ($url == 'shop')
                    $link = G5_SHOP_URL;
                else
                    $link = $url;
            } else if ($bo_table) {
                $link = G5_URL;//($bo_table);
            } else {
                $link = G5_URL;
            }
        }
        //run_event('member_logout', $link);
        //alert('새로운 기기에도 로그인되어 자동로그아웃처리 되었습니다.', $link);
        //goto_url($link);
        
        echo "<script>";
        echo "alert('새로운 기기에서 로그인되어 자동로그아웃처리 되었습니다.');";
        echo "location.href='".$link."'";
        echo "</script>";
        
    }

}

[/code]

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 5개

7개월 전

대박입니다
귀한 자료 감사합니다^^

7개월 전

감사합니다

7개월 전

너무너무 감사합니다. 

감사합니다.

1개월 전
고맙습니다~

게시글 목록

번호 제목
23798
23797
23792
23791
23785
23781
23770
23766
23764
23761
23747
23732
23724
23718
23706
23700
23697
23686
23682
23681
23680
23678
23665
23644
23643
23639
23637
23630
23626
23616