PHP에서 세션이 만료되지 않도록 유지하는 방법 및 시나리오 소개

5839 단어 php세션 만료
PHP에서 SESSION을 어떻게 유지하는지, 그리고 이로 인해 최근의 프로젝트에 대한 생각을 하게 되었다. 그 안에 비교적 큰 폼이 하나 있다. 사용자가 그것을 완성하는 데 많은 시간이 필요하다. 많은 사용자들이 천신만고 끝에 SESSION이 만료되고 시스템이 종료된 것을 발견하자 SESSION을 어떻게 설정하고 SESSION을 온라인으로 유지하는지에 대한 연구를 하게 되었다. 다음은 체험이다.
세션이 뭐예요?WIKI의 설명에 따르면 SESSION은 두 통신 장치 간에 존재하는 상호작용 정보로 어느 시점에 구축되고 일정한 시간이 지나면 효력을 상실한다.흔히 볼 수 있는 세션은 TCP 세션, 웹 세션(HTTP 세션), 로건 세션 등이다.OSI 모델에서 세션이 실현되는 위치에 따라 세션은 주로 몇 가지로 나뉘는데 하나는 응용층 세션으로 웹 세션(HTTP 세션)과 텔넷 원격 로그인 세션을 포함한다.세션 레이어가 구현한 것은 Session Initiation Protocol(SIP)과 Internet Phone Call을 포함한다.전송 계층에 TCP 세션이 있습니다.본고는 주로 웹 세션에 대해 논의하는데 주로 두 가지가 있는데 그것이 바로 클라이언트 세션과 서버 사이드 세션이다. 그 다음에 가장 흔히 볼 수 있는 것은 자바 빈스가 제공하는 것이다.
세션은 뭐 하는 거예요?컴퓨터 분야, 특히 네트워크에서 세션은 특히 광범위하게 사용되며 대화(Dialogue), 세션 등으로도 불릴 수 있다. 일반적으로 두 통신 장치 사이에 저장된 상태를 가리키며 때로는 사용자와 컴퓨터 사이에서도 발생한다(Login SESSION).
무상태 통신과 달리 SESSION은 통상적으로 통신 상태를 저장하는 데 사용되기 때문에 통신하는 쌍방은 적어도 한 측이 SESSION의 역사 기록을 저장하여 양자 간의 통신을 실현해야 한다.
세션(WEB SESSION)은 어떻게 이루어졌나요?브라우저와 서버 간에 HTTP 통신을 할 때 상태를 표시하는 HTTP 쿠키가 포함되어 있으며, 통상적으로 유일한 SESSIONID가 있으며, SESSION은 사용자의 검증 정보와 단계를 기록합니다.몇몇 프로그래밍 언어에서 가장 자주 사용하는 Http Session Token은 JSESSIONID(JSP), PHPSESSID(PHP), ASPSESSIONID(ASP)입니다. 이 표지는 보통 해시 함수로 만들어져 이 사용자의 신분을 유일하게 나타낼 수 있습니다. 서버와 클라이언트가 통신할 때 GET나 POST의 매개 변수로 클라이언트에 저장됩니다.
세션의 실현 방식은 보통 두 가지가 있는데 서버 사이드 세션과 클라이언트 세션은 두 가지 방식이 각각 장단점이 있다.
서버측 SESSION은 구현이 쉽고 효율이 높지만 부하 균형이나 고가용성 수요가 발생할 때 처리하기가 비교적 어렵고 그런 내생 시스템에 저장 장치가 존재하지 않을 때도 사용할 수 없다.부하 균형은 파일 시스템을 공유하거나 고객이 한 서버에만 로그인하도록 강제할 수 있지만 효율을 떨어뜨릴 수 있다.저장되지 않은 장치에 대해서도 RAM(참고자료 6 참조)을 사용하여 서버측 SESSION의 실현을 해결할 수 있다. 이런 방법은 어떤 클라이언트 링크가 제한된 시스템에 유효한가(예를 들어 루트나 접속점 장치).
클라이언트 세션의 사용은 서버 사이드 세션의 일부 문제를 해결할 수 있다. 예를 들어 부하 균형의 알고리즘을 피하는 등이다. 그러나 동시에 자신의 문제도 발생할 수 있다.클라이언트 세션은 쿠키와 암호화 기술을 사용하여 서로 다른 요청 간에 상태를 저장합니다.각 동적 페이지가 끝나면 현재 세션을 집계하여 클라이언트에게 보냅니다.매번 요청이 성공하면 쿠키를 서버에 다시 보내서 서버가 이 사용자의 신분을 기억하도록 합니다.클라이언트 세션의 가장 중요한 문제는 보안 문제입니다. 쿠키가 납치되거나 왜곡되면 사용자의 정보의 안전성이 상실됩니다.
PHP에서 세션을 설정하는 방법은 무엇입니까?PHP의 개발 환경을 구축한 후 phpinfo()를 통해 세션과 관련된 부분을 볼 수 있습니다. 세션 모듈은 PHP V5.2.9 버전에서 모두 25개의 변수가 있습니다.그 중에서 평소 설정에 자주 사용되는 몇 가지는:

