chown: 파일과 디렉터리의 소유자·소유 그룹을 변경하는 명령
chown은 리눅스에서 파일과 디렉터리의 소유자(owner)와 소유 그룹(group)을 바꾸는 명령이다. 소유권은 파일 접근 권한 판정의 기준이 되므로 배포, 컨테이너 볼륨, 웹 서버 디렉터리 설정에서 자주 쓰인다. 기본 사용법, 재귀 옵션, 심볼릭 링크 처리 방식과 주의점을 정리한다.
By 송민성
1. 개념
chown(change owner)은 파일이나 디렉터리의 소유자(user owner)와 소유 그룹(group owner)을 변경하는 명령이다. 리눅스의 모든 파일은 inode에 소유자 UID와 그룹 GID를 저장한다.
chown [옵션] 소유자[:그룹] 대상...| 형식 | 의미 |
|---|---|
| chown alice file | 소유자만 alice로 변경 |
| chown alice:dev file | 소유자는 alice, 그룹은 dev로 변경 |
| chown :dev file | 그룹만 dev로 변경 |
| chown alice: file | 소유자를 alice로, 그룹을 alice의 로그인 그룹으로 변경 |
2. 왜 사용하는가
리눅스는 파일 접근을 "소유자 / 그룹 / 기타(others)" 세 부류로 나누어 rwx 권한을 판정한다. 따라서 누가 소유자인지에 따라 같은 권한 비트(chmod)도 다른 결과를 낸다.
- root로 파일을 생성했다가 일반 사용자가 수정해야 할 때
- 웹 서버 프로세스(예:
www-data)가 업로드 디렉터리에 쓰기 해야 할 때 - 압축 해제, 복사,
sudo작업으로 소유자가 어긋난 파일을 바로잡을 때
3. 동작 원리
- 사용자가
chown을 실행하면 프로그램이 이름을 UID/GID로 변환한다(/etc/passwd,/etc/group등 NSS 조회). 숫자 ID를 직접 줄 수도 있다. chown(2),fchownat(2)같은 시스템 콜(system call)로 커널에 요청한다.- 커널이 권한을 검사한 뒤 inode의 소유자·그룹 필드를 갱신한다.
리눅스에서 파일의 소유자를 바꾸는 것은 일반적으로 root 권한(CAP_CHOWN)이 필요하다. 일반 사용자는 자신이 소유한 파일의 그룹을 자신이 속한 그룹으로만 바꿀 수 있다.
심볼릭 링크(symbolic link)는 기본적으로 링크가 가리키는 대상 파일을 변경한다. 링크 자체를 바꾸려면 -h를 쓴다.
4. 코드 예제
실습용 디렉터리에서 안전하게 확인하는 예제다. (sudo가 가능한 환경, www-data 사용자가 있는 Debian/Ubuntu 계열 기준)
# 실습 디렉터리 준비
mkdir -p /tmp/chown-demo/uploads
cd /tmp/chown-demo
touch app.log uploads/a.txt
# 현재 소유자 확인
ls -l app.log
# 소유자 변경
sudo chown www-data app.log
ls -l app.log
# 소유자와 그룹 동시 변경
sudo chown www-data:www-data app.log
# 그룹만 변경
sudo chown :adm app.log
# 디렉터리 하위 전체 재귀 변경
sudo chown -R www-data:www-data uploads
ls -lR uploads
# 숫자 ID로 지정 (UID 1000, GID 1000)
sudo chown 1000:1000 app.log
# 변경된 항목만 출력
sudo chown -c root:root app.log
# 다른 파일의 소유자를 기준으로 복제
sudo chown --reference=app.log uploads/a.txt
# 심볼릭 링크 자체의 소유자 변경
ln -s app.log app.link
sudo chown -h www-data app.link주요 옵션은 다음과 같다.
| 옵션 | 설명 |
|---|---|
| -R | 디렉터리를 재귀(recursive)로 처리 |
| -v | 처리한 모든 파일을 출력(verbose) |
| -c | 실제로 변경된 파일만 출력 |
| -h | 심볼릭 링크 자체를 변경 |
| --reference=FILE | FILE의 소유자·그룹을 그대로 적용 |
| --from=현재소유자 | 현재 소유자가 일치할 때만 변경 |
5. 시간 복잡도 또는 성능 특성
단일 파일의 chown은 inode 메타데이터만 수정하므로 파일 크기와 무관하다. 데이터 블록을 읽거나 쓰지 않는다. -R 사용 시에는 처리 대상 파일·디렉터리 개수 n에 비례하여 시스템 콜이 호출되므로 O(n)이다. 파일 수가 매우 많은 디렉터리에서는 시간이 오래 걸릴 수 있다.
6. 실무 사용 사례
- 웹 서버 배포: 배포 스크립트가 root로 파일을 푼 뒤
chown -R deploy:www-data /var/www/app으로 정리한다. - Docker 볼륨: 컨테이너 내부 UID와 호스트 UID가 달라 쓰기 오류가 날 때 호스트 디렉터리의 소유자를 컨테이너 사용자 UID로 맞춘다.
- `sudo`로 만든 파일 복구:
sudo npm install,sudo git clone후 생긴 root 소유 파일을sudo chown -R "$USER": .으로 되돌린다. - 서비스 계정 분리: 데이터베이스, 로그 디렉터리를 전용 계정 소유로 두어 최소 권한 원칙을 지킨다.
7. 주의할 점
- 경로 실수:
sudo chown -R user /또는/usr,/etc같은 시스템 경로에 재귀 적용하면 시스템이 손상될 수 있다. 실행 전 경로를 반드시 확인한다. - 심볼릭 링크와 `-R`: 재귀 시 링크 처리 방식은
-H,-L,-P옵션에 따라 달라지며, 의도하지 않은 외부 경로를 변경하지 않도록 주의한다. 기본 동작은 재귀 순회 중 링크를 따라가지 않는다. - **
.*글롭 패턴**:chown -R user .*는..까지 포함해 상위 디렉터리를 건드릴 수 있어 위험하다. - 권한 비트와의 관계:
chown은rwx비트를 바꾸지 않는다. 접근 제어는chmod와 함께 판단한다. 또한 setuid/setgid 비트가 있는 실행 파일은 소유자 변경 시 해당 비트가 해제될 수 있다. - 이름과 숫자 ID: 컨테이너나 다른 서버로 옮기면 같은 UID가 다른 사용자를 가리킬 수 있다.
8. 핵심 정리
chown 소유자:그룹 대상으로 파일의 소유자와 소유 그룹을 바꾼다.- 소유자 변경은 보통 root 권한이 필요하고, 일반 사용자는 자기 파일의 그룹만 자신이 속한 그룹으로 바꿀 수 있다.
- 단일 파일은 inode 메타데이터만 수정하며,
-R은 대상 개수 n에 비례하는 O(n)이다. -R사용 전에는 경로를 반드시 확인하고, 링크와.*패턴을 조심한다.- 권한 비트는
chmod, 소유권은chown으로 역할이 나뉜다.