PHP 서버 보안 설정 php.ini 필수 항목 정리

핵심 요약
  • expose_php와 display_errors는 기본값이 켜짐이므로 운영 서버에서는 꺼서 버전과 내부 경로 노출을 줄입니다.
  • allow_url_include는 끄고, disable_functions와 open_basedir는 보조 안전장치로만 씁니다.
  • 세션 쿠키는 HttpOnly, Secure, SameSite와 strict mode를 켜고, 설정 후 phpinfo나 php -i로 적용을 확인합니다.

PHP 설정 파일인 php.ini에는 몇 가지 보안 관련 항목이 있고, 기본값이 개발 편의 위주라 운영 서버에서는 바꿔야 하는 것이 있습니다. 이 글은 PHP 매뉴얼에서 확인한 기본값과 변경 가능 범위를 바탕으로 운영 서버에 맞는 값을 정리합니다.

설정이 어떤 php.ini에 있는지 먼저 확인해야 합니다. 서버에서 php —ini를 실행하면 읽어 들이는 설정 파일 경로가 나오고, 웹이 쓰는 파일은 phpinfo 화면의 Loaded Configuration File에서 볼 수 있습니다. 둘이 다를 수 있다는 점은 PHP 버전 확인 글에 설명했습니다.

설정별 기본값과 권장 값

지시어매뉴얼상 기본값운영 서버 권장변경 위치
expose_php1 (켜짐)Offphp.ini만
display_errors1Offphp.ini 등
log_errors0Onphp.ini 등
allow_url_include00 유지php.ini·서버 설정
disable_functions빈 값필요한 함수만php.ini·서버 설정
open_basedir없음사이트 경로로 제한비교적 자유로움

위 표는 PHP 매뉴얼의 2026년 10월 확인 내용입니다. 실제 서버의 값은 배포판이나 호스팅이 미리 바꿔 둔 경우가 있으니 phpinfo로 현재 값을 직접 보세요.

정보 노출 줄이기

expose_php가 켜져 있으면 응답에 X-Powered-By 같은 헤더로 PHP 사용 사실과 버전이 드러날 수 있습니다. 끄는 것만으로 안전해지지는 않지만 불필요한 정보를 줄입니다. display_errors도 같은 이유로 중요합니다. 오류 화면에는 파일 경로, 함수명, 줄 번호가 나올 수 있고 PHP 매뉴얼은 이런 정보가 공격자의 정보 수집에 쓰일 수 있다고 경고합니다. 화면에 안 보이는 대신 로그에 남기도록 설정하세요.

expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

로그 파일 위치 선택과 읽는 법은 PHP 오류 로그 확인 글에서 이어서 설명합니다. 웹 서버 쪽 헤더까지 숨기는 방법은 서버 버전 정보 숨기기 글을 참고하세요.

HSTS·CSP 같은 보안 헤더가 어떻게 설정되어 있는지 바로 확인할 수 있습니다.

보안 헤더 검사하기

원격 파일 포함과 위험 함수

allow_url_include는 include나 require에 URL을 쓸 수 있게 하는 설정입니다. 매뉴얼상 기본값은 0이고 PHP 7.4.0부터 사용을 권장하지 않는 설정으로 분류되어 있으니 켜지 마세요. 이 설정은 allow_url_fopen이 켜져 있어야 의미가 있으며, 두 설정 모두 ini_set으로는 바꿀 수 없습니다.

disable_functions는 지정한 내부 함수를 쓰지 못하게 합니다.

disable_functions = exec,passthru,shell_exec,system

매뉴얼은 PHP 8.0.0부터 비활성화된 함수의 정의가 제거되고, 이 설정은 우회될 수 있으므로 공유 호스팅의 충분한 보안 수단으로 여기면 안 된다고 안내합니다. 쓰지 않는 함수를 막는 보조 장치로만 생각하세요. 막으면 일부 플러그인이 작동하지 않을 수 있으니 테스트가 필요합니다.

