$_SERVER란 무엇인가?
$_SERVER는 HTTP 헤더, 경로, 스크립트 위치 등 서버 및 실행 환경에 관한 정보를 담고 있는 슈퍼글로벌(superglobal) 연관 배열입니다. 이 배열의 대부분 항목은 웹 서버가 채워 넣으며, 현재 실행 중인 스크립트가 동작하는 환경 전반에 대한 데이터를 제공합니다.
참고로 PHP 5.4.0 이전 버전에는 동일한 정보를 담는 $HTTP_SERVER_VARS가 존재했지만, 현재는 완전히 제거되었습니다.
주요 $_SERVER 요소 살펴보기
1. PHP_SELF – 현재 스크립트 파일명
현재 실행 중인 스크립트의 파일명을 저장합니다. 예를 들어 로컬 서버 document root의 test 폴더에 있는 스크립트라면 다음 코드가 해당 경로를 반환합니다.
<?php echo $_SERVER['PHP_SELF']; ?>
https://localhost/test/testscript.php URL로 접속했을 때 브라우저 출력 결과는 다음과 같습니다.
/test/testscript.php
2. SERVER_ADDR – 서버 IP 주소
현재 스크립트가 실행되고 있는 서버의 IP 주소를 반환합니다.
3. SERVER_NAME – 서버 호스트 이름
현재 스크립트가 실행 중인 서버 호스트의 이름입니다. 로컬에서 구동 중인 서버라면 localhost가 반환됩니다.
4. QUERY_STRING – 쿼리 문자열
쿼리 문자열(query string)은 key=value 쌍을 & 기호로 연결한 뒤 URL 끝에 ? 기호를 붙여 전달하는 문자열입니다. 예를 들어 https://localhost/testscript?name=xyz&age=20이라는 URL에서 name=xyz&age=20 부분이 쿼리 문자열에 해당합니다.
5. REQUEST_METHOD – HTTP 요청 방식
해당 URL에 접근할 때 사용된 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)를 나타냅니다. 위 쿼리 문자열 예제처럼 URL에 ? 기호로 쿼리를 붙여 요청하면 GET 방식으로 페이지가 호출됩니다.
6. DOCUMENT_ROOT – 문서 루트 디렉터리
서버에서 document root로 설정된 디렉터리를 반환합니다. XAMPP 아파치 서버에서는 htdocs 폴더가 document root 역할을 하며 다음과 같은 값이 출력됩니다.
C:/xampp/htdocs
7. HTTP_USER_AGENT – 사용자 에이전트(브라우저)
현재 페이지에 접속 중인 사용자 에이전트, 즉 브라우저 정보를 나타내는 문자열입니다.
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
8. REMOTE_ADDR – 클라이언트 IP 주소
사용자가 현재 페이지를 보고 있는 클라이언트 머신의 IP 주소입니다.
9. SERVER_PORT – 서버 포트 번호
웹 서버가 들어오는 요청을 수신 대기 중인 포트 번호입니다. 기본값은 80입니다.
모든 서버 변수 한눈에 보기
아래 스크립트를 XAMPP 서버의 document root에서 실행하면 $_SERVER 배열에 담긴 모든 서버 변수를 확인할 수 있습니다.
<?php foreach ($_SERVER as $k=>$v) echo $k . "=>" . $v . "<br>"; ?>
위 코드를 실행했을 때 출력되는 서버 변수 목록입니다.
MIBDIRS=>C:/xampp/php/extras/mibs MYSQL_HOME=>\xampp\mysql\bin OPENSSL_CONF=>C:/xampp/apache/bin/openssl.cnf PHP_PEAR_SYSCONF_DIR=>\xampp\php PHPRC=>\xampp\php TMP=>\xampp\tmp HTTP_HOST=>localhost HTTP_CONNECTION=>keep-alive HTTP_CACHE_CONTROL=>max-age=0 HTTP_DNT=>1 HTTP_UPGRADE_INSECURE_REQUESTS=>1 HTTP_USER_AGENT=>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 HTTP_ACCEPT=>text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 HTTP_SEC_FETCH_SITE=>none HTTP_SEC_FETCH_MODE=>navigate HTTP_SEC_FETCH_USER=>?1 HTTP_SEC_FETCH_DEST=>document HTTP_ACCEPT_ENCODING=>gzip, deflate, br HTTP_ACCEPT_LANGUAGE=>en-US,en;q=0.9,mr;q=0.8 PATH=>C:\python37\Scripts\;C:\python37\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\AMD\ATI.ACE\Core-Static;C:\python37\Scripts\;C:\python37\;C:\Users\User\AppData\Local\Microsoft\WindowsApps;C:\Users\User\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\;C:\MicrosoftVSCode\bin SystemRoot=>C:\Windows COMSPEC=>C:\Windows\system32\cmd.exe PATHEXT=>.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW WINDIR=>C:\Windows SERVER_SIGNATURE=> Apache/2.4.41 (Win64) OpenSSL/1.0.2s PHP/7.1.32 Server at localhost Port 80 SERVER_SOFTWARE=>Apache/2.4.41 (Win64) OpenSSL/1.0.2s PHP/7.1.32 SERVER_NAME=>localhost SERVER_ADDR=>::1 SERVER_PORT=>80 REMOTE_ADDR=>::1 DOCUMENT_ROOT=>C:/xampp/htdocs REQUEST_SCHEME=>http CONTEXT_PREFIX=> CONTEXT_DOCUMENT_ROOT=>C:/xampp/htdocs SERVER_ADMIN=>postmaster@localhost SCRIPT_FILENAME=>C:/xampp/htdocs/testscript.php REMOTE_PORT=>49475 GATEWAY_INTERFACE=>CGI/1.1 SERVER_PROTOCOL=>HTTP/1.1 REQUEST_METHOD=>GET QUERY_STRING=> REQUEST_URI=>/testscript.php SCRIPT_NAME=>/testscript.php PHP_SELF=>/testscript.php REQUEST_TIME_FLOAT=>1599118525.327 REQUEST_TIME=>1599118525
마무리
$_SERVER 배열은 디버깅, 접속자 분석, HTTPS 여부 판별(REQUEST_SCHEME 또는 HTTPS 키 확인) 등 다양한 용도로 활용됩니다. 다만 HTTP_USER_AGENT나 REMOTE_ADDR처럼 클라이언트 측에서 전달되는 값은 조작될 수 있으므로, 보안 목적으로 사용할 때는 반드시 별도의 검증 과정을 거쳐야 합니다.