오늘 내 웨이보에 질문을 올렸습니다:
인터뷰 중에 "30분 안에 만료되는 세션을 설정하는 방법은 무엇입니까?"라는 질문을 자주 받습니다. 단순한 것 같지는 않지만 많은 지식이 포함되어 있으며 특히 기본 실력은 탄탄해요. 누가 와서 대답해 보시겠어요?
왜 이런 질문을 하시나요?
1. Stackoverflow
에서 이 문제를 논의하는 사람을 봤습니다.
2. 이런 질문을 자주 했던 기억이 나네요~~
자, 이 질문에 답해드리겠습니다.
첫 번째 답변
그러면 가장 일반적인 답변은 다음과 같습니다. 세션 만료 시간 설정, 즉 session.gc_maxlifetime입니다. 이 답변은 다음과 같은 이유로 올바르지 않습니다.
1. 우선 이 PHP는 특정 확률을 사용하여 세션의 gc, 즉 session.gc_probability 및 session.gc_divisor를 실행합니다. (소개는 권한 거부 알림에 대한 해결 방법을 참조하세요. Session)을 사용하는 PHP의 경우 기본값은 각각 1과 100입니다. 이는 세션이 시작될 때 PHP가 Session gc를 실행할 확률이 1%라는 것을 의미합니다. 세션이 30분 안에 만료된다는 보장은 없습니다. .
2. 확률이 높은 정리 기회를 설정하는 것은 어떻습니까? 여전히 부적절합니다. PHP는 통계 세션 파일의 수정 시간을 사용하여 이 확률이 증가하면 먼저 성능이 저하됩니다. 둘째, PHP 세션과 관련된 세션 변수를 저장하기 위해 "a" 파일을 사용합니다. 5분 전에 세션 변수를 a=1로 설정하고 5분 후에 Sesion 변수를 b=2로 설정했다고 가정합니다. 세션 파일 시간은 b 순간이 추가된 시간이고, 30분에는 a를 지울 수 없습니다. 아래의 세 번째 이유도 있습니다.
3. 기본적으로 PHP(예: Linux)는 /tmp를 Session의 기본 저장 디렉터리로 사용하며, 매뉴얼에도 다음과 같은 설명이 있습니다.
참고: 서로 다른 스크립트의 session.gc_maxlifetime 값이 다르지만 세션 데이터 저장 위치가 동일한 경우 값이 가장 작은 스크립트가 데이터를 정리합니다. 이 경우 session.save_path와 함께 이 지시어를 사용하세요.
즉, 자신의 독립적인 save_path를 지정하지 않은 두 개의 애플리케이션이 있는 경우 하나는 만료 시간을 2분(A로 가정)으로 설정하고 다른 하나는 30분(B로 가정)으로 설정합니다. ), A 세션 gc가 실행될 때마다 애플리케이션 B에 속한 세션 파일이 동시에 삭제됩니다
따라서 첫 번째 답변은 '완전히 엄격하게' 정답은 아닙니다.
두 번째 답변
또 다른 일반적인 답변은 다음과 같습니다. 세션 ID의 매체와 쿠키의 만료 시간, 즉 session.cookie_lifetime을 설정하는 것입니다. 이 답변도 다음과 같은 이유로 올바르지 않습니다.
이 만료는 단지 쿠키 만료입니다. 즉, 세션 만료는 서버 만료인 반면 쿠키 만료는 클라이언트(브라우저)에 의해 보장됩니다. 만료 시 표준 브라우저가 이 쿠키(세션 ID 포함)를 보내지 않도록 할 수 있으며, 요청을 생성하는 경우에도 이 세션 ID 값을 계속 사용할 수 있습니다.
세 번째 답변
memcache, redis 등을 사용해 보세요. 이 답변이 정답입니다. 하지만 다음 질문자는 분명히 PHP를 사용하면 어떻게 되는지 물을 것입니다.
네번째 답변
물론 인터뷰는 당신을 위한 것이 아니지만, 당신의 생각의 철저함을 테스트하기 위해 그 과정에서 이러한 함정을 지적할 것이므로 일반적으로 질문의 의미에 맞는 접근 방식은 다음과 같습니다. >
1. 쿠키 만료 시간을 30분으로 설정하고 세션 수명을 30분으로 설정합니다.2. 각 세션 값에 타임스탬프를 직접 추가하세요.
3. 매번 방문하기 전에 타임스탬프를 확인하세요.
마지막으로 왜 만료 시간을 30분으로 설정해야 하는지 묻는 학생들이 있었습니다. 우선은 면접용이고, 두 번째는 30분 후에 만료되는 쿠폰과 같은 실제 사용 시나리오에서요?
감사합니다 :)