파일 접근과 업로드

open_basedir는 PHP가 접근할 수 있는 디렉터리 범위를 제한합니다. 매뉴얼에서도 이것은 추가 안전망일 뿐 보안이 필요할 때 의존할 수 있는 수단이 아니라고 설명하니 보조로만 쓰세요. 업로드를 쓰지 않는 사이트는 file_uploads를 끌 수 있고, 쓴다면 upload_tmp_dir을 전용 폴더로 지정해 권한을 좁게 관리합니다.

open_basedir = "/var/www/mysite:/tmp/mysite"
upload_tmp_dir = "/var/www/mysite/tmp"

업로드 폴더에서 PHP가 실행되는 문제는 PHP 웹쉘 탐지 글과 함께 보세요.

세션 쿠키 설정

로그인 상태를 유지하는 세션 쿠키는 다음 옵션으로 보호할 수 있습니다. 매뉴얼의 기본값은 cookie_httponly 0, cookie_secure 0, use_strict_mode 0이고 cookie_samesite는 빈 값입니다.

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax

HttpOnly는 자바스크립트가 쿠키를 읽지 못하게 하고, Secure는 HTTPS에서만 쿠키를 보냅니다. SameSite는 다른 사이트에서 시작된 요청에 쿠키를 보내는 범위를 줄입니다. strict mode는 서버가 모르는 세션 ID를 그대로 받아들이지 않게 하며 매뉴얼은 사이트 전반에 켜라고 권합니다. cookie_secure는 HTTPS에서만 세션이 동작하므로 사이트 전체가 HTTPS로 연결된 뒤에 켜세요. 그 외 보안 헤더는 보안 헤더 총정리 글에서 확인할 수 있습니다.

적용 확인

설정을 저장한 뒤에는 PHP-FPM 또는 웹 서버를 다시 읽게 하고, phpinfo 화면의 Local Value와 Master Value 값이 의도대로 바뀌었는지 봅니다. 확인이 끝난 phpinfo 파일은 삭제하세요. 외부 주소 검사로는 이 설정 값을 직접 확인할 수 없고, 응답 헤더로 일부 결과만 짐작할 수 있다는 한계가 있습니다.

보안 헤더 검사HSTS·CSP·X-Content-Type-Options 등 6개 헤더의 값 평가을 무료로 확인할 수 있습니다.

보안 헤더 검사하기

자주 묻는 질문

ini_set으로 코드에서 바꿔도 되나요?

일부 지시어만 가능합니다. PHP 매뉴얼 기준으로 expose_php, disable_functions, allow_url_include 등은 php.ini나 서버 설정에서만 바꿀 수 있어서 ini_set으로는 적용되지 않습니다.

disable_functions만 설정하면 안전한가요?

아닙니다. 매뉴얼은 이 설정이 우회될 수 있으며 공유 호스팅 환경의 충분한 보안 수단으로 보면 안 된다고 설명합니다. 업데이트와 권한 관리가 우선입니다.

session.cookie_secure를 켰더니 로그인이 안 됩니다.

이 옵션이 켜지면 세션이 HTTPS에서만 동작합니다. 사이트가 HTTP로도 접속되고 있다면 HTTPS 리디렉션을 먼저 정리하세요.

설정을 바꿨는데 반영이 안 돼요.

PHP-FPM이나 웹 서버를 다시 읽어야 적용되는 경우가 많습니다. 어떤 php.ini를 읽는지 php --ini와 phpinfo의 Loaded Configuration File로 확인하세요.

확인한 자료

기술 정보는 2026-10-24에 위 자료로 확인했습니다. 소프트웨어 버전·기본값·서비스 정책은 바뀔 수 있으므로 적용 전 각 문서의 최신 내용을 확인하세요. 이 글은 일반 정보이며 특정 서비스 가입을 권하지 않습니다.