로그아웃 시 세션 만료 처리에 따른 PHPSESSID 쿠키 값 갱신 방법

로그아웃 시 세션 만료 처리에 따른 PHPSESSID 쿠키 값 갱신 방법

QA

로그아웃 시 세션 만료 처리에 따른 PHPSESSID 쿠키 값 갱신 방법

본문

안녕하세요, 그누보드에서 로그인 후 로그아웃 시 아래와 같은 코드를 사용하여 세션을 만료처리하고 있습니다.

 


/* logout.php */
 
// More code...

session_unset();
session_destroy();


// More code...

 

다만, 쿠키에 저장된 PHPSESSID의 경우 세션이 만료되었음에도 처음 설정된 값이 바뀌지 않고 유지되고 있는 것을 확인했는데요.

 

이 부분이 '불충분한 세션 관리'라는 항목으로 보안 취약점 항목에 포함되어 조치하고자 합니다.

 

몇 가지 자료를 찾아보던 중 PHP의 경우 `session_destory()` 함수 호출만으로는 클라이언트측 쿠키는 제거되지 않으므로 다음에 사용자가 방문할 때 여전히 동일한 세션 ID가 설정되는 것을 알게 되었는데요.

 

https://stackoverflow.com/questions/8641929/session-destroy-not-unsetting-the-session-id

 

결국, 로그아웃을 처리하는 코드에서 직접 `PHPSESSID` 쿠키를 만료시키는 방법밖에 없는 것인가요?

 


/* logout.php */
 
// More code...

session_unset();
session_destroy();
setcookie("PHPSESSID", "", time() - 3600, "/"); // 추가


// More code...

 


/* common.php */

//-------------------------------------------
// SESSION 설정
//-------------------------------------------
ini_set("session.use_trans_sid", 0);    // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags", ""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
session_save_path($_SERVER['DOCUMENT_ROOT'] . "/data/session");

if (isset($SESSION_CACHE_LIMITER)) {
    @session_cache_limiter($SESSION_CACHE_LIMITER);
} else {
    @session_cache_limiter("no-cache, must-revalidate");
}

ini_set("session.cache_expire", 30); // 세션 캐쉬 보관시간 (분)
ini_set("session.gc_maxlifetime", 1800); // session data의 garbage collection 존재 기간을 지정 (초)
ini_set("session.gc_probability", 1);
ini_set("session.gc_divisor", 100);
session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);

// Chrome 80 버전부터 아래 이슈 대응
// https://developers-kr.googleblog.com/2020/01/developers-get-ready-for-new.html?fbclid=IwAR0wnJFGd6Fg9_WIbQPK3_FxSSpFLqDCr9bjicXdzy--CCLJhJgC9pJe5ss
if (!function_exists('session_start_samesite')) {
    function session_start_samesite($options = array())
    {
        $res = @session_start($options);

        // IE 브라우저 또는 엣지브라우저 일때는 secure; SameSite=None 을 설정하지 않습니다.
        if (preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || preg_match('~Trident/7.0(; Touch)?; rv:11.0~', $_SERVER['HTTP_USER_AGENT'])) {
            return $res;
        }

        $headers = headers_list();

        krsort($headers);

        foreach ($headers as $header) {
            if (!preg_match('~^Set-Cookie: PHPSESSID=~', $header))
                continue;

            $header = preg_replace('~; secure(; HttpOnly)?$~', '', $header) . '; secure; SameSite=None';

            header($header, false);

            break;
        }

        return $res;
    }
}

if (!session_id()) {
    session_start_samesite();
}

// 4.00.03 : [보안관련] PHPSESSID 가 틀리면 로그아웃한다.
if ($_REQUEST['PHPSESSID'] && $_REQUEST['PHPSESSID'] != session_id())
    goto_url("{$g4['bbs_path']}/logout.php");

이 질문에 댓글 쓰기 :

답변 1

쿠키 PHPSESSID 값만 만료시키길 원하신다면 
setcookie("PHPSESSID", "", time() - 3600, "/"); 만 추가 해도 만료가 됩니다.

다만 모든 쿠키를 만료시키길 원하신다면..아래코딩으르 한번 참고 부탁드립니다.


// 모든 쿠키 가져오기
$cookies = $_COOKIE;

// 각 쿠키에 대해 만료일을 이전으로 설정하여 삭제
foreach ($cookies as $name => $value) {
    setcookie($name, '', time() - 3600, '/');
}
답변을 작성하시기 전에 로그인 해주세요.
전체 3,228
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT