[PHP] 서버 내의 session 파일 삭제에 대해

안녕하세요. 개발자 드리머즈입니다.


서버 내의 session 파일은 사용되지 않으면 삭제가 된다고는 하지만 삭제되는 시점은 명확히 알 수가 없습니다. 그래서 서버 내의 session 파일이 더 이상 필요하지 않으면 명시적으로 삭제하는 과정이 필요합니다.


세션 파일을 삭제하기 전에 세션과 쿠키에 대해 생각해보면 아래와 같이 3가지로 구성되어 동작을 합니다.


1. 세션 변수($_SESSION)

2. 쿠키

3. 세션 파일(sess_xxxx)


그래서 사용자 인증을 위해 세션을 사용한 경우, 로그아웃 시에 세션 파일만 지우는 것으로는 부족합니다. 위의 3가지를 다 지워야합니다.


1. 세션 변수($_SESSION) 지우기

$_SESSION = []; //OK

$_SESSION = Array(); //OK


unset($_SESSION); //NOK(사용하면 안 됨)

위의 OK된 방법 중 마음에 드는 코드 하나를 사용하시면 됩니다.


2. 쿠키 삭제

setcookie(session_name(), '', time() - 42000);

원래 setcookie함수는 서버쪽에서 client(브라우저)의 쿠키를 설정하기 위해 사용하는 함수입니다. 쿠키는 expiration time이 있기 때문에, 이미 지난 시간까지 존재하도록 설정해버리는 방식으로 client의 쿠키를 삭제합니다.


1번째 인자는 쿠키의 key값을 설정하는 인자입니다. session에 대응하는 cookie를 제거해야 하므로 session_name()를 넣었습니다. session_name()는 보통 PHPSESSID라는 값을 가지고 있습니다.


2번째 인자는 쿠키의 value값을 결정합니다. 삭제 될 쿠키이기에 value는 의미가 없어 ''을 넣었습니다.


3번째 인자가 쿠키의 expiration time입니다. time()함수를 호출하면 현재 시간을 의미하는 epoch time단위의 값을 반환합니다. 여기다가 적당한 값을 빼줘서 과거의 시간을 의미하게 합니다.

그런데 stack overflow글 참고하니.. 그냥 '1' 값 넣어도 과거 시간을 의미하므로 이 값을 넣어도 됩니다.




실제로 크롬에서 개발자 모드로 테스트해보니.. 위의 사진에서 Response Cookies의 빨간색에 해당하는 부분이 위의 코드로 인해 발생하였고 이로 인해 클라이언트의 세션 쿠키가 사라지는 것으로 보입니다.


3. 세션 파일(sess_xxxx) 삭제

session_destroy(); 

session_start() 이후에 session_destroty()함수를 호출하면,

session ID에 대응하는 서버 내에 존재하는 session 파일 1개가 삭제됩니다.



*참고

unset($_SESSION); 를 사용하면 안되는 이유 : https://stackoverflow.com/questions/12291835/php-session-variable-will-not-unset

setcookie 함수 설명 : http://php.net/manual/en/function.setcookie.php

session 삭제 정보 : https://stackoverflow.com/questions/508959/truly-destroying-a-php-session

작성자

Posted by 드리머즈

관련 글

댓글 영역