session.cookie_lifetime SESSIONID cookie
session.name SESSION COOKIE , PHPSESSID
session.save_handler SESSION , FILE
session.save_path Fedora /var/lib/php/session
session.gc_probability
session.gc_divisor
session.gc_maxlifetime GC
session.cache_limiter (nocache,private,private_no_expire,public)
session.cache_expire SESSION
첫 번째 질문부터 생각해 보겠습니다. 세션이 얼마나 지나면 만료됩니까?PHP 프로그램에서 세션을 사용하려면 session_ 을 참조해야 합니다.start (), 이 함수가 실행되면 세션의 저장 디렉터리 (file handler를 사용한다면) 에서 세션 파일을 생성합니다. 내용은 비어 있습니다. 브라우저에서 PHPSESSID의name이 있는 쿠키를 볼 수 있습니다. 그 안에hash에서 나온 세션의 이름이 저장되어 있습니다.
세션의 만료는 쓰레기 수거 메커니즘(Garbage Collection)에 의존합니다. 세션이 생성된 후 서버에 파일로 저장됩니다. 클라이언트 스크립트가 세션에 접근할 때마다 세션 파일의 접근 시간이 업데이트됩니다.매번 접근은 클라이언트가 저장한 SESSIONID에 따라 서버에 저장된 유일한 SESSION을 요청합니다. 클라이언트의 쿠키가 만료되면 어느 SESSION에 접근해야 하는지 알 수 없습니다. 비록 이 때 서버의 SESSION 파일이 만료되지 않았음에도 불구하고 회수되지 않으면 서버 자원의 낭비를 초래할 수 있습니다.
그러나 동시에 사용자의 세션이 곧 만료되기를 원한다면 쿠키를 설정하는 방법을 통해 실현할 수 있습니다.세션의 회수는 페이지를 방문할 때마다 이루어지며, 회수 확률은 세션에 의해 결정됩니다.gc_probability,session_gc_divisor 지정, 기본값 1/100.1로 설정하면 세션의 생존 주기를 넘겨 방문할 때마다 세션이 회수됩니다.두 가지 요구: 1. 세션이 만료되지 않도록 유지하거나 세션의 만료 시간을 연장한다.2. 세션을 즉시 만료시킵니다.
1. 세션이 만료되지 않도록 유지하고 세션의 만료 시간을 연장하는 것이 필요하다. 특히 내부 응용 시스템이나 큰 폼이 있을 때.당신의 사장이 표를 작성하고 있는데 마침 점심시간에 만났습니다. 이 표를 남겨두고 밥을 먹고 돌아오기를 기다렸습니다. 나머지 내용을 작성하고 제출한 후에 그가 무엇을 보았는지 생각해 보세요. 일반적으로 로그인 인터페이스입니다.사용자 체험을 향상시키려면 관건은 사장의 표에 문제가 없도록 하는 것이다. 우리는 반드시 세션의 생존 주기를 연장해야 한다.
세션이 만료되지 않도록 유지하고 세션 만료 시간을 연장하면 세션을 설정할 수 있습니다.gc_maxlifetime는 실현하지만, 우선 클라이언트의 쿠키가 gc에서 회수를 실행하기 전에 효력을 잃지 않도록 해야 합니다.긴 gc_ 설정maxlifetime는session의 생존 주기를 연장할 수 있지만, 모든 요청이 오래 유지되지 않는 응용에 있어서, 이렇게 하는 것은 서버 설정에 있어서 분명히 최선의 선택이 아니다.세션의 회수 메커니즘은 세션 파일의 마지막 방문 시간에 따라 판단되며, maxlifetime을 초과하면 회수 확률에 따라 회수하는 것을 알고 있습니다.그래서 우리는 정기적으로 세션을 방문하면 된다. 이것은 페이지를 새로 고침하여 실현할 수 있다. 이 사고방식에 따라 해결 방법이 있다.
JS를 통해 정기적으로 페이지에 접근하기;Iframe를 사용하여 정기적으로 페이지를 새로 고칩니다.
직접 프로그램을 이용하여 HTTP 요청을 보내면 페이지에 다른 요소가 끼워 넣는 것을 피할 수 있다.
다음은 JS 발송 요청을 이용하여 SESSION이 만료되지 않도록 유지하는 실현 방법입니다. 그러면 우리는 SESSION이 장시간 유지되어야 하는 페이지(예를 들어 큰 폼 페이지)만..

