로그아웃 시 세션 만료 처리에 따른 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, '/');
}
답변을 작성하시기 전에 로그인 해주세요.