PHP에서 객체를 세션에 저장하려면 serialize() 함수를 사용해야 합니다. 반대로 세션에 저장된 객체를 다시 꺼내올 때는 unserialize() 함수를 호출하면 됩니다.
직렬화(Serialize)란 무엇인가?
serialize() 함수는 특정 값을 저장 가능한 형태, 즉 비트(bit)의 연속된 문자열로 변환하는 역할을 합니다. 이렇게 변환된 데이터는 파일이나 메모리 버퍼에 저장할 수 있고, 네트워크를 통해 전송하는 것도 가능합니다.
PHP의 세션은 기본적으로 객체를 직접 저장하지 못하기 때문에, 객체를 문자열 형태로 변환한 뒤 $_SESSION 변수에 담아야 합니다.
serialize()로 객체를 세션에 저장하기
session_start(); $object = new sample_object(); $_SESSION['sample'] = serialize($object);
위 코드의 동작 순서는 다음과 같습니다.
먼저 session_start() 함수로 세션을 시작하고, 새로운 객체를 생성합니다. 그다음 생성된 객체를 serialize() 함수로 직렬화하여 $_SESSION 변수에 할당합니다. 이제 객체는 세션에 안전하게 저장됩니다.
serialize() 예제
<?php
$data = serialize(array("abc", "defgh", "ijkxyz"));
echo $data;
?>출력 결과
a:3:{i:0;s:3:"abc";i:1;s:5:"defgh";i:2;s:6:"ijkxyz";}출력 결과를 보면 배열이 'a:3:'(배열, 요소 3개), 'i:0'(정수 인덱스 0), 's:3'(길이 3의 문자열) 같은 형식으로 표현된 것을 확인할 수 있습니다. 이것이 바로 PHP의 직렬화 포맷입니다.
unserialize()로 세션에서 객체 가져오기
session_start(); $object = unserialize($_SESSION['sample']);
마찬가지로 session_start() 함수로 세션을 시작한 후, 이전에 직렬화하여 $_SESSION 변수에 저장해 두었던 객체를 unserialize() 함수로 역직렬화하면 원래의 객체 상태 그대로 복원됩니다.
unserialize() 예제
<?php
$data = serialize(array("abc", "defgh", "ijkxuz"));
echo $data . "<br>";
$test = unserialize($data);
var_dump($test);
?>출력 결과
a:3:{i:0;s:3:"abc";i:1;s:5:"defgh";i:2;s:6:"ijkxuz";}
array(3) { [0]=> string(3) "abc" [1]=> string(5) "defgh" [2]=> string(6) "ijkxuz" }실행 결과를 보면 직렬화된 문자열이 unserialize()를 통해 원래의 배열 구조로 완벽하게 복원된 것을 확인할 수 있습니다.
주의사항
unserialize() 함수는 신뢰할 수 없는 사용자 입력값에 사용할 경우 보안 취약점(PHP 객체 인젝션)이 발생할 수 있으므로, 반드시 서버가 관리하는 세션 데이터처럼 신뢰할 수 있는 데이터에만 사용해야 합니다. 또한 역직렬화 대상 클래스가 미리 정의되어 있어야 객체가 정상적으로 복원됩니다.