본문 바로가기

프로그래밍/PHP

[PHP] 세션(session)에 대해서 알아보자.

 



 

 

 

 

 

 

PHP Web Prog.


 

 

처음으로 PHP를 공부하면서, 적은것이기에 다소 틀린 내용이 있을 수도 있습니다. 그리고, 다른 언어를 알고 계시다는 가정에하에 글을 적기때문에, 완전 웹프로그래밍 언어를 처음 공부하시는 분은 다른 글도 참고하시길 바랍니다.

 

 세션의 정의에 대해서는 생략합니다.

 

1. 세션의 시작과 값의 등록

 

 세션을 사용하기 위해서는 다음과 같이 최상단에 세션을 사용함을 명시해줘야 합니다.

 

<? session_start() ?>

 

 그리고 세션에 값을 등록하기 위해서는 session_register 을 통해 값을 등록하게 되는데, php 4.2.3 이후버전(정확한지는 확인해봐야합니다. 근거는 오류메시지입니다.)에서는 $_session 을 사용합니다.

 

(1). $_session 을 이용한 방법

<?
    session_start();
    $_session[test]="123";
    echo "세션 테스트입니다. 저장된 값은 $_session[test] 입니다.";
?> 

 

(2). session_register() 를 이용한 방법

<? 
    session_start();
    $test=12;
    session_register(test);
    echo "세션 테스트입니다. 저장된 값은 $test 입니다.";
?> 

 

 

 

 2번은 위와 같은 방법으로 써야 합니다. 값이 있는 변수를 선언한 후, 변수를 $가 없는 형태로 함수에 넣습니다.

그리고 값을 호출할때는 변수를 호출하는 방식으로 씁니다.

 

 하지만 이방식으로 했을 때, 다음과 같은 메시지를 확인할 수 있습니다.

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively in Unknown on line 0

 정확히 말하자면, session_register가 문제가 아니라 세션 데이터에 접근하는 방법인 $test에 문제가 있는 것이겠죠? 접근 방법을 1번의 방법처럼 $_session[test] 로 접근해보았는데, 세션 데이터값을 확인할 수 없는 것을 보면, session_register() 함수로 등록된 값 자체를 $test 이런식으로 접근을 하게 해놓은 것 같습니다. 아니면.. 말구요. ㅎㅎ제 소견입니다. 사실.. 같은 세션 데이터인데.. ㅋㅋ 이건 되고 저건 안되고 ... 궤변입니다. 패스~

 GET, POST 도 이전에는 그런방식이었는데, 값을 얻어내는 방법이 달라진 것을 보면, 역시나 보안문제이겠죠? 다 같은 방법으로 접근하니까요.

 

2. 세션의 제거


 세션 등록과 마찬가지로 session_unregister() 라는 세션을 삭제하기위한 함수가 존재하지만, unset 이라는 함수를 씁니다.

(1) unset 이용방법

 

<?
    session_start();
    $_session[test] = "1234";
    echo "세션 테스트입니다. 저장된 값은 $_session[test] 입니다.";
    echo "<br/>";
    unset($_session[test]);
    echo "세션 제거 테스트입니다. 저장된 값은 $_session[test] 입니다.";
?> 

 

 

세션 테스트입니다. 저장된 값은 1234 입니다.
세션 제거 테스트입니다. 저장된 값은 입니다.

 

 unset은 이런 용도로 사용가능하지만, 기본적으로 변수를 삭제하는 함수로 정의되어 있습니다.

 

(2)session_unregister()를 이용한 방법

<?
    session_start();
    $test=12;
    session_register(test);
    echo "세션 테스트입니다. 저장된 값은 $test 입니다.";
    echo "<br/>";
    session_unregister(test);
    echo "세션 제거 테스트입니다. 저장된 값은 $_session[test] 입니다.";
?>

 

 

결과는 다음과 같습니다.

 

세션 테스트입니다. 저장된 값은 12 입니다.
세션 제거 테스트입니다. 저장된 값은 입니다.

 

 일단 성공적으로 세션이 제거가 되었습니다. 세션값 테스트에서는 $_session[test] 를 이용하였는데요.

이는 $test 로 접근할 경우, 세션에 저장된 test의 값이 아닌 변수 test의 값을 불러오기 때문에,

위와같이 테스트를 진행하였습니다.

 

 

3. 세션의 폐기 

 위에서 세션을 제거하였다고 해도, 서버에는 세션파일이 존재하겠는데요.

마지막에 다음을 추가해서 세션파일을 삭제 할 수 있습니다.

<? session_destroy() ?>

 

 로그아웃을 할 때, 쓰면 되겠군요.

하지만, 이렇게 직접 폐기하지 않아도, 세션을 PHP가 알아서 정리해주는데요.

이는 php.ini 파일을 열어보면 다음 두항목의 설정에 따라, 정리되겠습니다.

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor     = 100

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

 

 파란색이 설명부분입니다. 일종의 자바에서의 가비지 콜렉터이네요.

 

 gc_probability 와 gc_divisor 의 비율에 따라서, 그러니까 여기서는 1/100 의 비율로 세션이 요청될때, 세션이 정리된다는 말이구요.

 

 밑의 maxlifetime 은 유효시간이겠죠. 설명으로 보면 1440초(설정되어 있는)가 지난 데이터는 가비지(쓰레기)로 간주된다로 보면 되겠네요.

 

 결론은, "유효시간이 지난 세션 데이터가 가비지로 간주되면, 새로운 세션이 시작될때마다, 1/100의 비율로 제거된다."로 해석할 수 있습니다. 결국 가비지로 간주된 세션데이터가 한꺼번에 제거되는 것이 아니라, 위의 설정된 비율로 제거된다고 이해가능하겠네요.

 

 세션에 대해서는 이만 글을 줄이겠습니다.