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

PHP $_SERVER 완벽 가이드: 서버 및 실행 환경 정보 확인하기

$_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처럼 클라이언트 측에서 전달되는 값은 조작될 수 있으므로, 보안 목적으로 사용할 때는 반드시 별도의 검증 과정을 거쳐야 합니다.