고급 PHP 프로그래밍 – 파일 처리 – 3 – 파일 및 디렉터리 권한 설정

고급 PHP 프로그래밍 - 파일 처리 - 3 - 파일 및 디렉터리 권한 설정
고급 PHP 프로그래밍 – 파일 처리 – 3 – 파일 및 디렉터리 권한 설정

고급 PHP 프로그래밍 – 파일 처리 – 파일 및 디렉터리 권한 설정

안녕하세요! 😊
이번 시간에는 PHP 개발 시 절대 빠뜨려선 안 되는 중요한 주제, 바로 파일 및 디렉터리 권한 설정에 대해 자세히 알려드릴게요.
웹사이트는 수많은 파일과 폴더로 구성되어 있고, 그 안에서 어떤 사용자나 프로그램이 어떤 작업을 할 수 있는지를 정해주는 것이 바로 ‘권한(permission)’입니다.

이 권한을 제대로 설정하지 않으면,
📛 파일 업로드가 되지 않거나,
🔐 해커가 서버의 민감한 정보에 접근할 수도 있어요!
그래서 권한 설정은 보안과 기능 모두를 책임지는 핵심 요소랍니다!


파일 및 디렉터리 권한이란?

운영체제(특히 리눅스)는 파일과 디렉터리에 대해 누가 읽고/쓰고/실행할 수 있는지를 정하는 규칙을 갖고 있어요.

PHP가 파일을 열거나, 쓰거나, 폴더를 만들거나 삭제하려면,
서버(보통 Apache/Nginx의 www-data 사용자)가 해당 작업을 할 수 있도록 권한이 열려 있어야 해요.


리눅스 권한의 기본 구조

✅ 권한 구조

r  = 읽기(Read)
w  = 쓰기(Write)
x  = 실행(Execute)

파일이나 폴더에는 아래처럼 3단계 권한이 존재합니다:

위치 설명
사용자(owner) 파일/폴더의 소유자
그룹(group) 동일 그룹의 사용자
기타(other) 나머지 모든 사용자 (대부분 웹 사용자 포함)

예를 들어 -rw-r--r--는 다음과 같은 의미예요:

  • 소유자: 읽기(r), 쓰기(w)
  • 그룹: 읽기(r)
  • 기타: 읽기(r)

퍼미션 숫자 표기법

권한은 숫자로도 표현됩니다.
각 권한을 더해서 조합하는 방식이에요.

권한
없음 0
실행(x) 1
쓰기(w) 2
읽기(r) 4

즉,

  • 7 = 4 + 2 + 1rwx (읽기, 쓰기, 실행)
  • 6 = 4 + 2rw-
  • 5 = 4 + 1r-x
  • 0 = ---

📌 예시: chmod 755

  • 사용자: 7 (rwx)
  • 그룹: 5 (r-x)
  • 기타: 5 (r-x)

→ 소유자는 읽기/쓰기/실행, 나머지는 읽기/실행 가능


1. PHP에서 권한 설정: chmod()

PHP에서도 코드를 통해 파일이나 디렉터리의 권한을 변경할 수 있어요!

chmod("uploads", 0755);  // 디렉터리에 대한 권한 설정
chmod("config.php", 0644);  // 파일에 대한 권한 설정

앞의 0은 8진수(octal)임을 의미합니다.


2. 파일 업로드 디렉터리 권한 설정

mkdir uploads
chmod 755 uploads

PHP에서 move_uploaded_file()을 사용하려면 웹서버가 해당 디렉터리에 쓰기 권한이 있어야 해요.

테스트 용으로는 다음과 같이 설정하기도 합니다:

chmod 777 uploads

하지만 777은 모든 사용자에게 열려 있어서 보안에 매우 취약하므로 실서버에선 지양!


3. PHP에서 파일 생성 후 권한 설정

file_put_contents("new.txt", "새로운 파일 내용");
chmod("new.txt", 0644); // 웹에서 읽을 수 있도록 기본 권한 설정

0644: 읽기/쓰기(소유자), 읽기(그 외) → 안전하고 일반적인 설정입니다.


4. 디렉터리인지 확인: is_dir(), is_writable(), is_readable()

🧪 사용 예시

$folder = "uploads";
if (is_dir($folder)) {
    if (is_writable($folder)) {
        echo "✅ '$folder' 디렉터리에 쓰기 가능!";
    } else {
        echo "❌ '$folder' 디렉터리에 쓰기 불가능!";
    }
}

이처럼 업로드 또는 로그 기록 등을 하기 전, 권한 검사를 해주는 것이 좋습니다!


5. 파일/디렉터리 소유자 변경 (서버에서 터미널 사용)

sudo chown -R www-data:www-data /var/www/html
  • www-data는 Apache가 사용하는 기본 사용자 계정
  • 실서버에서 PHP가 파일을 쓰기 위해서는 파일의 소유자가 웹 서버여야 함

6. 실무에서 자주 사용하는 권한 설정

대상 권한 설명
PHP 파일 644 대부분 읽기만 허용, 실행은 필요 없음
업로드 디렉터리 755 웹서버가 접근 가능해야 함
로그 파일 644 or 664 읽기/쓰기 허용, 실행은 불필요
설정 파일 600 민감 정보 포함 시, 소유자만 읽기/쓰기 가능

7. 권한 문제 에러 예시

에러 메시지 원인
Permission denied 파일 쓰기/읽기 권한 없음
failed to open stream 디렉터리 접근 권한 없음
move_uploaded_file(): failed to open stream 업로드 폴더에 쓰기 권한 없음
unlink(): Permission denied 삭제 대상 파일에 쓰기 권한 없음

✅ 이런 오류가 발생한다면, chmod() 또는 chown 명령어로 권한 확인부터!


마무리 요약 🧠

항목 핵심 내용
chmod() PHP에서 권한 변경
0755 폴더용 일반 권장 권한
0644 파일용 일반 권장 권한
777 테스트용 가능하지만 절대 실서버 사용 금지
is_writable() 사전 권한 검사 함수
chown 서버 상에서 소유자 변경

마무리하며 😊

웹 개발에서 보안은 옵션이 아닌 필수입니다.
파일과 디렉터리의 권한을 올바르게 설정해주는 것만으로도 많은 보안 사고를 예방할 수 있어요!

앞으로는 파일을 만들거나, 디렉터리를 생성할 때마다
“이 권한 설정이 안전한가?”를 한 번쯤 꼭 체크하는 습관을 들여보세요.
그게 바로 프로다운 PHP 개발자의 시작입니다 💪

다음 시간에는 파일과 디렉터리를 이용한 백업 자동화 및 관리 스크립트에 대해서도 소개해드릴게요.
오늘도 안전하고 멋진 코딩 되세요! 💻🔐✨

답글 남기기