리눅스 서버를 다루다 보면 chmod 명령어를 자주 사용하게 된다. 특히 파일 업로드 기능, 권한 설정, 디렉토리 접근 제한 등 웹 개발 과정에서 거의 매일 마주친다. 다만 대부분의 개발자들은 chmod 뒤에 붙는 숫자가 정확히 뭔지 모른 채 인터넷에서 가져온 코드를 그냥 복사해 붙인다. "755 권한으로 설정해" 라는 말은 들어봤지만, 왜 755인지, 644와 777은 뭐가 다른지 설명할 수 없는 경우가 많다. 

 

권한 설정을 잘못하면 보안 문제가 될 수도 있고, 특정 파일이 실행되지 않거나 쓰기가 불가능해진다. 따라서 chmod의 기본 원리를 이해하는 것은 필수다. 이번에는 chmod 권한 체계를 처음부터 차근차근 설명해서, 이 글을 읽은 후에는 어떤 권한값이 필요한지 스스로 판단할 수 있도록 하겠다. 

 

Linux 파일 권한의 기본 구조

먼저 리눅스에서 파일의 권한을 확인해보자.

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, 실행) = 파일 실행, 디렉토리 접근

 

숫자로 표현하기 (8진법)

리눅스 권한은 기호(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 권한은 가능한 한 피하는 것이 좋다. 이 글의 체크리스트를 북마크해두고 새로운 프로젝트를 시작할 때마다 참고하면 권한 설정 문제로 고민할 일이 없을 것이다.