PHP에서 세션 만료 시간을 엄격하게 설정하는 방법
30분 후에 세션이 만료되도록 엄격하게 제한하는 방법!
1. 클라이언트 쿠키의 수명을 30분으로 설정합니다.
2. 세션의 최대 수명을 30분으로 설정합니다. 각 각 세션 값에 타임스탬프를 추가한 후 프로그램이 호출될 때 이를 판단합니다.
이유는 먼저 PHP 세션의 기본 원리를 이해해 보겠습니다.
세션 PHP의 유효 기간은 기본적으로 1440초(24분)입니다. 즉, 클라이언트가 24분 이상 새로 고치지 않으면 현재 세션이 무효화됩니다. 물론, 사용자가 브라우저를 닫으면 세션이 종료되고 자연스럽게 세션이 더 이상 존재하지 않게 됩니다!
우리 모두 알고 있듯이 세션은 클라이언트가 제공한 SessionID를 기반으로 사용자의 파일을 얻은 다음 파일을 읽어 변수 값을 얻습니다. SessionID는 클라이언트의 Cookie 또는 Http1.1 프로토콜을 사용할 수 있습니다.
Query_String(접속된 URL의 "?" 뒤 부분)이 서버로 전송된 후 서버는 Session의 디렉터리를 읽습니다. ...
세션의 수명주기를 제어하려면 먼저 세션에 대한 php.ini 관련 설정을 이해해야 합니다("[세션]에서 php.ini 파일 열기). " 섹션):
1. session.use_cookies: 기본값은 "1"입니다. 전달하기 위해 쿠키를 사용하여 SessionID를 나타내며, 그렇지 않으면 Query_String을 사용하여 전달합니다.
2. 세션. name: SessionID에 저장된 변수 이름으로 Cookie 또는 Query_String일 수 있습니다. 기본값은 " PHPSESSID"입니다.
3 session.cookie_lifetime: SessionID가 클라이언트에 저장되는 시간을 나타냅니다. 쿠키. 기본값은 0입니다. 이는 브라우저가 닫히자마자 SessionID가 무효화됨을 의미합니다... 이로 인해 세션을 영구적으로 사용할 수 없습니다!
4. session.gc_maxlifetime: 세션 데이터가 서버 측에 저장되는 시간입니다. 이 시간을 초과하면 세션 데이터가 자동으로 삭제됩니다.
여러 가지 설정이 있지만 이번 글과 관련된 내용은 우선 세션 생존 기간을 설정하는 방법부터 살펴보겠습니다.
앞서 언급한 것처럼 서버는 SessionID를 통해 Session 데이터를 읽어오는데, 일반적으로 브라우저가 닫히면 브라우저에서 보낸 SessionID가 사라지기 때문에 수동으로 SessionID를 설정하고 저장하면 됩니다. ...
서버의 운영 권한이 있는 경우 설정은 매우 간단합니다.
1. .use_cookies" 1인 경우 Cookie를 사용하여 SessionID를 저장하지만 기본값은 1이므로 일반적으로 수정할 필요가 없습니다.
2. "session.cookie_lifetime"을 설정해야 하는 시간으로 변경합니다(예: 예를 들어 1시간은 3600초로 설정할 수 있습니다.)
3. "session.gc_maxlifetime"을 "session.cookie_lifetime"과 동일한 시간으로 설정합니다.
세션 유효 기간을 결정하는 매개 변수 설정은 session.gc_maxlifetime이라는 PHP 문서에 명확하게 명시되어 있습니다. 이 매개변수는 php.ini 파일이나 ini_set() 함수를 통해 수정할 수 있습니다. 문제는 여러 번의 테스트를 거친 후에도 이 매개변수를 수정해도 기본적으로 아무런 효과가 없으며 세션 유효 기간이 여전히 기본값인 24분을 유지한다는 점입니다.
PHP의 작동 메커니즘으로 인해 세션 정보를 정기적으로 스캔하여 유효하지 않은지 확인하는 데몬 스레드가 없습니다. 유효한 요청이 발생하면 PHP는 전역 변수
session.gc_probability/session.gc_divisor(php.ini 또는 ini_set( ) 함수) (쓰레기
수집기).
기본적으로 session.gc_probability = 1, session.gc_divisor
= 100입니다. 이는 GC가 시작될 확률이 1%라는 의미입니다. GC의 역할은 모든 세션 정보를 스캔하고 현재 시간에서 세션의 마지막 수정 시간(수정
날짜)을 뺀 다음 이를 session.gc_maxlifetime 매개변수와 비교하는 것입니다. gc_maxlifetime을 초과하면 세션이 삭제됩니다.
현재까지는 모든 것이 잘 작동하고 있습니다. 그렇다면 gc_maxlifetime이 유효하지 않게 되는 이유는 무엇입니까?
기본적으로 세션 정보는 시스템의 임시 파일 디렉터리에 텍스트 파일 형식으로 저장됩니다. Linux에서 이 경로는 일반적으로 \tmp이고, Windows에서는 일반적으로 C:\Windows\Temp입니다. 서버에 여러 개의 PHP 애플리케이션이 있는 경우 세션 파일을 동일한 디렉터리에 저장합니다. 마찬가지로 이러한 PHP 애플리케이션도 특정 확률로 GC를 시작하고 모든 세션 파일을 검색합니다.
문제는 GC가 작동할 때 서로 다른 사이트의 세션을 구분하지 못한다는 것입니다. 예를 들어 사이트 A의 gc_maxlifetime은 2시간으로 설정되고 사이트 B의 gc_maxlifetime은 기본값 24분으로 설정됩니다. 사이트 B의 GC가 시작되면 공개 임시 파일 디렉터리를 검색하고 사이트 A 또는 B에서 가져온 것인지에 관계없이 24분보다 오래된 모든 세션 파일을 삭제합니다. 이런 식으로 사이트 A의 gc_maxlifetime 설정은 쓸모가 없습니다.
문제를 찾으면 해결하기 쉽습니다. session.save_path 매개변수를 수정하거나 session_save_path() 함수를 사용하여 세션이 저장되는 디렉터리를 전용 디렉터리로 지정하세요. gc_maxlifetime 매개변수는 정상적으로 작동합니다.
또 다른 문제는 gc_maxlifetime이 세션이 유지되는 최단 시간만 보장할 수 있으며, 이 시간이 지나면 세션 정보가 즉시 삭제된다는 점입니다. GC는 확률에 따라 시작되며 오랜 시간 동안 시작되지 않을 수 있으므로 gc_maxlifetime을 초과한 후에도 많은 수의 세션이 여전히 유효합니다.
이 문제를 해결하는 방법 중 하나는 session.gc_probability/session.gc_divisor의 확률을 높이는 것입니다. 100%로 언급하면 이 문제는 완전히 해결되지만 성능에 심각한 영향을 미칠 것은 분명합니다. . 또 다른 방법은 코드에서 현재 세션의 수명을 직접 판단하는 것입니다
gc_maxlifetime을 초과하면 현재 세션을 삭제합니다.