Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기
리눅스는 사용자에게 UID(사용자 ID), 그룹에 GID(그룹 ID)를 부여하고, 파일에는 소유 사용자와 소유 그룹을 기록합니다. 계정에는 기본 그룹과 추가 그룹이 있을 수 있습니다. 현재 계정과 파일 소유권을 확인할 때는 id, groups, getent, ls -l을 사용합니다. 이 강좌는 소유권을 바꾸지 않고, 표시된 정보를 정확히 읽는 데 집중합니다.
사용자 ID와 그룹 ID의 의미
사람이 보는 learner 같은 계정 이름과 시스템이 사용하는 숫자 UID는 대응 관계에 있습니다. 그룹도 이름과 숫자 GID를 가집니다. 사용자의 기본 그룹은 계정 정보에 지정된 대표 그룹이고, 추가 그룹은 별도로 가입한 그룹입니다. 실제 권한 판단에는 소유 사용자·그룹과 파일의 권한 비트 등이 함께 사용됩니다. 그룹에 속한다는 사실만으로 모든 그룹 파일을 읽거나 수정할 수 있는 것은 아닙니다.
root는 일반적으로 UID 0인 관리자 계정입니다. 일반 계정의 UID와 GID가 반드시 1000부터 시작한다고 가정하지 마세요. 시스템과 계정 생성 정책에 따라 값이 다릅니다.
현재 세션의 사용자와 그룹 확인하기
다음 명령은 일반 사용자로 실행할 수 있으며 계정을 변경하지 않습니다. id는 현재 사용자·기본 그룹·참여 그룹의 이름과 숫자 ID를 보여 줍니다. id -un은 사용자 이름, id -gn은 기본 그룹 이름, id -nG는 참여 그룹 이름을 출력합니다.
id id -un id -gn id -nG groups
예를 들어 id 결과에 uid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel)처럼 표시될 수 있습니다. 이는 설명용 예시이며 실제 이름·숫자·그룹은 시스템마다 다릅니다. gid=...는 기본 그룹, groups=...는 현재 세션에 적용된 그룹 목록입니다.
groups도 현재 세션의 그룹 이름을 간단히 확인합니다. 관리자가 방금 그룹 소속을 바꿨다면 이미 열린 로그인 세션의 그룹 목록은 곧바로 달라지지 않을 수 있습니다. 사용자 데이터베이스의 설정과 현재 프로세스에 적용된 그룹을 구별하세요.
getent로 계정 데이터 조회하기
getent는 시스템의 Name Service Switch(NSS)가 사용하는 계정·그룹 데이터베이스를 조회합니다. 환경에 따라 로컬 파일뿐 아니라 외부 디렉터리 서비스가 결과에 포함될 수 있으므로, /etc/passwd만 직접 읽는 것보다 실제 이름 조회 방식을 잘 반영할 수 있습니다. 다음 예제는 현재 사용자와 기본 그룹을 조회합니다.
getent passwd "$(id -un)" getent group "$(id -gn)"
getent passwd의 한 줄은 보통 이름, 암호 자리표시자, UID, 기본 GID, 설명, 홈 디렉터리, 로그인 셸을 콜론으로 구분합니다. 암호 자체가 그 줄에 평문으로 표시된다는 뜻은 아닙니다. getent group은 그룹 이름과 GID 등을 보여 줍니다. 그룹 항목의 구성원 목록만 보고 기본 그룹을 사용하는 사용자를 모두 알 수는 없으므로, 사용자의 실제 그룹은 id로 확인하는 편이 좋습니다.
최소 설치 환경에는 getent가 없을 수도 있습니다. 그때는 설치된 libc·배포판의 조회 도구를 확인하세요. 계정 정보를 바꾸려고 /etc/passwd나 /etc/group을 임의로 직접 편집하지 마세요.
파일의 소유 사용자와 그룹 읽기
실습 파일을 만들어 소유권을 확인해 봅니다. ~/linux-course-16-practice가 이미 있다면 다른 이름을 정하고, mkdir가 실패하면 뒤의 명령을 실행하지 마세요. touch는 기존 파일에 실행하면 시각을 바꿀 수 있습니다.
mkdir ~/linux-course-16-practice cd ~/linux-course-16-practice pwd touch own.txt ls -l own.txt
ls -l의 출력에서 권한과 링크 수 다음에 나오는 두 이름이 일반적으로 소유 사용자와 소유 그룹입니다. 새 파일은 보통 현재 사용자가 소유하지만 그룹 선택은 부모 디렉터리의 설정과 파일 시스템 동작에 영향을 받을 수 있으므로, 기본 그룹과 같다고 무조건 단정하지 마세요. 크기와 시각도 환경에 따라 다릅니다.
GNU stat으로 이름과 숫자 ID를 한 줄에 뽑아 비교할 수도 있습니다. %U/%G는 소유 사용자·그룹 이름, %u/%g는 해당 숫자 ID입니다.
stat -c '%U | %G | %u | %g | %n' own.txt
예를 들어 learner | learner | 1000 | 1000 | own.txt처럼 나올 수 있지만, 실제 값을 확인해야 합니다. 소유권은 ‘누가 소유하는가’를 기록하고 권한은 ‘무엇을 할 수 있는가’를 결정하는 별도 정보입니다. 파일 소유자를 바꾸는 chown은 시스템과 데이터에 영향을 주므로 이 읽기 전용 실습에서는 실행하지 않습니다.
헷갈리기 쉬운 세 가지 구분
- 사용자 이름과 UID: 이름은 표시·조회용이고 파일 시스템은 숫자 ID도 사용합니다.
- 기본 그룹과 추가 그룹: 계정의 기본 그룹 하나와 현재 세션의 여러 그룹을 구분합니다.
- 계정 데이터와 현재 세션: 데이터베이스를 바꿔도 이미 열린 세션의 그룹 목록은 달라지지 않을 수 있습니다.
권한 문제를 만났을 때는 먼저 id로 현재 세션의 사용자·그룹을 확인하고, ls -l이나 stat으로 대상 파일의 소유권을 확인하세요. 두 결과가 서로 어떻게 맞물리는지 본 뒤 권한 설정을 조사해야 원인을 좁힐 수 있습니다.
공식 문서
GNU Coreutils 매뉴얼은 id·groups·ls·stat을, getent(1) 매뉴얼과 nsswitch.conf(5) 매뉴얼은 계정 정보의 조회 경로를 설명합니다.









