PHP $_REQUEST란 무엇인가?
PHP의 슈퍼글로벌 변수 $_REQUEST는 기본적으로 $_GET, $_POST, $_COOKIE 세 변수의 내용을 하나로 모아 담고 있는 연관 배열(associative array)입니다. 즉, 폼 전송(GET/POST)과 쿠키를 통해 들어온 사용자 입력을 별도 구분 없이 단일 배열로 접근할 수 있게 해주는 편리한 변수입니다.
다만 $_REQUEST 배열의 실제 구성은 고정된 것이 아니라 php.ini 파일의 설정에 따라 달라집니다. 어떤 변수들이 포함되고, 어떤 순서로 등록되는지는 모두 설정값에 의해 결정됩니다.
php.ini 설정이 $_REQUEST에 미치는 영향
request_order 지시자
php.ini의 핵심 지시자 중 하나인 request_order는 PHP가 GET, POST, COOKIE 변수를 $_REQUEST에 등록하는 순서를 결정합니다. 예를 들어 "GP"로 설정하면 GET과 POST만 포함되며, "GPC"로 설정하면 COOKIE까지 포함됩니다. 같은 이름의 키가 여러 출처에 존재할 때는 나중에 등록되는 값이 앞선 값을 덮어쓰므로, 이 순서 설정은 매우 중요합니다.
variables_order 지시자
$_REQUEST 배열에 변수가 존재하는지 여부와 배치 순서는 PHP의 variables_order 설정에 따라 정의됩니다. 이 지시자는 $_ENV, $_SERVER 등 다른 슈퍼글로벌 변수의 생성 순서에도 영향을 미치므로, 서버 환경을 이해할 때 함께 확인하는 것이 좋습니다.
간단한 사용 예제
다음은 HTML 폼에서 전송된 데이터를 $_REQUEST로 받아 처리하는 기본적인 예입니다.
<?php
// form.html에서 name 필드를 전송했다고 가정
if (isset($_REQUEST['name'])) {
$name = htmlspecialchars($_REQUEST['name']);
echo "안녕하세요, " . $name . "님!";
}
?>이처럼 요청 방식(GET인지 POST인지)에 상관없이 동일한 코드로 입력값에 접근할 수 있다는 점이 $_REQUEST의 장점입니다.
명령줄(CLI) 실행 시 주의사항
PHP 스크립트를 명령줄(command line)에서 실행하면 argc와 argv 변수가 $_REQUEST 배열에 포함되지 않습니다. 그 이유는 이 두 값이 웹 서버가 채워 넣는 $_SERVER 배열에서 가져오기 때문입니다. CLI 환경에서 인수를 다루려면 $_SERVER['argc'], $_SERVER['argv'] 또는 $argc, $argv를 직접 사용해야 합니다.
보안을 위한 활용 팁
$_REQUEST는 여러 출처의 데이터를 한꺼번에 다루기 때문에 편리하지만, 데이터의 출처가 불분명해질 수 있다는 단점이 있습니다. 쿠키 값이 의도치 않게 POST나 GET 값을 덮어쓰는 상황이 발생할 수도 있습니다. 따라서 데이터 출처가 명확해야 하는 로직에서는 $_GET, $_POST 등 개별 슈퍼글로벌 변수를 사용하는 것이 보안 측면에서 더 안전하며, 일반적으로도 이러한 방식이 권장됩니다.