질문 : 30 분 후에 PHP 세션을 만료하려면 어떻게합니까?
세션을 30 분 동안 유지 한 다음 제거해야합니다.
답변
세션 시간 제한을 직접 구현해야합니다. 다른 사람이 언급 한 두 옵션 ( session.gc_maxlifetime 및 session.cookie_lifetime )은 신뢰할 수 없습니다. 그 이유를 설명하겠습니다.
먼저:
session.gc_maxlifetime
session.gc_maxlifetime 은 데이터가 '가비지'로 표시되고 정리되는 시간 (초)을 지정합니다. 세션 시작 중에 가비지 수집이 발생합니다.
그러나 가비지 컬렉터 만의 확률로 시작 session.gc_probability 로 나눈 session.gc_divisor는 . 이러한 옵션에 대한 기본값 (각각 1과 100)을 사용하면 기회는 1 %에 불과합니다.
글쎄, 가비지 수집기가 더 자주 시작되도록 이러한 값을 간단히 조정할 수 있습니다. 그러나 가비지 수집기가 시작되면 등록 된 모든 세션의 유효성을 확인합니다. 그리고 그것은 비용 집약적입니다.
또한 PHP의 기본 session.save_handler 파일을 사용하는 경우 세션 데이터는session.save_path에 지정된 경로의 파일에 저장됩니다. 해당 세션 핸들러를 사용하면 세션 데이터의 수명이 마지막 액세스 날짜가 아닌 파일의 마지막 수정 날짜에 계산됩니다.
참고 : 기본 파일 기반 세션 핸들러를 사용하는 경우 파일 시스템이 액세스 시간 (atime)을 추적해야합니다. Windows FAT는 그렇지 않으므로 FAT 파일 시스템 또는 시간 추적을 사용할 수없는 다른 파일 시스템에 갇혀있는 경우 세션 가비지 수집을 처리 할 다른 방법을 찾아야합니다. PHP 4.2.3부터 atime 대신 mtime (수정 날짜)을 사용했습니다. 따라서 시간 추적을 사용할 수없는 파일 시스템에는 문제가 없습니다.
따라서 세션 데이터가 최근에 업데이트되지 않았기 때문에 세션 자체가 여전히 유효한 것으로 간주되는 동안 세션 데이터 파일이 삭제 될 수도 있습니다.
두 번째 :
session.cookie_lifetime
session.cookie_lifetime 은 브라우저로 전송되는 쿠키의 수명을 초 단위로 지정합니다. […]
네, 맞습니다. 이것은 쿠키 수명에만 영향을 미치며 세션 자체는 여전히 유효 할 수 있습니다. 그러나 세션을 무효화하는 것은 클라이언트가 아닌 서버의 작업입니다. 그래서 이것은 아무것도 도움이되지 않습니다. 실제로 session.cookie_lifetime 을 0
설정하면 세션의 쿠키가 브라우저가 닫힐 때까지만 유효한 실제 세션 쿠키가됩니다.
결론 / 최상의 솔루션 :
가장 좋은 해결책은 자신의 세션 시간 제한을 구현하는 것입니다. 마지막 활동 (예 : 요청)의 시간을 나타내는 간단한 타임 스탬프를 사용하고 모든 요청으로 업데이트합니다.
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
모든 요청에서 세션 데이터를 업데이트하면 세션 파일의 수정 날짜도 변경되어 가비지 수집기에 의해 세션이 너무 일찍 제거되지 않습니다.
추가 타임 스탬프를 사용하여 세션 고정 과 같은 세션에 대한 공격을 피하기 위해 세션 ID를 주기적으로 다시 생성 할 수도 있습니다.
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// session started more than 30 minutes ago
session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}
메모:
session.gc_maxlifetime
은이 사용자 지정 만료 처리기의 수명 (이 예에서는 1800) 이상이어야합니다.- start 이후 30 분이 아닌 30 분 활동 후 세션을 만료하려면
time()+60*30
만료와 함께setcookie
를 사용하여 세션 쿠키를 활성 상태로 유지해야합니다.
출처 : https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes
'프로그래밍 언어 > PHP' 카테고리의 다른 글
PHP 치명적 (`E_ERROR`) 오류를 잡는 방법 (0) | 2021.06.30 |
---|---|
PHP에서 파일 확장자를 확인하는 방법 (0) | 2021.06.30 |
PHP-개행 문자를 만드는 방법 (0) | 2021.06.29 |
PHP + curl, HTTP POST 샘플 코드 (0) | 2021.06.29 |
PHP를 사용하여 두 날짜의 차이를 계산하는 방법 (0) | 2021.06.25 |