<script type=”text/javascript”>
 function keepMeAlive(imgName){
myImg = document.getElementById(imgName);
 if(myImg) myImg.src = myImg.src.replace(/\?.*$/, ‘?' + Math.random());
}
window.setInterval(“keepMeAlive(‘phpImg');”, 4000);
 </script>
그 중 URL에 랜덤 수를 넣는 것은 이 링크의 요청이 브라우저에 캐시되지 않도록 하기 위해서입니다.
2、SESSION을 즉시 만료시키는 방법이 많습니다.session_destroy (), 위의 생각으로 session_를 요청할 수도 있습니다destroy 페이지입니다.
세션은 안전합니까?PHP의 매뉴얼에는 세션이 세션에 저장된 정보가 반드시 그의 창립자에게만 보일 것이라고 보장할 수 없다고 명시되어 있다.일부 원격 작업을 안전하게 처리하려면 HTTPS가 유일한 선택입니다.가장 기본적인 것은 하나의 사용자 정보가 세션에 존재한다고 생각하지 말고 이 사용자가 반드시 본인이라고 생각하지 마라. 세션의 정보는 당신에게 사용자 이름과 비밀번호 검증을 거친 가상을 주지만.따라서 비밀번호를 수정하거나 비슷한 일을 해야 할 때 비밀번호를 다시 입력하는 것이 좋다.초기 아파치 버전은 PHPSESSID를 COOKIE 방식으로 저장하지 않고 URL-rewrite를 사용했습니다. 즉, 모든 URL 뒤에 PHPSESSID=를 붙여서 활성화된 세션에 속한다는 것을 나타냅니다. 새 버전의 아파치는 이 속성을 기본 닫기로 설정했습니다

session.use_trans_id = 0;
그래서 이런 의미에서 세션을 너무 오래 연장하거나 세션을 계속 온라인으로 유지하는 것은 안전에 있어서 시종 좋은 일이 아니다.궁극적인 해결 방법은 사용자가 로그인 창으로 이동하여 로그인한 후에 다시 작성 페이지로 돌아갈 수 있고 모든 데이터가 남아 있다는 것이다.이 실현 방식은 현재 Ajax로 해결하는 데 어려움이 없을 것이다. 일정한 시간마다 현재의 사용자 데이터를 하나의 저장 위치로 포스팅한다. XML이든 JSON이든.
픽업: 클라이언트가 JavaScript를 지원하지 않는 경우 사용할 수 있는 방법: 1. 플로팅을 작성하여 맨 위에 표시하고 사용자가 JS를 사용하지 않으면 플로팅을 사라집니다.2. 모든 INPUT를 disable로 설정한 다음 JS를 enabled로 설정합니다.상기 두 가지 방식은 모두 JS가 비활성화되었을 때 모든 기능을 사용할 수 없다. 어떻게 JS가 비활성화된 상황에서 우리의 응용 프로그램을 정상적으로 작동하게 하는지는 비교적 어려운 것 같다.이것을 실현하는 데 걸린 시간과 얻은 효과는 여러분이 따져 보세요.

좋은 웹페이지 즐겨찾기