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

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

· 7개월 전 · 579 · 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개월 전
고맙습니다~

게시글 목록

번호 제목
23966
23963
23953
23949
23938
23935
23933
23928
23919
23918
23917
23910
23902
23901
23897
23894
23893
23891
23885
23872
23870
23862
23859
23853
23845
23838
23827
23819
23805
23801