macOS는 플래그(flag)를 사용해 파일이 변경될 수 있는 방식을 제한합니다. 플래그는 일반적인 권한(permission)과는 다르게 설정되며, chown이나 chmod 같은 명령어와 별개의 평행 구조로 작동합니다. 플래그를 변경할 때는 chflags, 플래그를 확인할 때는 ls 명령어를 사용합니다. 참고로 유닉스(Unix)도 비슷한 시스템을 갖추고 있지만, '플래그' 대신 '속성(attribute)'이라고 부르며 더 많은 옵션을 제공합니다.
macOS에서 설정된 플래그 확인하기
터미널(Terminal)에서 ls 명령어에 옵션을 추가하면 현재 설정된 플래그를 손쉽게 확인할 수 있습니다.
ls -lO ~/Library drwx------@ 88 alexander staff hidden 2992 Jan 25 14:01 Library
파일이나 폴더에 설정된 플래그가 없다면 대시(-)가 표시됩니다.
ls -lO ~/Library/Caches drwx------+ 234 alexander staff - 7956 Jan 25 13:03 Caches
설정된 플래그는 아래에서 설명할 방법으로 그 반대 값을 지정하면 해제할 수 있습니다.
macOS에서 플래그 설정 및 해제하기

플래그는 대부분 문제 상황에서 언급됩니다. 일반 권한 위에 추가적인 제약을 거는 것이기 때문에 놓치기 쉽습니다. 사용자 권한을 아무리 높여도 파일이 삭제되지 않는 경험을 해본 적이 있다면, 하나 이상의 플래그를 해제해야 할 수 있습니다.
macOS에서 설정 가능한 플래그 목록과 기능 설명은 다음과 같습니다. 대부분의 플래그는 파일 소유자 또는 슈퍼유저(superuser)만 설정할 수 있으며, sappnd와 schg는 시스템 레벨 플래그이므로 오직 슈퍼유저만 설정 가능합니다. 권한 상승 없이 설정할 수 있는 것은 hidden 플래그뿐입니다.
플래그 설정하기
macOS에서 플래그를 설정하려면 아래 명령어를 사용합니다. 디렉터리 단위 작업에는 재귀(recursive) 옵션인 -R을 활용할 수 있습니다.
sudo chflags -R [flag] /usr/bin/local sudo chflags [flag] /usr/bin/local/mnt.sh chflags -R hidden ~/Desktop
예를 들어 다음 명령어는 nodump 플래그를 설정합니다.
sudo chflags nodump /usr/bin/local/tty.sh
단, 하나의 chflags 명령어로는 한 번에 하나의 플래그만 설정하거나 해제할 수 있습니다.
- opaque: 여러 디렉터리를 동시에 보던 구식 방식인 유니언 마운트(union mount)를 통해 폴더를 볼 때 불투명하게 표시되도록 설정합니다.
- nodump: 시스템 백업을 위해
dump명령어를 실행할 때 해당 파일이나 폴더가 백업되지 않도록 합니다. - sappnd, sappend: 시스템 추가 전용(append-only) 플래그를 설정합니다. 파일에 내용을 덧붙일 수만 있고 수정이나 삭제는 불가능합니다. 이 플래그를 해제하려면 싱글 유저 모드(single user mode)로 진입해야 합니다.
- schg, schange, simmutable: 시스템 불변(immutable) 플래그를 설정하여 모든 권한 레벨의 사용자가 파일을 변경하지 못하도록 잠급니다. 해제하려면 싱글 유저 모드 진입이 필요합니다.
- uappnd, uappend: 사용자 추가 전용 플래그를 설정합니다. 파일 소유자가 설정할 수 있으며, 권한 상승 없이도 소유자가 직접 해제할 수 있습니다. 낮은 보안 등급에서
sappnd나schg처럼 파일을 잠그는 역할을 하므로 실제로는 훨씬 자주 사용됩니다. - uchg, uchange, uimmutable: 사용자 불변 플래그를 설정합니다.
sappnd와uappnd의 관계처럼, 시스템 불변 플래그의 사용자 버전이라고 생각하면 됩니다. - hidden: 숨김 플래그를 설정합니다. Finder GUI와 ls 명령어 결과에서 해당 항목이 보이지 않게 됩니다.
플래그 해제하기
특정 플래그를 해제하려면 반대되는 값을 지정하면 됩니다. 대부분의 경우 명령어 앞에 "no"를 붙이면 되지만, nodump의 경우에는 예외적으로 dump 플래그를 지정해야 해제됩니다.
sudo chflags dump /usr/bin/local/oty.sh
나머지 일반적인 플래그는 "no" 접두사를 붙여 해제할 수 있습니다.
sudo chflags nosappnd /usr/bin/local/oty.sh
chmod와 마찬가지로 재귀 옵션도 사용할 수 있습니다.
chflags -R nohidden ~/Desktop
모든 플래그가 해제되면 이제 파일의 소유권과 권한을 원하는 대로 자유롭게 변경할 수 있습니다.
유닉스에서 속성(Attribute) 활용하기

유닉스 계열 운영체제도 백엔드에서 비슷한 시스템을 사용하지만, 다른 명령어로 처리합니다. 가장 널리 쓰이는 리눅스 배포판에서는 chattr과 lsattr 명령어를 사용합니다. 이들은 대부분의 유닉스 환경에서 플래그라고 불리는 '속성(attribute)'을 변경하고 조회하는 데 쓰입니다.
속성은 lsattr로 확인할 수 있습니다.
lsattr /path/to/file.txt
속성 변경은 알파벳 코드 조합으로 이루어지며, chattr 매뉴얼 페이지에 자세히 정리되어 있습니다.
"문자 'acdeijstuADST'는 파일의 새로운 속성을 선택합니다: 추가 전용(a), 압축(c), 덤프 제외(d), 익스텐트 포맷(e), 불변(i), 데이터 저널링(j), 안전 삭제(s), 테일 병합 금지(t), 삭제 방지(u), atime 업데이트 금지(A), 동기식 디렉터리 업데이트(D), 동기식 업데이트(S), 디렉터리 계층 최상위(T)."
명령어 형식은 다음과 같습니다.
chattr +s /file/name.txt
이 명령어는 지정된 경로의 파일에 안전 삭제(secure deletion) 속성을 설정합니다.
마무리
플래그는 누가 파일을 변경할 수 있는지 제한해야 할 때 가장 유용합니다. 파일을 잠그면 파일시스템 수준에서 변조나 실수로 인한 편집을 막을 수 있습니다. 루트(root) 권한으로 상승하거나 파일 소유자가 아니라면 이러한 설정을 변경할 수 없기 때문에 나름 강력한 보안 장치이기도 합니다.