열 글자를 읽는 법
-rwxr-xr--는 열 글자입니다. 맨 앞 한 글자가 종류이고(- 일반 파일, d 디렉터리, l 심볼릭 링크, c·b 장치 파일, p 파이프, s 소켓), 나머지 아홉 글자를 셋씩 끊어 소유자·그룹·기타 사용자 순서로 읽습니다. 각 세 글자는 읽기(r)·쓰기(w)·실행(x)이고 없으면 -입니다. 위 예시는 소유자가 읽고 쓰고 실행, 그룹은 읽고 실행, 나머지는 읽기만 되는 상태이고 8진수로 754입니다. 8진수는 r=4, w=2, x=1을 더한 값을 셋 나열한 것이라 rwx는 7, r-x는 5, r--는 4가 됩니다.
디렉터리에서 실행 권한의 의미
파일에서 x는 "실행할 수 있다"이지만 디렉터리에서는 "안으로 들어갈 수 있다"입니다. 그래서 디렉터리에 읽기만 있고 실행이 없으면 ls로 이름은 볼 수 있어도 그 안의 파일을 열 수 없고, 반대로 실행만 있고 읽기가 없으면 목록은 못 보지만 정확한 파일 이름을 알면 열 수 있습니다. 웹 서버가 "파일은 분명히 있는데 403"을 내는 상황은 대개 파일이 아니라 상위 디렉터리 어느 하나에 x가 빠져 있어서 생깁니다. 경로를 위에서부터 하나씩 확인해야 하는 이유입니다. chmod -R로 폴더를 통째로 고칠 때 소문자 x 대신 대문자 X를 쓰면 디렉터리와 이미 실행 가능한 파일에만 x를 붙여 주므로, 텍스트 파일까지 실행 파일로 만들어 버리는 사고를 막을 수 있습니다.
777이 왜 문제인가
업로드가 안 되거나 로그가 안 써질 때 chmod 777로 뚫는 것이 가장 빨라 보이지만, 그 순간 그 파일은 서버의 모든 계정과 모든 프로세스가 고칠 수 있는 상태가 됩니다. 공유 호스팅이라면 남의 계정에서도 손댈 수 있고, 웹 애플리케이션에 취약점이 생겼을 때 공격자가 파일을 바꿔 넣기도 쉬워집니다. 원인은 대부분 권한 숫자가 아니라 소유자에 있습니다. 웹 서버 프로세스가 www-data로 도는데 파일 소유자가 개인 계정이면, 소유자를 웹 서버 계정이나 공용 그룹으로 바꾸고(chown) 권한은 755·644로 두는 것이 정석입니다. 그래도 급히 777을 쓴다면 최소한 어디에 썼는지 적어 두고 나중에 되돌리세요.
특수 비트 세 가지
권한 자리에 x 대신 s나 t가 보이면 특수 비트가 켜진 것입니다. setuid(소유자 자리의 s)는 실행한 사람이 아니라 파일 소유자 권한으로 프로그램을 돌립니다. passwd 명령처럼 일반 사용자가 시스템 파일을 고쳐야 하는 경우에 쓰이지만, 직접 만든 프로그램에 붙으면 곧바로 권한 상승 통로가 됩니다. setgid(그룹 자리의 s)는 디렉터리에 붙일 때가 더 유용해서, 그 안에서 만든 파일이 부모의 그룹을 물려받게 해 팀 공유 폴더에 씁니다. 스티키 비트(기타 자리의 t)는 /tmp처럼 누구나 쓸 수 있는 디렉터리에서 남의 파일을 지우지 못하게 막습니다. 대문자 S·T는 해당 자리의 실행 권한이 없는 상태에서 특수 비트만 켜진 것으로, 대개 의도치 않은 조합입니다.
자주 묻는 질문
권한 문자열 뒤에 + 나 @ 가 붙어 있습니다.
리눅스의 +는 ACL(확장 접근 권한)이, macOS의 @는 확장 속성이 붙어 있다는 표시입니다. rwx 아홉 글자 밖에 추가 규칙이 있다는 뜻이라 실제 접근 가능 여부가 표와 다를 수 있습니다. 리눅스에서는 getfacl 파일명으로 확인하세요.
chmod로 바꿨는데도 접근이 안 됩니다.
상위 디렉터리의 실행 권한, 파일 소유자와 그룹, SELinux나 AppArmor 같은 강제 접근 제어, 마운트 옵션(읽기 전용, noexec) 중 하나가 막고 있을 가능성이 큽니다. 특히 경로 중간 디렉터리에 x가 빠져 있으면 마지막 파일 권한이 아무리 열려 있어도 접근하지 못합니다.
입력한 서버 경로나 계정명이 어디론가 전송되나요?
전송되지 않습니다. 문자열을 해석하는 코드가 브라우저 안에서만 실행되고 네트워크 요청을 전혀 만들지 않습니다. 인터넷을 끊은 상태에서도 같은 결과가 나옵니다.