HOWTO · PHP
PHP에서 세션 시간 초과 설정
이 튜토리얼에서는 PHP에서 마지막 활동 시각을 기록하고 요청마다 확인해 30분 비활성 시간 초과를 적용하는 방법을 알아봅니다.
이 페이지의 내용
PHP는 지정한 비활성 시간이 지나도 애플리케이션 세션을 자동으로 만료시키지 않습니다. 30분 시간 초과를 적용하려면 마지막 요청 시각을 $_SESSION에 저장하고, 매 요청마다 현재 시각과 비교해 차이가 1,800초 이상이면 조치를 취해야 합니다. 유휴 시간이 지난 뒤 다음 요청이 들어올 때 시간 초과를 확인할 수 있습니다. 브라우저가 요청을 보내지 않기 시작한 바로 그 순간에 서버가 조치를 취할 수는 없습니다.
PHP 세션 시간 초과 추적 방법
session_start()를 호출한 뒤 $_SESSION를 읽거나 변경하세요. 첫 요청에는 저장된 활동 시각이 없으므로 초기화합니다. 이후 요청에서는 저장된 시각을 time()와 비교합니다. 1,800초 제한에 도달했다면 세션 데이터를 지우고 요청 처리를 끝냅니다. 제한에 도달하지 않았다면 활동 시각을 갱신해 30분의 비활성 시간 계산을 다시 시작합니다.
다음 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
session_start();
$timeoutSeconds = 30 * 60;
$now = time();
if (isset($_SESSION['last_activity']) &&
$now - $_SESSION['last_activity'] >= $timeoutSeconds) {
session_unset();
session_destroy();
echo "Session expired" . PHP_EOL;
exit;
}
$_SESSION['last_activity'] = $now;
echo "Session active" . PHP_EOL;
Session active
첫 요청은 last_activity를 초기화하고 세션이 활성 상태인 경로를 따릅니다. 그다음 요청부터는 타임스탬프를 갱신하기 전에 이전 시각을 확인합니다. 제공된 실행 근거에 따르면 활성 경로는 Session active를 출력하고 종료 코드 0으로 끝납니다. 만료 경로가 실행된 결과는 근거에 포함되어 있지 않습니다. 실제 애플리케이션에서는 session_start() 호출 뒤, 보호해야 할 작업을 수행하기 전에 이 검사를 두어 만료된 요청을 인증된 요청처럼 처리하지 않도록 하세요.
30분 비활성 후 세션 삭제
시간 초과가 발생하면 예제는 session_unset()와 session_destroy()를 모두 사용합니다. session_unset()는 현재 세션 변수를 제거하고, session_destroy()는 활성 세션 핸들러가 저장한 세션 데이터를 제거합니다. 서버 측 데이터를 삭제해도 브라우저의 세션 쿠키가 자동으로 제거되지는 않습니다. 쿠키도 만료시켜야 한다면 애플리케이션에서 같은 이름, 경로, 도메인 설정을 사용해 만료된 쿠키를 전송해야 합니다. 쿠키 처리는 애플리케이션의 세션 설정에 따라 달라집니다.
이 시간 초과는 애플리케이션 수준에서 적용되므로 검사를 수행하는 코드까지 요청이 도달할 때만 실행됩니다. PHP의 세션 저장 기간 설정은 저장 데이터 정리를 제어하며, 요청마다 확인하는 비활성 정책과는 별개입니다. PHP 매뉴얼의 session_unset() 항목과 세션 설정 옵션을 참조하세요.
unset()으로 세션 변수 제거
unset($_SESSION['cart'])를 사용하면 다른 세션 항목은 그대로 두고 특정 항목 하나만 제거할 수 있습니다. 전체 세션을 끝내지 않고 장바구니처럼 특정 상태만 지우려는 경우에 적합합니다. 이 작업만으로 비활성 시간 초과가 구현되지는 않습니다. 관련 값을 배열 키 아래에 묶어 보관하고 unset($_SESSION['account_state'])로 해당 키만 제거할 수 있습니다. 이후 시간 초과 검사에서 registered 요소를 기대한다면 배열을 타임스탬프로 바꾸지 마세요.
$_SESSION 슈퍼글로벌은 session_start()를 호출한 뒤 사용할 수 있습니다. PHP 매뉴얼의 $_SESSION 항목을 참조하세요.
시간 초과 처리와 별도로 세션 ID 재생성
session_regenerate_id()는 현재 세션 식별자를 바꿉니다. 비활성 시간을 측정하거나 세션 데이터를 삭제하지 않으며, 사용자에게 자동으로 다시 로그인하도록 요구하지도 않습니다. 시간 초과 검사와 별개로 애플리케이션의 인증 흐름에서 적절한 시점에 식별자 교체 정책을 적용할 때 사용하세요. 이전 세션 데이터가 유지되는지는 함수 옵션과 세션 처리 방식에 따라 다르므로, ID 재생성만으로 로그아웃되거나 이전 식별자를 더 이상 사용할 수 없게 된다고 간주하지 마세요.
session_id() 함수는 현재 식별자를 읽고, session_start()는 요청과 연결된 세션을 재개합니다. 자세한 내용은 PHP 매뉴얼의 session_regenerate_id() 항목과 session_id() 함수를 참조하세요.