리눅스 서버를 다루다 보면 chmod 명령어를 자주 사용하게 된다. 특히 파일 업로드 기능, 권한 설정, 디렉토리 접근 제한 등 웹 개발 과정에서 거의 매일 마주친다. 다만 대부분의 개발자들은 chmod 뒤에 붙는 숫자가 정확히 뭔지 모른 채 인터넷에서 가져온 코드를 그냥 복사해 붙인다. "755 권한으로 설정해" 라는 말은 들어봤지만, 왜 755인지, 644와 777은 뭐가 다른지 설명할 수 없는 경우가 많다.
권한 설정을 잘못하면 보안 문제가 될 수도 있고, 특정 파일이 실행되지 않거나 쓰기가 불가능해진다. 따라서 chmod의 기본 원리를 이해하는 것은 필수다. 이번에는 chmod 권한 체계를 처음부터 차근차근 설명해서, 이 글을 읽은 후에는 어떤 권한값이 필요한지 스스로 판단할 수 있도록 하겠다.
먼저 리눅스에서 파일의 권한을 확인해보자.
ls -l
결과:
drwxr-xr-x 2 root root 4096 Jan 15 10:30 mydir
-rw-r--r-- 1 user user 1024 Jan 15 10:25 myfile.txt
-rwxr-xr-x 1 root root 2048 Jan 15 10:20 script.sh
복잡해 보이지만 각 부분을 나누면 다음과 같다:
-rw-r--r-- 1 user user 1024 Jan 15 10:25 myfile.txt
↑ ↑↑↑ ↑↑↑ ↑↑↑
| ||| ||| |||
| ||| ||| +-- 소유자 그룹 (user)
| ||| ||----- 타 사용자 권한 (other)
| ||| +------ 그룹 권한 (group)
| |+--------- 소유자 권한 (owner)
+-------------- 파일 타입 (- = 일반 파일, d = 디렉토리)
권한 기호 설명:
- r (Read, 읽기) = 파일 읽기, 디렉토리 내용 조회
- w (Write, 쓰기) = 파일 수정/생성, 디렉토리 내 파일 생성/삭제
- x (Execute, 실행) = 파일 실행, 디렉토리 접근
리눅스 권한은 기호(r, w, x)로도 표현하지만, 숫자로도 표현할 수 있다. 이것이 바로 chmod 뒤에 붙는 숫자들이다.
r (읽기) = 4
w (쓰기) = 2
x (실행) = 1
각 자릿수는 세 가지 권한의 합:
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
-wx = 0+2+1 = 3
-w- = 0+2+0 = 2
--x = 0+0+1 = 1
--- = 0+0+0 = 0
chmod 숫자 세 자리는 다음을 의미한다:
chmod 755 myfile
|||
||+-- 타 사용자 (other) 권한
|+--- 그룹 (group) 권한
+---- 소유자 (owner) 권한
755 =
7 (owner): rwx (읽기+쓰기+실행)
5 (group): r-x (읽기+실행, 쓰기 불가)
5 (other): r-x (읽기+실행, 쓰기 불가)
1. 755 - 디렉토리와 실행 파일
chmod 755 mydir
chmod 755 script.sh
# 의미:
# 소유자: rwx (읽기, 쓰기, 실행 가능)
# 그룹: r-x (읽기, 실행만 가능)
# 타인: r-x (읽기, 실행만 가능)
# 언제 사용: 웹 서버 공개 디렉토리, 실행 스크립트
2. 644 - 일반 텍스트 파일
chmod 644 myfile.txt
chmod 644 config.php
# 의미:
# 소유자: rw- (읽기, 쓰기 가능)
# 그룹: r-- (읽기만 가능)
# 타인: r-- (읽기만 가능)
# 언제 사용: 웹 서버 공개 파일 (HTML, CSS, JS, PHP)
3. 777 - 모든 권한 (위험!)
chmod 777 upload/
chmod 777 temp/
# 의미:
# 소유자: rwx
# 그룹: rwx
# 타인: rwx (누구나 읽고, 쓰고, 실행 가능)
# 주의: 매우 위험한 설정. 파일 업로드 디렉토리처럼
# 꼭 필요한 경우에만 제한적으로 사용해야 함
4. 700 - 소유자만 접근
chmod 700 private_dir/
# 의미:
# 소유자: rwx (모든 권한)
# 그룹: --- (접근 불가)
# 타인: --- (접근 불가)
# 언제 사용: 백업 파일, 설정 파일 등 민감한 정보
5. 600 - 소유자만 읽고 쓰기
chmod 600 .ssh/id_rsa
chmod 600 config.ini
# 의미:
# 소유자: rw- (읽기, 쓰기만 가능, 실행 불가)
# 그룹: --- (접근 불가)
# 타인: --- (접근 불가)
# 언제 사용: 비밀번호, API 키 등이 담긴 설정 파일
PHP 웹 서버 (Apache, Nginx):
# 공개 디렉토리
chmod 755 public_html/
chmod 755 public_html/images/
# 공개 파일
chmod 644 public_html/index.php
chmod 644 public_html/style.css
# 업로드 디렉토리 (서버가 쓰기 권한 필요)
chmod 755 upload/
# 또는 소유자/그룹만 쓰기 권한 필요 시
chmod 775 upload/
# 설정 파일 (소유자만)
chmod 600 config/database.php
chmod 600 .env
실행 스크립트:
# Cron 작업 스크립트
chmod 755 backup.sh
chmod 755 cleanup.sh
# 하지만 다음과 같이 더 제한할 수도 있음
chmod 700 backup.sh # 소유자만 실행
숫자만 아니라 기호로도 chmod를 사용할 수 있다.
# 기호 설명:
# u (user/owner) = 소유자
# g (group) = 그룹
# o (other) = 타 사용자
# a (all) = 모두
# + = 권한 추가
# - = 권한 제거
# = = 권한 설정 (기존 권한 무시)
# 예제:
chmod u+x script.sh # 소유자에게 실행 권한 추가
chmod g-w myfile.txt # 그룹에서 쓰기 권한 제거
chmod o-r config.php # 타인의 읽기 권한 제거
chmod a+r file.txt # 모두에게 읽기 권한 추가
chmod u=rwx,g=rx,o=rx myfile # 특정 권한으로 설정 (755와 동일)
디렉토리 내의 모든 파일과 하위 디렉토리의 권한을 한 번에 변경할 때:
# 디렉토리와 파일 모두 755로 설정
chmod -R 755 mydir/
# 주의: -R (recursive) 옵션은 디렉토리와 파일 모두에 같은 권한 적용
# 따라서 다음과 같이 더 세밀하게 설정하는 게 좋음:
# 모든 디렉토리는 755, 모든 파일은 644로 설정
find mydir -type d -exec chmod 755 {} ;
find mydir -type f -exec chmod 644 {} ;
문제 1: "Permission denied" 에러
# 파일을 실행하려 했는데 권한이 없다
./script.sh
# -bash: ./script.sh: Permission denied
# 해결
chmod +x script.sh
./script.sh
문제 2: PHP 스크립트가 파일을 쓸 수 없음
# PHP 스크립트(웹서버 유저)가 파일을 수정할 수 없음
# 예: 업로드된 파일 저장 불가
# 해결 방법 1: 디렉토리 권한 755로 설정
chmod 755 upload/
# 해결 방법 2: 소유자/그룹 모두 쓰기 권한
chmod 775 upload/
# 해결 방법 3: 소유자만 권한 (웹서버가 소유자인 경우)
chmod 755 upload/
chown www-data:www-data upload/ # 소유자를 웹서버 유저로 변경
문제 3: SSH 키 권한이 이상함
<code"># SSH 연결 안 됨 - "Permissions 0777 are too open" 에러
# SSH 키 권한이 너무 느슨함
# 해결
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh
새로운 서버에 웹사이트를 배포할 때 이 순서대로 확인하면 된다:
# 1. 웹 루트 디렉토리
chmod 755 public_html/
# 2. 모든 PHP 파일
chmod 644 public_html/*.php
# 3. 모든 정적 파일 (이미지, CSS, JS)
chmod 644 public_html/images/*
chmod 644 public_html/css/*
# 4. 업로드 디렉토리 (서버가 쓰기 가능해야 함)
chmod 755 public_html/upload/
# 5. 캐시/임시 디렉토리
chmod 755 public_html/cache/
chmod 755 public_html/temp/
# 6. 설정 파일들
chmod 600 config/database.php
chmod 600 .env
chmod 600 .htaccess
# 7. Cron 스크립트
chmod 755 scripts/backup.sh
chmod 755 scripts/cleanup.sh
# 8. 확인
ls -l public_html/
ls -la config/
리눅스 권한은 처음엔 복잡하게 느껴지지만, 기본 원리를 이해하면 매우 간단하다. 특히 웹 개발에서는 755, 644, 777 정도만 알아도 대부분의 경우를 해결할 수 있다. 다만 보안을 위해 꼭 필요한 권한만 부여하는 습관을 들이고, 777 권한은 가능한 한 피하는 것이 좋다. 이 글의 체크리스트를 북마크해두고 새로운 프로젝트를 시작할 때마다 참고하면 권한 설정 문제로 고민할 일이 없을 것이다.