
고급 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 + 1
→rwx
(읽기, 쓰기, 실행)6 = 4 + 2
→rw-
5 = 4 + 1
→r-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 개발자의 시작입니다 💪
다음 시간에는 파일과 디렉터리를 이용한 백업 자동화 및 관리 스크립트에 대해서도 소개해드릴게요.
오늘도 안전하고 멋진 코딩 되세요! 💻🔐✨