그누보드 자동 로그아웃 질문 드립니다.

그누보드 자동 로그아웃 질문 드립니다.

QA

그누보드 자동 로그아웃 질문 드립니다.

답변 2

본문

common.php에서

 

ini_set("session.cache_expire", 1); // 세션 캐쉬 보관시간 (분)

ini_set("session.gc_maxlifetime", 60); // session data의 garbage collection 존재 기간을 지정 (초)

ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오.

ini_set("session.gc_divisor", 1); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다.
 

이렇게 바꾸면 자동로그아웃이 되긴합니다 근데 새로고침을 해야만 자동로그아웃이 되더라구요
구현하고자 하는건 세션이 로그아웃될시 alert('장시간 입력이 없어 자동로그아웃 되었습니다.') 이런 text를 띄우고 자동 로그아웃을 하고자 합니다.

 

if ($is_member) { // 로그인한 사용자만 적용

    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $session_timeout)) {

        // 로그아웃 후 이동할 로그인 URL 설정

        // 세션 만료 처리 (자동 로그아웃)

        session_unset();

        session_destroy();

 

        echo "<script>

        var sessionTimeout = " . ($session_timeout * 1000) . "; // 밀리초 변환

        setTimeout(function() {

            alert('세션이 만료되었습니다. 다시 로그인해 주세요.'); // 작은따옴표 사용

            window.location.href = '" . $login_url . "'; // 작은따옴표 사용

        }, sessionTimeout);

        </script>";

        exit;

    }

    $_SESSION['last_activity'] = time();  // 마지막 활동 시간 갱신

 

    // ** 클라이언트에서도 자동 로그아웃 감지 **

    echo "<script>

    var sessionTimeout = " . ($session_timeout * 1000) . "; // 밀리초 변환

    console.log(sessionTimeout);

 

    function startSessionTimer() {

        window.sessionTimer = setTimeout(function() {

            alert('세션이 만료되었습니다. 다시 로그인해 주세요.');

            window.location.href = '" . $login_url . "';

        }, sessionTimeout);

    }

    </script>";

common.php에 이렇게해도 자동로그아웃이 안됩니다 뭐가 문제인지 모르겠습니다 부탁드립니다.


 

이 질문에 댓글 쓰기 :

답변 2

<?php
session_start(); // 세션을 시작 (필수)

// 세션 유지 시간 (초 단위)
$session_timeout = 1800; // 예: 30분

// 로그인 URL 설정 (로그아웃 후 이동할 페이지)
$login_url = "/login.php"; // 로그인 페이지 URL

// 로그인한 사용자만 체크
if ($is_member) {
    // 현재 시간
    $current_time = time();

    // 마지막 활동 시간이 설정되어 있다면 타임아웃 체크
    if (isset($_SESSION['last_activity'])) {
        $time_diff = $current_time - $_SESSION['last_activity']; // 마지막 활동과 현재 시간 차이

        if ($time_diff > $session_timeout) {
            // 세션 만료 처리 (자동 로그아웃)
            session_unset();
            session_destroy();

            // JavaScript를 사용하여 자동 리다이렉트
            echo "<script>
                alert('세션이 만료되었습니다. 다시 로그인해 주세요.');
                window.location.href = '{$login_url}';
            </script>";

            exit; // PHP 코드 실행 중지
        }
    }

    // 마지막 활동 시간 갱신
    $_SESSION['last_activity'] = $current_time;
}

// 클라이언트 측에서도 자동 로그아웃 감지
echo "<script>
    var sessionTimeout = " . ($session_timeout * 1000) . "; // 밀리초 변환
    console.log('Session timeout set for: ' + (sessionTimeout / 1000) + ' seconds');

    function startSessionTimer() {
        clearTimeout(window.sessionTimer); // 기존 타이머 제거
        window.sessionTimer = setTimeout(function() {
            alert('세션이 만료되었습니다. 다시 로그인해 주세요.');
            window.location.href = '{$login_url}';
        }, sessionTimeout);
    }

    // 페이지 로드 시 타이머 시작
    startSessionTimer();

    // 사용자가 활동할 때마다 타이머 리셋
    document.addEventListener('mousemove', startSessionTimer);
    document.addEventListener('keypress', startSessionTimer);
</script>";
?>
 

문제 분석

자동 로그아웃이 정상적으로 동작하지 않는 이유는 다음과 같을 수 있습니다.

  1. 세션 갱신 문제

    • $_SESSION['last_activity']가 갱신되지 않아서 자동 로그아웃이 실행되지 않을 가능성
    • session_start()가 호출되지 않아서 $_SESSION이 제대로 작동하지 않을 가능성
  2. 클라이언트 측(브라우저) 타이머 문제

    • setTimeout()이 실행되지 않는지 확인 필요 (브라우저 콘솔 오류 확인)
    • 페이지가 갱신될 때마다 setTimeout()이 초기화되므로 타이머가 제대로 동작하지 않을 가능성
  3. 세션 타임아웃 로직 문제

    • PHP에서는 서버 측에서 세션이 살아있는지 체크해야 함
    • 클라이언트에서만 setTimeout()을 사용하면 서버가 사용자의 세션을 인식하지 못할 수 있음

당연히 동기식 에서는 페이지 로드 후 모든 결과가 뿌려지고

모든 코드가 종료가 되어도 다른 코드가 없다면 별도 액션을 줄 수 없습니다.

 

예를들어 

철수가 배달음식을 시켰는데 배달이 다되고 문앞에 왔는데도 

배달원이나 어플에서 알림이 없다면 철수는 배달이 온지도 모르겠죠.. 음식은 문앞에 있는데도요..

 

아주 간단하게 해결 가능합니다.

어차피 자동로그아웃이란건 타이머니까.

tail.php 에 적당히 타임아웃 스크립트만 넣으면됩니다.

 

그러면 페이지를 이동 할때마다 자동 갱신되겠죠?

그리고 페이지를 이동하지 않고 아무런 액션도 하지 않으면 타임아웃 시간은 계속 줄어들테고

 

바로 /bbs/logout.php 로 이동하여 로그아웃 시켜도되고

아니면 별도 펑션으로 div 등을 띄워서 남은시간이 얼마 안남았음을 카운트다운 해도 됩니다..

 

자바스크립트 몇줄이면 별도의 세션도 필요없어요...

 

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 129,118
© SIRSOFT
현재 페이지 제일 처음으로