Linux 파일 권한은 거의 모든 개발자가 한 번쯤 혼란을 겪습니다. 755가 필요한 상황에서 644로 잠긴 파일이나, 프로덕션 환경에서 디렉토리를 실수로 777로 설정하는 경우——이는 실제 보안상 결과를 초래하는 일반적인 실수입니다. 이 가이드에서는 각 권한 값이 정확히 무엇을 의미하는지, 언제 사용해야 하는지 설명합니다.
Unix 권한 모델
Linux 시스템의 모든 파일과 디렉토리에는 세 가지 권한 세트가 있습니다:
- 소유자 — 파일을 소유한 사용자
- 그룹 — 파일에 할당된 그룹의 사용자
- 기타 — 그 외의 모든 사람
각 세트는 세 가지 권한 유형을 가질 수 있습니다:
| 기호 | 이름 | 파일에서 | 디렉토리에서 |
|---|---|---|---|
r | read | 파일 내용 보기 | 디렉토리 내용 나열(ls) |
w | write | 파일 내용 수정 | 내부 파일 생성, 이름 변경, 삭제 |
x | execute | 프로그램으로 실행 | 디렉토리 진입(cd) 및 파일 접근 |
ls -la
# -rwxr-xr-- 1 alice dev 4096 Apr 5 10:00 deploy.sh
# ^^^ ^^^ ^^^
# | | 기타: r-- (4)
# | 그룹: r-x (5)
# 소유자: rwx (7)
8진수 표기
각 권한 트리플은 이진 가중치를 사용하여 한 자리 숫자로 매핑됩니다:
r = 4 (이진수 100)
w = 2 (이진수 010)
x = 1 (이진수 001)
각 세트의 값을 더합니다:
| 8진 | 이진 | 권한 |
|---|---|---|
| 7 | 111 | rwx |
| 6 | 110 | rw- |
| 5 | 101 | r-x |
| 4 | 100 | r— |
| 0 | 000 | --- |
세 자리 8진수 값(예: 755)은 소유자/그룹/기타 순서를 나타냅니다.
자주 사용하는 chmod 값
chmod 755
소유자: rwx (7) — 읽기, 쓰기, 실행
그룹: r-x (5) — 읽기, 실행
기타: r-x (5) — 읽기, 실행
사용처: 실행 파일, 셸 스크립트, 다른 사람이 쓸 수 없지만 공개 접근 가능한 디렉토리. 바이너리, 애플리케이션 디렉토리, 웹 서버 루트의 표준값.
chmod 755 /var/www/html
chmod 755 deploy.sh
chmod 644
소유자: rw- (6) — 읽기, 쓰기
그룹: r-- (4) — 읽기 전용
기타: r-- (4) — 읽기 전용
사용처: 설정 파일, HTML 파일, 이미지, 텍스트 문서 같은 일반 파일. 소유자는 수정할 수 있지만 다른 사람은 읽기만 가능.
chmod 644 index.html
chmod 644 /etc/nginx/nginx.conf
chmod 600
소유자: rw- (6) — 읽기, 쓰기
그룹: --- (0) — 접근 불가
기타: --- (0) — 접근 불가
사용처: 소유자만 접근해야 하는 개인 파일——SSH 개인 키(~/.ssh/id_rsa), 패스워드 파일, 시크릿 토큰. SSH는 개인 키 권한이 정확히 이 값이 아니면 사용을 거부합니다.
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
chmod 777
소유자: rwx (7) — 읽기, 쓰기, 실행
그룹: rwx (7) — 읽기, 쓰기, 실행
기타: rwx (7) — 읽기, 쓰기, 실행
위험 구역. 시스템의 누구나 읽고, 쓰고, 실행할 수 있습니다. 프로덕션 서버에서는 절대 777을 사용하지 마세요. 특히 웹 루트 내의 디렉토리에서는 임의의 프로세스나 사용자가 임의의 파일을 쓸 수 있게 됩니다.
유일하게 정당한 사용 경우: 권한이 문제 원인인지 확인하기 위한 로컬 개발 환경에서의 빠른 디버깅. 반드시 원래대로 되돌려야 합니다.
chmod 775 vs 755
775는 그룹에 쓰기 접근을 부여합니다. 여러 팀원(같은 그룹)이 공유 파일을 수정해야 하는 협업 환경에서 사용합니다:
chown -R :developers /var/www/project
chmod -R 775 /var/www/project
기호 표기
8진수 형식은 정확하지만 암산이 필요합니다. 기호 표기는 점진적 변경에 더 가독성이 높습니다:
# 소유자에게 실행 권한 추가
chmod u+x script.sh
# 그룹과 기타에서 쓰기 제거
chmod go-w sensitive.cfg
# 정확한 권한 설정: rw-r--r--
chmod u=rw,go=r file.txt
# 모두에게 실행 비트 추가
chmod a+x script.sh
기호: u = 소유자(사용자), g = 그룹, o = 기타, a = 전체.
연산자: + = 추가, - = 제거, = = 정확히 설정.
재귀 권한
디렉토리와 그 안의 모든 것에 권한 적용:
chmod -R 755 /var/www/html
주의: -R은 파일과 디렉토리 모두에 같은 모드를 적용합니다. 디렉토리는 진입하려면 x가 필요하지만 일반 파일은 보통 x가 필요 없습니다. chmod -R 777을 코드베이스에 무분별하게 실행하면 모든 파일에 실행 권한이 붙습니다.
더 나은 방법: find를 사용해 파일과 디렉토리에 다른 권한 적용:
# 디렉토리: 755
find /var/www/html -type d -exec chmod 755 {} \;
# 파일: 644
find /var/www/html -type f -exec chmod 644 {} \;
특수 비트
표준 9비트 외에 세 가지 특수 모드가 있습니다:
Setuid(4xxx): 실행 파일에 설정하면 프로그램이 실행한 사용자가 아닌 파일 소유자로 실행됩니다. sudo, passwd 등에서 사용됩니다.
Setgid(2xxx): 디렉토리에 설정하면 새 파일이 생성자의 기본 그룹이 아닌 디렉토리의 그룹을 상속합니다. 공유 프로젝트 디렉토리에 유용합니다.
스티키 비트(1xxx): 디렉토리에 설정하면 사용자가 자신이 소유하지 않은 파일을 삭제할 수 없습니다. 사용자가 서로의 임시 파일을 삭제하지 못하도록 /tmp에 설정됩니다.
ls -la /
# drwxrwxrwt ... tmp (스티키 비트 = 끝의 't')
ls -la /usr/bin/passwd
# -rwsr-xr-x ... passwd (setuid = 's')
빠른 참조
| 8진 | 기호 형식 | 일반적인 사용처 |
|---|---|---|
| 400 | r-------- | 소유자 전용 읽기 |
| 600 | rw------- | 개인 파일, SSH 키, .env |
| 644 | rw-r—r— | 웹 파일, 설정, 일반 파일 |
| 700 | rwx------ | 개인 스크립트, 개인 디렉토리 |
| 755 | rwxr-xr-x | 스크립트, 바이너리, 공개 디렉토리 |
| 775 | rwxrwxr-x | 공유 그룹 프로젝트 디렉토리 |
| 777 | rwxrwxrwx | 프로덕션에서 피할 것 |
계산 없이 chmod 값 확인
8진수를 머릿속으로 계산하고 있다면 계산기를 사용하세요. ZeroTool chmod 계산기 사용해보기 →
소유자, 그룹, 기타에 대해 읽기/쓰기/실행을 체크하면 8진수 값이 즉시 업데이트됩니다. 8진수 값을 붙여 넣어 정확한 권한을 확인할 수도 있습니다——다른 사람의 배포 스크립트를 읽을 때 유용합니다.
요약
90%의 경우에 사용하는 값은 파일에는 644, 디렉토리와 실행 파일에는 755 두 가지입니다. 개인적으로 유지해야 하는 것에는 600을 사용하세요. 중요한 환경에서는 777을 피하세요.
특정 8진수 값이 의미하는 것에 대해 확신이 없다면 추측하지 말고 **chmod 계산기로 확인**하세요.