Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 세션에 객체 저장하기 – serialize()와 unserialize() 완벽 가이드

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 객체 인젝션)이 발생할 수 있으므로, 반드시 서버가 관리하는 세션 데이터처럼 신뢰할 수 있는 데이터에만 사용해야 합니다. 또한 역직렬화 대상 클래스가 미리 정의되어 있어야 객체가 정상적으로 복원됩니다.