A-3: 권한과 소유권
목차 29
안녕하세요, 홍순구입니다. 지난 시간에 우리는 직접 파일을 만들고, 들여다보고, 옮기고, 안전하게 지우고, 찾아서 압축까지 해봤어요. 이제 리눅스 위에서 제법 손을 놀릴 줄 알게 됐습니다.
그런데 그 과정에서 자꾸 눈에 밟히던 게 하나 있었죠. ls -l을 칠 때마다 줄 맨 앞에 따라다니던 -rw-r--r-- 같은 10글자예요. 압축을 풀 때도 그 정보가 같이 살아난다고 했고요. 그때마다 "이건 권한이라는 건데, 읽는 법은 다음 시간에 배운다"고 미뤄뒀습니다. 오늘이 바로 그 다음 시간이에요. 드디어 이 10글자의 정체를 밝힙니다.
왜 권한이라는 게 있을까요? 리눅스는 처음부터 여러 사람이 컴퓨터 한 대를 나눠 쓰는 환경으로 태어났어요. 회사 서버 한 대에 여러 개발자가 각자 자기 계정으로 들어와 일하는 거죠. 그러면 "이 파일은 내 것, 저 설정은 관리자만"처럼 누가 무엇을 건드릴 수 있는지 칼같이 나눠야 합니다. 그 약속이 바로 권한이에요.
이게 왜 실전에서 중요하냐면 — 서버를 다루다 보면 누구나 한 번쯤 빨간 글씨로 Permission denied(권한 거부)를 만나거든요. 신입 때 이걸 만나면 당황해서 일단 sudo(관리자 권한)부터 붙이고 보는 경우가 많아요. 그런데 그 10글자를 읽을 줄 알면 "아, 이건 내 파일이니까 chmod로 풀면 되네" 또는 "이건 시스템 파일이라 정말 관리자 권한이 필요하구나"를 바로 구분할 수 있습니다. 무작정 sudo를 남발하다 사고 내는 일을 막아주는 거예요.
오늘 우리가 걸어갈 길을 한눈에 그려둘게요.
[나는 누구인가] whoami·id·groups → [권한 10글자 읽기] ls -l
│
▼
[권한 바꾸기] chmod (u+x · 755) → [주인 바꾸기] chown·chgrp
│
▼
[관리자 권한] sudo → [기본 권한] umask → [링크] ln · ln -s
조금 낯선 단어가 많아 보여도 걱정 마세요. 하나씩 "왜 필요한지"부터 풀어가며 천천히 갈 테니 편하게 따라오면 됩니다.
💡 오늘 수업의 핵심 — "권한 10글자를 읽고, chmod로 바꿔, Permission denied를 스스로 푼다"
내가 누구이고 어떤 그룹에 속하는지 확인하고, ls -l 줄 맨 앞 10글자를 읽어 누가 무엇을 할 수 있는지 파악하고, chmod로 권한을 바꾸고, chown으로 주인을 바꾸고, sudo가 왜 필요하고 왜 위험한지 이해하고, umask와 링크(ln)까지 — 여기까지가 오늘의 목표입니다.
🎯 학습 목표
- 멀티유저 리눅스에서 내 정체(
whoami·id·groups)를 확인하고,ls -l의 권한 10글자를 owner/group/others × rwx로 읽어낸다 chmod로 권한을 바꾸고(기호 모드u+x·8진수 모드755),chown/chgrp로 소유자·그룹을 바꾼다sudo가 왜 필요하고 왜 위험한지 이해해Permission denied를 무작정sudo로 때우지 않고 스스로 풀며,umask와 하드/심볼릭 링크(ln)까지 다룬다
Step 1: "여럿이 한 서버를 나눠 쓴다 — 나는 누구인가"
권한 이야기를 하려면, 먼저 "누가 있는가"부터 알아야 해요. 권한이란 결국 "누가 무엇을 할 수 있는가"의 문제니까요.
내 노트북은 보통 나 혼자 씁니다. 그런데 회사의 리눅스 서버는 달라요. 여러 개발자가 각자 자기 계정으로 같은 서버에 들어와 일합니다. 비유하자면 여러 사람이 함께 쓰는 공유 사무실 같은 거예요. 각자 자기 사물함이 있고, 공용 회의실은 함부로 못 바꾸죠.
리눅스 서버 한 대 = 여러 사람이 함께 쓰는 공유 사무실
root ← 관리자(슈퍼유저). 모든 문을 여는 마스터키를 가진 단 한 명
├─ alice ← 개인 사물함 /home/alice (자기 것만 손댈 수 있음)
├─ bob ← 개인 사물함 /home/bob
└─ www-data ← 웹 서버가 쓰는 전용 계정 (사람이 아니라 서비스용)
공용 공간(/etc·/var 등)은 보통 root 만 고칠 수 있다
여기서 가장 중요한 이름이 root예요. root는 이 서버의 관리자 계정, 흔히 슈퍼유저(superuser)라고 부릅니다. 모든 파일을 읽고 쓰고 지울 수 있는, 말 그대로 마스터키를 가진 계정이에요. 그래서 강력한 만큼 위험합니다 — root로 명령 하나 잘못 치면 서버 전체가 날아갈 수도 있거든요. 그래서 평소엔 root로 직접 일하지 않고, 우리 같은 일반 계정(alice)으로 일하다가 꼭 필요할 때만 잠깐 관리자 권한을 빌려 씁니다. 그 "잠깐 빌리는" 명령이 오늘 뒤에서 배울 sudo예요.
그리고 www-data 같은 계정도 보이죠? 사람만 계정을 갖는 게 아니에요. 웹 서버 같은 프로그램도 자기 전용 계정으로 돌아갑니다. "이 서비스는 딱 이만큼만 할 수 있게" 권한을 가둬두기 위해서예요.
자, 그럼 지금 서버에 들어와 있는 나는 누구인지부터 확인해볼게요. 세 가지 명령을 써봅니다.
whoami
alice
whoami는 말 그대로 "who am I", 지금 내가 누구로 로그인해 있는지 계정 이름을 알려줘요. 서버 여러 대를 옮겨 다니다 보면 "지금 내가 어느 계정이지?" 헷갈릴 때가 많은데, 그때 한 번 쳐보는 명령입니다.
이름만으론 부족해요. 내가 어떤 그룹에 속하는지도 알아야 권한을 이해할 수 있거든요.
id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),100(users)
조금 복잡해 보이지만 천천히 읽으면 됩니다. uid는 사용자 번호(user id), gid는 기본 그룹 번호(group id)예요. 리눅스는 속으로는 이름이 아니라 숫자로 사람을 구분합니다. 그리고 뒤의 groups=...가 중요해요 — 내가 속한 모든 그룹의 목록이에요. 여기 sudo라는 그룹이 보이죠? alice가 sudo 그룹에 속해 있다는 건 "이 사람은 관리자 권한을 빌릴 자격이 있다"는 뜻이에요. 이게 뒤에서 sudo 명령을 쓸 수 있는 근거가 됩니다.
그룹만 따로 보고 싶으면 더 간단한 명령도 있어요.
groups
alice sudo users
왜 그룹이 중요할까요? 권한은 세 부류로 나뉘거든요 — 소유자(나) / 그룹 / 그 외 모두. 예를 들어 개발팀 폴더를 만들고 "개발팀 그룹에 속한 사람만 읽게" 설정하면, 일일이 사람을 지정하지 않고 그룹 하나로 여러 명을 한 번에 다룰 수 있어요. 공유 사무실에서 "마케팅팀 출입증을 가진 사람만 이 방에 들어올 수 있음" 같은 거죠.
현업 서버에선 새 팀원이 들어오면 그 사람 계정을 적절한 그룹에 넣어주는 것부터 시작해요. 그래야 팀 공용 폴더에 접근할 수 있거든요. 그래서 id로 "이 사람이 어느 그룹에 속하나"를 확인하는 게 권한 문제를 풀 때 첫걸음입니다.
💡 한 줄 정리
리눅스는 여러 사람이 나눠 쓰는 멀티유저 환경이라 권한을 소유자/그룹/그 외로 나눈다. whoami로 내 이름을, id/groups로 내가 속한 그룹을 확인한다. 관리자 계정은 root(슈퍼유저)다.
🙋 학생 질문 — "root가 그렇게 위험하면, 왜 아예 없애버리지 않나요?"
좋은 질문이에요. root는 위험하지만 반드시 필요한 존재예요. 시스템 전체를 손봐야 하는 일 — 새 프로그램을 설치하거나, 시스템 설정을 고치거나, 다른 사람의 파일을 정리하거나 — 은 누군가 모든 권한을 가져야 할 수 있거든요. 그 "모든 권한"을 가진 계정이 root입니다.
그래서 해법은 "없애기"가 아니라 "평소엔 안 쓰기"예요. 일반 계정으로 일하다가 정말 관리자 권한이 필요한 순간에만 sudo로 잠깐 빌려 쓰는 거죠. 마치 사무실 마스터키를 평소엔 금고에 넣어두고, 꼭 필요할 때만 잠깐 꺼내 쓰고 다시 넣어두는 것과 같아요. 이렇게 하면 실수로 시스템을 망가뜨릴 위험이 확 줄어듭니다. sudo는 Step 6에서 제대로 다뤄요.
Step 2: "줄 맨 앞 10글자의 정체 — 권한 비트 읽기"
드디어 그 10글자를 해부할 시간이에요. 지난 시간 내내 ls -l을 칠 때마다 따라다니던 -rw-r--r-- 말이에요.
먼저 연습할 파일을 준비해볼게요. 지난 시간에 만든 연습장으로 가서, 간단한 스크립트 파일 하나와 메모 파일 하나를 만들어둡니다. (스크립트 내용이 뭔지는 지금 몰라도 돼요. A-11에서 본격적으로 배웁니다.)
cd ~/practice
echo '#!/bin/bash' > backup.sh
echo 'echo "백업 시작"' >> backup.sh
touch notes.txt
ls -l
-rw-r--r-- 1 alice alice 35 Jun 16 10:30 backup.sh
-rw-r--r-- 1 alice alice 0 Jun 16 10:30 notes.txt
자, 줄 맨 앞의 -rw-r--r--를 보세요. 이 10글자가 오늘의 주인공입니다. 이 한 덩어리가 "누가 이 파일을 읽고, 쓰고, 실행할 수 있는가"를 전부 말해줘요. 어떻게 읽는지 그림으로 쪼개볼게요.
- rwx r-x r-x (예시로 -rwxr-xr-x 를 펼침)
┃ ┃ ┃ ┗━━ others : 그 외 모두에게 허용된 권한
┃ ┃ ┗━━━━━━━ group : 같은 그룹 구성원에게 허용된 권한
┃ ┗━━━━━━━━━━━━ owner : 파일 주인에게 허용된 권한
┗━━━━━━━━━━━━━━━━ 파일 종류 : - 일반파일 · d 디렉토리 · l 링크
10글자는 사실 1글자 + 3글자 묶음 세 개로 되어 있어요.
- 맨 앞 1글자: 파일의 종류예요.
-면 일반 파일,d면 디렉토리(directory),l이면 링크(link, 오늘 Step 8에서 배워요). 지난 시간에ls -l을 쳤을 때 폴더는d로 시작했던 거 기억나죠? - 나머지 9글자: 3글자씩 세 묶음이에요. 순서대로 owner(소유자) → group(그룹) → others(그 외 모두).
그리고 각 묶음의 세 글자는 언제나 같은 순서로 와요.
각 칸의 세 글자는 언제나 r → w → x 순서
r (read) : 읽기 — 내용을 보거나 복사할 수 있다
w (write) : 쓰기 — 내용을 고치거나 지울 수 있다
x (execute) : 실행 — 프로그램·스크립트로 실행할 수 있다
(디렉토리에선 "그 안으로 들어갈 수 있다")
- (대시) : 그 권한이 꺼져 있다
이제 우리 파일 -rw-r--r--를 다시 읽어볼까요?
- 맨 앞
-→ 일반 파일 rw-(owner) → 주인은 읽기·쓰기 가능, 실행은 불가r--(group) → 그룹은 읽기만r--(others) → 그 외 모두도 읽기만
그러니까 "이 파일은 주인만 고칠 수 있고, 나머지는 읽기만 할 수 있다"는 뜻이에요. 일반 텍스트 파일의 가장 흔한 권한이 바로 이거예요.
한 가지 짚을 게 있어요. x(실행)가 디렉토리에 붙으면 의미가 살짝 달라져요. 파일에서 x는 "이 파일을 프로그램으로 실행할 수 있다"인데, 디렉토리에서 x는 "그 폴더 안으로 들어갈(cd 할) 수 있다"예요. 그래서 폴더 권한엔 x가 거의 항상 붙어 있습니다. x가 없으면 폴더가 보여도 안으로 못 들어가거든요.
ls -l 출력에서 권한 바로 다음에 이름이 두 번 나오는 것도 기억해두세요 — alice alice. 앞은 소유자, 뒤는 그룹 이름이에요. 이게 "누구의 owner 권한이고 누구의 group 권한인지"를 알려줍니다. Step 5에서 이 이름을 바꾸는 법(chown)을 배워요.
현업에서 Permission denied를 만나면 가장 먼저 하는 게 바로 이거예요. ls -l로 그 파일의 10글자를 읽고, "내가 owner인가? 그럼 owner 칸에 필요한 권한이 켜져 있나?"를 확인하는 거죠. 여기서 답이 거의 다 나옵니다.
💡 한 줄 정리
ls -l 맨 앞 10글자 = 파일종류 1글자 + (owner·group·others) × (r·w·x). 켜진 권한은 글자, 꺼진 권한은 -. 디렉토리의 x는 "들어갈 수 있다"는 뜻이다.
🙋 학생 질문 — "디렉토리는 왜 보통 755(rwxr-xr-x)이고 파일은 644(rw-r--r--)인가요?"
아주 예리해요. 곧 Step 4에서 이 숫자(755·644)의 정체를 배울 텐데, 미리 핵심만 짚자면 이래요.
디렉토리는 "들어가서(x) 목록을 보는(r)" 게 기본 용도라, 그 외 사람에게도 보통 r-x(들어가고 볼 수는 있지만 그 안에 새 파일을 만들진 못함)를 줍니다. 그래서 rwxr-xr-x(755)가 흔해요.
반면 일반 파일은 "그냥 데이터"라 실행할 일이 없어요. 그래서 x를 빼고 rw-r--r--(644), 즉 "주인은 읽고 쓰고, 나머지는 읽기만"이 기본이에요. 파일에 굳이 실행 권한을 켜는 건 그게 스크립트나 프로그램일 때뿐이고, 그건 바로 다음 Step에서 우리가 직접 해볼 일이에요.
Step 3: "방금 만든 스크립트에 실행권한 — chmod 기호 모드"
지난 시간 예고에서 "방금 만든 스크립트에 실행권한을 주려면?" 같은 상황을 다룬다고 했죠. 바로 지금이에요.
Step 2에서 만든 backup.sh를 다시 볼게요. 이건 사실 스크립트(자동 실행되는 명령 묶음)인데, 권한이 -rw-r--r--라 실행 권한(x)이 하나도 없어요. 이 상태로 실행하려고 하면 리눅스가 거부합니다.
./backup.sh
bash: ./backup.sh: Permission denied
또 그 빨간 메시지죠? 이번엔 당황하지 않아요. ls -l backup.sh로 10글자를 읽어보면 rw-r--r--, 어디에도 x가 없어요. "아, 실행 권한이 꺼져 있어서 막혔구나"가 바로 보입니다. 그럼 켜주면 되겠죠. 권한을 바꾸는 명령이 chmod예요. change mode의 줄임말이에요.
chmod엔 두 가지 방식이 있는데, 오늘은 더 직관적인 기호 모드부터 배웁니다. 기호 모드는 "누구에게 + 어떤 권한을 - 켜고 끈다"를 글자로 그대로 쓰는 방식이에요.
chmod u+x backup.sh
ls -l backup.sh
-rwxr--r-- 1 alice alice 35 Jun 16 10:30 backup.sh
owner 칸이 rw-에서 rwx로 바뀌었죠? u+x를 글자 그대로 읽으면 "user(소유자)에게 +(추가) execute(실행) 권한"이에요. 이제 실행이 됩니다.
./backup.sh
백업 시작
방금 우리가 만든 스크립트가 진짜로 실행됐어요. (이 #!/bin/bash로 시작하는 스크립트를 본격적으로 짜는 건 A-11에서 다뤄요. 오늘은 "실행 권한을 줘야 돌아간다"는 것만 손에 익히면 됩니다.)
기호 모드의 문법을 정리해볼게요. 세 부분을 조합하는 거예요.
chmod [누구에게] [+ 또는 -] [어떤 권한] 파일명
누구에게 켜고 끄기 어떤 권한
u 소유자 + 추가 r 읽기
g 그룹 - 제거 w 쓰기
o 그 외 = 이것만 설정 x 실행
a 전체(ugo)
몇 가지 더 써볼게요.
chmod g+w notes.txt # 그룹에게 쓰기 권한 추가
chmod o-r notes.txt # 그 외 사람의 읽기 권한 제거
chmod a+r notes.txt # 모두에게 읽기 권한 추가
chmod u+x,g+x backup.sh # 소유자와 그룹에 실행 권한 한 번에
+는 더하고, -는 빼고, =는 "딱 이것만"으로 덮어써요. 예를 들어 chmod u=rw notes.txt는 "소유자 권한을 읽기·쓰기로 딱 맞춰라"라서, 원래 있던 실행 권한이 있었다면 그건 꺼집니다.
현업에서 스크립트를 새로 짜서 서버에 올리면 거의 항상 chmod +x 스크립트.sh부터 쳐요. 안 그러면 방금처럼 Permission denied로 안 돌아가거든요. 그래서 이 명령이 손에 제일 먼저 익는 권한 명령 중 하나예요. (chmod +x처럼 누구를 생략하면 기본적으로 전체에 적용돼요.)
💡 한 줄 정리
chmod로 권한을 바꾼다. 기호 모드는 chmod u+x 파일처럼 "누구에게(u·g·o·a) + 켜고 끄기(+·-·=) + 권한(r·w·x)"을 글자로 쓴다. 스크립트는 chmod +x 해야 실행된다.
🙋 학생 질문 — "스크립트를 실행할 때 왜 그냥 backup.sh가 아니라 ./backup.sh라고 점을 붙이나요?"
정말 자주 나오는 질문이에요. 명령어 이름만 치면(예: ls·backup.sh) 리눅스는 정해진 폴더들(PATH라는 목록에 등록된 곳들)만 뒤져서 그 명령을 찾아요. 그런데 우리가 방금 만든 backup.sh는 그 목록에 없는, 지금 이 폴더에 있는 파일이거든요. 그래서 그냥 backup.sh라고만 치면 "그런 명령 없는데?" 하고 못 찾아요.
./는 "바로 지금 이 폴더(.)에 있는 그 파일"이라고 콕 집어주는 거예요. .은 지난 시간에 배운 "현재 디렉토리"를 가리키는 기호죠. 그래서 ./backup.sh는 "지금 여기 있는 backup.sh를 실행해줘"라는 뜻이에요. 이 PATH라는 목록이 정확히 뭔지는 환경변수를 배우는 A-11에서 제대로 풀어요. 오늘은 "내가 방금 만든 스크립트를 실행할 땐 ./를 붙인다" 정도만 기억하면 충분합니다.
Step 4: "권한을 숫자로 — chmod 8진수 모드"
기호 모드(u+x)는 직관적이라 한두 개 바꿀 때 편해요. 그런데 권한 전체를 한 번에 딱 정하고 싶을 때는 더 빠른 방식이 있어요. 바로 숫자(8진수) 모드예요. 현업 서버 설정이나 스크립트에서는 이 숫자 방식을 훨씬 많이 봅니다. chmod 755, chmod 644 같은 거요. 처음 보면 암호 같지만, 원리를 알면 5초면 읽혀요.
비밀은 이거예요. r·w·x 각각에 숫자를 매긴 거예요.
r = 4 w = 2 x = 1 (없으면 0)
왜 하필 4·2·1일까요? 이 셋을 더하면 어떤 조합이든 겹치지 않고 딱 하나의 숫자가 나오기 때문이에요. 한 칸(세 글자)을 숫자 하나로 압축할 수 있는 거죠.
r w x r w x r w x
4 2 1 4 2 1 4 2 1 ← 각 칸을 4·2·1 의 합으로
━━━━━ ━━━━━ ━━━━━
7 5 5 → chmod 755
4+2+1 4+0+1 4+0+1
rwx r-x r-x
owner group others
그러니까 755는 한 자리씩 끊어 읽으면 돼요. 첫 숫자는 owner, 둘째는 group, 셋째는 others.
7= 4+2+1 =rwx(다 됨)5= 4+0+1 =r-x(읽기·실행, 쓰기 없음)5= 4+0+1 =r-x
자주 쓰는 조합 몇 개만 외워두면 거의 다 커버돼요.
숫자 권한 흔히 쓰는 곳
────────────────────────────────────────────
755 rwxr-xr-x 디렉토리, 실행 스크립트 (남들은 읽고 실행만)
644 rw-r--r-- 일반 파일 (주인만 수정, 남들은 읽기만)
700 rwx------ 나만 쓰는 개인 폴더 (남들은 접근 불가)
600 rw------- 비밀 파일 (나만 읽고 쓰기 — SSH 키 등)
직접 써볼게요. Step 3에서 실행 권한을 준 backup.sh를 표준적인 755로 맞추고, notes.txt는 644로 맞춰봅니다.
chmod 755 backup.sh
chmod 644 notes.txt
ls -l
-rwxr-xr-x 1 alice alice 35 Jun 16 10:30 backup.sh
-rw-r--r-- 1 alice alice 0 Jun 16 10:30 notes.txt
backup.sh가 rwxr-xr-x(755)로, notes.txt가 rw-r--r--(644)로 깔끔하게 맞춰졌죠? 기호 모드로 하나씩 켜고 끄는 것보다, 권한 전체를 한 번에 정할 땐 숫자가 훨씬 빨라요.
그럼 기호 모드와 숫자 모드, 언제 뭘 쓰냐고요?
- 기호 모드(
u+x): 지금 권한은 그대로 두고 딱 하나만 바꿀 때. "실행 권한만 추가" 같은 거요. - 숫자 모드(
755): 권한 전체를 처음부터 한 번에 정할 때. 기존 권한을 신경 쓸 필요 없이 통째로 덮어써요.
⚠️ 한 가지 주의. 숫자 모드는 항상 세 칸 전체를 덮어쓴다는 걸 기억하세요. chmod 644를 치면 "owner=rw, group=r, others=r"로 전부 다시 정해지는 거예요. 기호 모드처럼 "있던 거에 살짝 더하기"가 아니라, 통째로 새로 칠하는 거라 더 강력하고 그만큼 실수도 조심해야 합니다.
💡 한 줄 정리
권한을 숫자로도 쓴다. r=4·w=2·x=1을 칸별로 더해 세 자리(owner·group·others). 755=rwxr-xr-x, 644=rw-r--r--. 하나만 바꿀 땐 기호 모드, 전체를 한 번에 정할 땐 숫자 모드.
🙋 학생 질문 — "4·2·1을 매번 더하기 헷갈려요. 더 쉽게 외우는 법 없나요?"
있어요. 사실 자주 쓰는 숫자는 몇 개 안 돼서 통째로 외워버리는 게 제일 빨라요. 755(폴더·스크립트), 644(일반 파일), 600(비밀 파일) — 이 세 개만 손에 익으면 90%는 끝나요.
그래도 계산이 필요하면 이렇게 생각해보세요. 7은 "다 켜짐(rwx)", 5는 "읽고 실행(r-x, 쓰기만 빠짐)", 6은 "읽고 쓰기(rw-, 실행만 빠짐)", 4는 "읽기만(r--)". 이 네 숫자(7·6·5·4)가 거의 전부예요. 2나 1이나 3 같은 건 "쓰기만 되고 읽기는 안 됨" 같은 이상한 조합이라 실무에선 거의 안 나와요. 그러니 7=전부, 6=읽고쓰기, 5=읽고실행, 4=읽기만 이 네 개만 입에 붙여두면 됩니다.
Step 5: "이 파일은 누구 것인가 — chown·chgrp"
지금까지는 "owner·group·others가 각각 뭘 할 수 있나"(권한)를 바꿨어요. 이번엔 한 발 더 나가서 "그 owner와 group이 누구인가"(소유권) 자체를 바꿔봅니다.
ls -l에서 권한 다음에 이름이 두 번 나왔던 거 기억하죠? 그게 소유자와 그룹이에요.
-rw-r--r-- 1 alice alice 1024 Jun 16 11:00 report.txt
└─┬─┘ └─┬─┘
│ └── 그룹(group)
└───────── 소유자(owner)
이 report.txt는 소유자도 alice, 그룹도 alice예요. 그런데 상황을 상상해볼게요. 서버에서 어떤 파일을 bob에게 넘겨줘야 한다거나, 개발팀이 함께 쓰는 폴더라 그룹을 devteam으로 바꿔야 한다거나. 이럴 때 소유권을 바꾸는 명령이 chown(change owner)과 chgrp(change group)예요.
sudo chown bob report.txt
chown bob report.txt는 "이 파일의 주인을 bob으로 바꿔라"예요. 그룹까지 한 번에 바꾸려면 소유자:그룹 형태로 콜론(:)을 써요.
sudo chown bob:devteam report.txt
ls -l report.txt
-rw-r--r-- 1 bob devteam 1024 Jun 16 11:00 report.txt
소유자가 bob, 그룹이 devteam으로 바뀌었죠? 그룹만 바꾸고 싶으면 chgrp를 쓰거나, chown :devteam처럼 콜론 뒤만 적으면 돼요.
sudo chgrp devteam report.txt # 그룹만 devteam 으로
sudo chown :devteam report.txt # 위와 같은 효과 (소유자는 그대로)
그런데 눈치채셨나요? 위 명령들 앞에 전부 sudo가 붙어 있어요. 왜일까요? 생각해보면 당연해요 — 내가 내 파일을 아무에게나 "이제 네 거야" 하고 마음대로 넘길 수 있으면, 권한 체계가 무너지잖아요. 남의 파일을 가로채거나, 책임을 떠넘기는 장난도 가능해지고요. 그래서 소유권을 바꾸는 건 보통 관리자(root)만 할 수 있어요. 일반 사용자는 자기 파일이라도 주인을 남에게 넘기지 못합니다.
그러니까 chown/chgrp는 거의 항상 sudo와 함께 다녀요. 자연스럽게 다음 질문이 떠오르죠 — "그 sudo가 대체 뭔데?" 바로 다음 Step에서 제대로 파봅니다.
현업에선 배포 자동화나 서버 세팅 중에 chown을 자주 만나요. 예를 들어 웹 서버가 쓰는 폴더는 소유권을 www-data로 맞춰줘야 그 서버 프로세스가 파일을 읽고 쓸 수 있거든요. "분명 파일은 있는데 웹 서버가 못 읽는다" 싶을 때, 십중팔구 소유권이나 권한 문제예요.
💡 한 줄 정리
권한은 "owner/group이 뭘 할 수 있나", 소유권은 "그 owner/group이 누구인가". chown 사람 또는 chown 사람:그룹으로 소유자를, chgrp 그룹으로 그룹을 바꾼다. 소유권 변경은 보통 sudo가 필요하다.
🙋 학생 질문 — "chmod랑 chown이 자꾸 헷갈려요. 어떻게 구분하죠?"
이름으로 기억하면 안 헷갈려요. 둘 다 ch(change, 바꾸다)로 시작하는데, 뒤가 달라요.
chmod= change mode → 권한(mode)을 바꾼다. "주인은 읽고 쓸 수 있게, 남은 읽기만" 같은 할 수 있는 일을 정하는 거예요. (rwx를 만지는 것)chown= change owner → 소유자(owner)를 바꾼다. "이 파일의 주인을 alice에서 bob으로" 같은 누구 것인지를 정하는 거예요. (이름을 만지는 것)
한 문장으로: chmod는 "무엇을 할 수 있나"를, chown은 "누가 주인인가"를 바꿔요. ls -l 한 줄에서 chmod는 앞쪽 10글자를, chown은 그다음 이름 두 개를 건드린다고 그림으로 외워두면 확실해요.
Step 6: "Permission denied를 만났을 때 — sudo, 왜 필요하고 왜 위험한가"
지난 시간에 약속했죠. 서버를 다루다 누구나 만나는 그 빨간 메시지 Permission denied를, 무작정 sudo로 때우지 않고 스스로 푸는 법을 배운다고요. 이번 Step이 그 핵심이에요.
먼저 sudo가 뭔지부터. 앞에서 계속 나왔지만 정리하면, sudo는 "이 명령 하나만 잠깐 관리자(root) 권한으로 실행해줘"라는 뜻이에요. superuser do의 줄임말이에요. 평소엔 일반 계정(alice)으로 안전하게 일하다가, 시스템을 손봐야 하는 순간에만 마스터키를 잠깐 빌리는 거죠.
실제로 만나볼게요. 시스템 설정 파일 중엔 일반 사용자가 못 읽는 것도 있어요.
cat /etc/sudoers
cat: /etc/sudoers: Permission denied
또 그 메시지예요. 그런데 이번엔 우리가 배운 대로 차분히 진단해봅니다. 무작정 sudo부터 붙이지 말고요.
Permission denied 를 만나면 — 무작정 sudo 전에 한 호흡
1) ls -l 로 그 파일의 10글자와 소유자를 본다
│
▼
2) "내가 owner 인가?"
├─ 예 → 내 파일이다. chmod 로 내가 직접 풀 수 있다
│ (예: 실행 권한이 없어 막힘 → chmod +x)
│
└─ 아니오 → 시스템·남의 파일이다
│
▼
3) "정말 관리자 권한이 필요한 일인가?"
├─ 예 → sudo 를 붙인다 (시스템 설정 등)
└─ 아니오 → 굳이 건드릴 필요가 있나 다시 생각
/etc/sudoers를 ls -l로 보면 소유자가 root예요. 내 파일이 아니죠. 그리고 이건 시스템의 핵심 설정 파일이라 관리자만 읽게 막아둔 거예요. 그러니 이건 정말로 관리자 권한이 필요한 경우예요. 이럴 때 sudo를 씁니다.
sudo cat /etc/sudoers
[sudo] password for alice:
여기서 비밀번호를 물어봐요. 한 가지 짚을 게 있어요 — 이건 root의 비밀번호가 아니라 여러분(alice) 자신의 비밀번호예요. "너 정말 alice 맞아? 관리자 권한 빌려줄 자격(sudo 그룹) 있는 사람 맞지?"를 확인하는 거예요. Step 1에서 id를 쳤을 때 sudo 그룹이 보였던 게 바로 이 자격이었어요. 비밀번호를 맞게 넣으면 명령이 실행되고, 한동안은 다시 안 물어봐요(잠깐 기억해둬요).
자, 이제 중요한 이야기. sudo는 강력한 만큼 위험해요. root 권한으로 도는 명령은 안전장치가 없거든요. 일반 계정이면 "어 그건 권한이 없는데?" 하고 막아주던 일도, sudo를 붙이면 그냥 실행돼버려요. 그래서 명령을 잘못 쳤을 때 피해가 훨씬 커요.
겁주려는 게 아니에요. 솔직하게 알려드리는 거예요. 그리고 안심도 함께 드릴게요 — 위험을 피하는 건 어렵지 않아요. 습관 두 가지면 됩니다.
sudo를 붙이기 전에 한 호흡 쉰다. "이거 정말 관리자 권한이 필요한 일인가?"를 한 번 묻는 거예요. 위 진단 그림처럼요. 내 파일 문제면chmod로 풀면 되지sudo가 필요 없어요.sudo rm -rf같은 위험한 조합은 두 번 확인하고 친다. 지난 시간에 배운rm의 위험을 기억하죠? 거기에sudo가 붙으면 시스템 파일까지 지울 수 있어 더 위험해요. 치기 전에 경로를 눈으로 한 번 더 읽습니다.
마지막으로, 권한 문제를 sudo로 푸는 것 못지않게 흔한 나쁜 습관 하나 — chmod 777 남발이에요. 777은 "owner·group·others 모두에게 rwx 전부"예요. Permission denied가 나면 일단 chmod 777로 다 열어버리는 사람이 많은데, 이건 "문이 안 열리니까 아예 떼어버리는" 거예요. 그 파일을 아무나 읽고 고치고 실행할 수 있게 되니까요. 서버에선 이게 그대로 보안 구멍이 됩니다. 진짜 해법은 "꼭 필요한 사람에게 꼭 필요한 권한만" 주는 거예요. 777이 떠오르면, 대신 "누가 이 파일을 써야 하지? 그럼 그 사람에게만 권한을 주려면?"을 먼저 생각해보세요.
💡 한 줄 정리
sudo는 명령 하나만 잠깐 관리자 권한으로 실행한다(내 비밀번호로 자격 확인). Permission denied는 무작정 sudo 말고, ls -l로 소유자·권한부터 진단한다. 내 파일이면 chmod로 풀고, sudo·chmod 777 남발은 보안 사고로 이어진다.
🙋 학생 질문 — "그냥 처음부터 끝까지 root로 로그인해서 일하면 sudo 칠 필요도 없고 편하지 않나요?"
마음은 이해해요. 그런데 실무에서 그렇게 하면 안 되는 데는 분명한 이유가 있어요.
root로 계속 일하면 모든 실수가 치명적이 돼요. 일반 계정으로 일하면, 실수로 위험한 명령을 쳐도 "권한이 없다"며 리눅스가 막아줘요. 그게 일종의 안전망이거든요. 그런데 root는 그 안전망이 통째로 없어요. rm 한 줄 잘못 치면 막아주는 사람 없이 그대로 시스템이 날아갈 수 있어요.
그래서 현업의 표준은 "평소엔 일반 계정, 필요할 때만 sudo"예요. sudo를 칠 때 잠깐 멈칫하는 그 순간이 "내가 지금 위험한 일을 하려는구나"를 자각하게 해주는 거예요. 그 한 호흡이 사고를 막아줍니다. 편함을 살짝 포기하고 안전을 크게 얻는 거죠. 실제로 잘 설정된 서버는 아예 root로 직접 로그인하는 것 자체를 막아두기도 해요.
Step 7: "새 파일은 왜 644로 태어날까 — umask"
여기서 작은 궁금증 하나 풀고 가요. 우리가 touch로 새 파일을 만들 때마다, 따로 권한을 정하지 않았는데도 항상 rw-r--r--(644)로 생겼어요. 폴더를 mkdir로 만들면 항상 rwxr-xr-x(755)였고요. 누가 정해준 걸까요?
이 "새로 만드는 파일·폴더의 기본 권한"을 정하는 게 umask예요. 그냥 쳐보면 지금 값이 나와요.
umask
0022
0022라는 숫자가 나오죠. 이게 어떻게 644를 만드는지가 살짝 거꾸로라 헷갈릴 수 있는데, 천천히 보면 간단해요. umask는 권한을 더하는 게 아니라 "깎아내는" 마스크예요. 이름의 뜻도 "user mask(가리개)"거든요.
리눅스는 새 파일·폴더를 만들 때 출발점이 정해져 있어요.
새 파일의 출발점 : 666 (rw-rw-rw-) — 파일은 실행권을 기본으로 안 줌
새 폴더의 출발점 : 777 (rwxrwxrwx) — 폴더는 들어가야 하니 x 포함
여기서 umask 값을 "빼면" 실제 권한이 된다
그러니까 umask가 022면 이렇게 계산돼요.
파일 : 666 - 022 = 644 → rw-r--r-- (우리가 본 그 644!)
폴더 : 777 - 022 = 755 → rwxr-xr-x (우리가 본 그 755!)
022를 빼면 group과 others에서 w(쓰기, 값 2)가 깎여나가는 거예요. 그래서 "주인은 읽고 쓰고, 남들은 읽기만"이라는 안전한 기본값이 나오는 거죠. 새 파일이 처음부터 아무나 고칠 수 있게 태어나면 위험하니까, 리눅스가 umask로 미리 쓰기 권한을 막아두는 거예요.
대부분은 이 기본값을 건드릴 일이 없어요. 다만 "이 세션에서 만드는 파일은 더 꽁꽁 닫아두고 싶다" 같은 특별한 경우엔 값을 바꿀 수 있어요.
umask 077
touch secret.txt
ls -l secret.txt
-rw------- 1 alice alice 0 Jun 16 11:20 secret.txt
077이면 group과 others의 권한 비트가 전부 꺼져서 600(rw-------), 즉 "나만 읽고 쓸 수 있는" 파일이 만들어진 거예요. 비밀 파일을 다룰 때 쓰는 설정이죠.
⚠️ 이렇게 umask로 바꾼 값은 지금 이 터미널 세션에만 적용돼요. 터미널을 닫으면 원래대로 돌아가요. 영구적으로 바꾸려면 설정 파일(.bashrc)에 적어둬야 하는데, 그건 A-11에서 환경설정을 배울 때 다뤄요. 오늘은 "새 파일의 기본 권한은 umask가 정한다"는 원리만 알면 충분합니다.
💡 한 줄 정리
umask는 새로 만드는 파일·폴더의 기본 권한을 정한다. 권한을 더하는 게 아니라 출발점(파일 666·폴더 777)에서 깎아내는 마스크다. 흔한 022는 남들의 쓰기를 깎아 파일 644·폴더 755를 만든다.
🙋 학생 질문 — "umask는 왜 더하기가 아니라 빼기로 동작하나요? 헷갈리게…"
처음엔 다들 그렇게 느껴요. 거꾸로 같죠. 그런데 이 "빼기" 방식엔 보안상의 이유가 있어요.
umask의 임무는 "기본적으로 권한을 더 닫아두는 것"이에요. 보안에서 안전한 기본값은 "필요 이상으로 열지 않기"거든요. 그래서 "무엇을 허용할까"(더하기)가 아니라 "무엇을 막을까"(빼기)로 설계한 거예요. 마스크라는 이름 그대로, 출발점에서 "이 권한들은 가려라"라고 가리개를 씌우는 거죠.
그러니까 umask 숫자가 클수록 더 많이 깎여서 권한이 더 닫혀요. 022는 조금만 깎고(남의 쓰기만), 077은 많이 깎아요(남의 모든 권한). chmod 숫자가 "켜는 양"이라면, umask 숫자는 "끄는 양"이라고 반대로 기억해두면 안 헷갈려요.
Step 8: "같은 파일을 가리키는 두 길 — 하드 링크 vs 심볼릭 링크"
오늘의 마지막 주제는 링크(link)예요. "같은 파일을 여러 이름으로 가리키는" 방법인데, 권한·소유권과 같은 묶음에서 배우는 이유가 있어요. 둘 다 "파일이라는 실체를 어떻게 가리키고 다루는가"에 대한 이야기거든요.
먼저 윈도우의 "바로 가기(shortcut)"를 떠올려보세요. 바탕화면 아이콘은 진짜 프로그램이 아니라 "저쪽에 있는 진짜를 가리키는 화살표"잖아요. 리눅스에도 비슷한 게 있는데, 두 종류예요. 그리고 그 둘이 동작하는 방식이 꽤 달라서, 구분해두면 나중에 헷갈리지 않아요.
이걸 이해하려면 작은 개념 하나가 필요해요. 리눅스에서 파일의 진짜 실체는 inode(아이노드)라는 곳에 저장돼요. inode는 "실제 데이터가 디스크 어디에 있는지, 권한은 뭔지" 같은 파일의 본체 정보예요. 그리고 우리가 쓰는 파일 이름은 사실 그 inode를 가리키는 꼬리표일 뿐이에요. 이 구분이 두 링크의 차이를 가르는 핵심이에요.
직접 만들어볼게요. 원본 파일 하나를 만들고, 두 종류의 링크를 걸어봅니다.
echo "원본 내용입니다" > original.txt
ln original.txt hardlink.txt # 하드 링크
ln -s original.txt softlink.txt # 심볼릭 링크 (-s)
ls -l
-rw-r--r-- 2 alice alice 25 Jun 16 11:30 hardlink.txt
-rw-r--r-- 2 alice alice 25 Jun 16 11:30 original.txt
lrwxrwxrwx 1 alice alice 12 Jun 16 11:30 softlink.txt -> original.txt
출력에서 두 가지가 눈에 띄죠?
original.txt와hardlink.txt는 권한 다음 숫자가2예요 (보통은1이었죠). 이 숫자가 "이 inode를 가리키는 이름이 몇 개인가"예요. 하드 링크를 걸었더니 2가 됐어요.softlink.txt는 맨 앞이l(링크)로 시작하고, 뒤에-> original.txt라고 어디를 가리키는지 적혀 있어요.
이 둘의 차이를 그림으로 볼게요.
하드 링크 — 두 이름이 같은 실체(inode)를 직접 가리킨다
original.txt ─┐
├─→ [inode] → 실제 데이터 "원본 내용입니다"
hardlink.txt ─┘
→ 원본을 지워도 hardlink.txt 로 데이터가 그대로 살아있다
(이름표 하나 뗐을 뿐, 실체는 남아있으니까)
심볼릭 링크 — 이름이 "다른 경로"를 적어둔 쪽지일 뿐
softlink.txt → "original.txt 로 가보세요" → [inode] → 데이터
→ 원본을 지우면 softlink.txt 는 갈 곳을 잃어 깨진 링크가 된다
(쪽지에 적힌 주소로 갔는데 아무것도 없는 셈)
핵심 차이는 "원본을 지웠을 때"예요. 직접 확인해볼게요.
rm original.txt
cat hardlink.txt
원본 내용입니다
원본을 지웠는데도 hardlink.txt로 내용이 멀쩡히 나와요. 하드 링크는 inode를 직접 가리키니까, 원본이라는 이름표 하나를 뗐을 뿐 실체는 그대로거든요. 반면 심볼릭 링크는요?
cat softlink.txt
cat: softlink.txt: No such file or directory
softlink.txt는 "original.txt로 가보세요"라는 쪽지인데, 정작 original.txt가 사라졌으니 갈 곳을 잃은 거예요. 이런 걸 깨진 링크(broken link)라고 해요.
그럼 실무에선 뭘 더 많이 쓸까요? 압도적으로 심볼릭 링크예요. 하드 링크는 제약이 많거든요 — 디렉토리엔 못 걸고, 다른 디스크(파일시스템)를 넘나들 수도 없어요. 심볼릭 링크는 그냥 "경로를 적은 쪽지"라 폴더든 다른 디스크든 자유롭게 가리킬 수 있어요.
심볼릭 링크가 빛나는 대표적인 현업 상황이 있어요. 서버에 프로그램을 버전별로 깔아두고, "현재 사용 중인 버전"을 가리키는 링크 하나를 두는 거예요.
ln -s /app/releases/v2.3 /app/current
이렇게 해두면 모두가 /app/current만 보고 일해요. 새 버전 v2.4를 배포할 땐 이 링크가 가리키는 곳만 v2.4로 바꾸면 끝이에요. 실제 폴더를 옮기거나 복사할 필요 없이, 쪽지에 적힌 주소만 고쳐 쓰는 거죠. 배포를 깔끔하고 빠르게 만들어주는 기법이라 정말 자주 봅니다.
💡 한 줄 정리
링크는 한 파일을 여러 이름으로 가리킨다. 하드 링크(ln)는 inode를 직접 가리켜 원본을 지워도 살아남고, 심볼릭 링크(ln -s)는 경로를 적은 쪽지라 원본이 사라지면 깨진다. 실무는 자유로운 심볼릭 링크를 압도적으로 많이 쓴다.
🙋 학생 질문 — "심볼릭 링크가 깨질 수 있으면 불안한데, 그래도 하드 링크보다 많이 쓰는 이유가 뭔가요?"
좋은 지적이에요. 깨질 수 있다는 게 단점처럼 보이지만, 실무에선 그 단점보다 장점이 훨씬 커요.
첫째, 자유로움이에요. 하드 링크는 같은 디스크 안의 파일만, 그것도 폴더는 못 가리켜요. 심볼릭 링크는 폴더든, 다른 디스크든, 심지어 아직 존재하지 않는 경로든 다 가리킬 수 있어요. 현업에서 다루는 링크는 대부분 폴더를 가리키거나(/app/current 같은) 디스크를 넘나들어서, 하드 링크로는 아예 불가능한 경우가 많아요.
둘째, 명확함이에요. 심볼릭 링크는 ls -l에 -> 가리키는곳이 그대로 보여요. "이건 링크고, 진짜는 저기 있다"가 한눈에 드러나죠. 하드 링크는 겉보기엔 그냥 평범한 파일이라 어떤 게 원본이고 어떤 게 링크인지 구분이 안 가요.
그래서 "깨질 수 있음"은 오히려 솔직한 장점이기도 해요 — 가리키는 대상이 없어지면 ls에서 깨진 게 바로 보이거든요. 어디가 잘못됐는지 숨지 않고 드러나는 거죠. 그래서 실무에선 심볼릭 링크가 기본이에요.
마무리
오늘 정말 큰 산을 하나 넘었어요. 지난 시간까지 자꾸 눈에 밟히던 그 -rw-r--r-- 10글자, 이제 척 보면 "주인은 읽고 쓰고, 남들은 읽기만"이라고 읽히죠? 그리고 chmod로 직접 바꾸고, Permission denied를 만나도 당황하지 않고 진단할 수 있게 됐습니다. 권한은 처음엔 다들 헷갈려하는 주제인데, 오늘 여기까지 따라왔으면 정말 잘하신 거예요. 핵심을 세 가지로 정리할게요.
오늘 배운 핵심 세 가지
💡 하나 — ls -l 맨 앞 10글자는 "파일종류 1 + (owner·group·others)×(rwx)"다. 리눅스는 여러 사람이 나눠 쓰는 멀티유저 환경이라, 누가 무엇을 할 수 있는지를 이 10글자로 칼같이 나눈다. whoami·id로 내 정체부터 확인한다.
💡 둘 — chmod로 권한을 바꾼다. 하나만 바꿀 땐 기호 모드(u+x), 전체를 한 번에 정할 땐 숫자 모드(755=rwxr-xr-x, 644=rw-r--r--). 소유권 자체는 chown/chgrp로 바꾸고, 이건 보통 sudo가 필요하다.
💡 셋 — Permission denied는 무작정 sudo·chmod 777로 때우지 않는다. ls -l로 소유자·권한을 먼저 진단하고, 내 파일이면 chmod로 풀고, 정말 필요할 때만 sudo를 쓴다. umask는 새 파일의 기본 권한을, 링크(ln -s)는 한 파일을 가리키는 또 다른 길을 다룬다.
다음 시간 예고
오늘 ls -l로 권한을 읽으면서, 파일이 많아지면 출력도 주르륵 길어진다는 걸 느꼈을 거예요. 그러다 보면 자연스럽게 욕심이 생겨요 — "이 긴 출력에서 내가 원하는 줄만 쏙 뽑아볼 순 없을까?", "이 결과를 화면 말고 파일로 저장해두고 싶은데?"
다음 시간(A-4)엔 바로 그걸 해요. 한 명령의 출력을 다음 명령으로 흘려보내는 파이프(|), 결과를 파일로 보내는 리다이렉션(>), 그리고 수천 줄에서 원하는 줄만 뽑아내는 grep을 배웁니다. "작은 도구 하나가 한 가지를 잘하고, 그것들을 컨베이어 벨트처럼 잇는다"는 유닉스 철학의 진짜 핵심으로 들어가는 거예요. 로그가 수천 줄인데 에러 난 줄만 눈으로 스크롤하며 찾던 신입을, 한 줄 명령으로 구원하는 시간이 됩니다. 그럼 다음 시간에 만나요.
과제
오늘 과제는 모두 여러분 자신의 리눅스 환경(WSL2·맥 터미널·VM)에서 직접 손으로 쳐보는 실습이에요. 권한은 눈으로 읽기만 해선 손에 안 익어요. 한 단계 칠 때마다 ls -l로 10글자가 어떻게 바뀌는지 직접 확인하며 천천히 따라오세요.
[기초] 권한 10글자 읽고 바꾸기
연습장을 차려서 권한을 직접 읽고 바꿔보세요.
~/practice폴더에서touch memo.txt로 파일을 하나 만들고,ls -l memo.txt로 권한 10글자를 확인한다- 그 10글자를 직접 손으로 적고, "맨 앞 1글자는 무엇이고, owner·group·others 칸은 각각 무슨 권한인지" 한국어로 풀어 적는다
chmod g+w memo.txt로 그룹에 쓰기 권한을 추가한 뒤,ls -l로 어느 글자가 바뀌었는지 확인한다echo '#!/bin/bash' > hello.sh로 스크립트 파일을 만들고, 실행 권한이 없어./hello.sh가Permission denied로 막히는 걸 확인한 뒤,chmod u+x로 풀어서 실행되게 만든다
[응용] 기호 모드와 숫자 모드 오가기
같은 권한을 기호 모드와 숫자 모드 두 가지로 만들어보며 둘을 연결하세요.
touch report.txt로 파일을 만들고,chmod 600 report.txt로 "나만 읽고 쓰기"로 바꾼 뒤ls -l로rw-------이 맞는지 확인한다- 이번엔 같은 파일을 기호 모드만 써서
rw-r--r--(644)로 만들어본다 (chmod g+r,o+r또는chmod a+r등을 고민해서) mkdir shared로 폴더를 만들고ls -ld shared로 폴더의 기본 권한을 확인한 뒤, 그 숫자가 왜755인지umask값과 연결해 한 줄로 설명한다755·644·700·600이 각각rwx표기로 무엇인지, 그리고 어떤 파일에 쓰면 좋을지 표로 정리한다
[심화] Permission denied 스스로 진단하기 (서버 상황 상상)
현업 상황을 상상해봅시다. "서버에 들어갔더니 어떤 파일이 Permission denied로 안 열린다. 무작정 sudo를 붙이기 전에, 왜 막혔는지부터 진단하고 싶다." 그 진단 흐름을 직접 재현해보세요.
- 시스템 파일 하나(
/etc/shadow또는/etc/sudoers)를 그냥cat으로 열어보고Permission denied를 만난다 ls -l로 그 파일의 소유자와 권한 10글자를 확인하고, "내가 owner인가? 이게 막힌 진짜 이유가 무엇인가"를 한국어로 적는다- 진단 결과 "정말 관리자 권한이 필요한 시스템 파일"이라고 판단되면,
sudo를 붙여 열어본다 (이때 물어보는 비밀번호가 누구의 것인지도 적어본다) - 반대로, 내 연습장에서 일부러
chmod 000 locked.txt로 모든 권한을 꺼버린 파일을 만든 뒤, 이건sudo없이chmod만으로 어떻게 다시 열 수 있는지 보인다 (왜 이 경우엔sudo가 필요 없는지도 함께) - 마지막으로, "
chmod 777로 다 열어버리는 게 왜 나쁜 해법인지" 두 문장으로 정리한다
생각해볼 주제
1. 왜 권한은 소유자·그룹·그 외 "세 부류"로만 나눌까
리눅스 권한은 딱 세 부류 — owner, group, others — 로만 나뉩니다. "alice는 읽기, bob은 쓰기, carol은 실행"처럼 사람마다 따로 정하면 더 세밀할 텐데, 왜 굳이 셋으로 단순하게 묶었을까요? 단순함이 주는 이점(빠른 판단·적은 저장 공간·예측 가능성)과, 그 단순함 때문에 포기한 것(사람별 세밀한 제어)을 저울질해보세요. 그리고 진짜로 사람별 세밀한 권한이 필요한 현업 상황(예: 특정 파일을 딱 두 사람만 쓰게 하고 싶을 때)에서는 어떤 보완책이 있을지도 상상해보세요. (힌트: ACL이라는 키워드를 찾아보면 흥미로운 확장이 보일 거예요.)
2. chmod 777은 왜 "해결"이 아니라 "포기"인가
Permission denied를 만났을 때 chmod 777로 다 열어버리면 일단 문제는 사라집니다. 그런데 왜 현업에서는 이걸 나쁜 습관으로 볼까요? "문이 안 열리니 문을 떼어버린다"는 비유를 실마리로, 777이 멀티유저 서버에서 만드는 위험을 구체적으로 그려보세요. 누가 그 파일을 망칠 수 있게 되는지, 그게 웹 서버처럼 외부에 노출된 환경이라면 어떤 사고로 이어질 수 있는지요. 그리고 "꼭 필요한 사람에게 꼭 필요한 권한만"이라는 원칙(최소 권한 원칙)이 왜 보안의 기본인지 자기 말로 정리해보세요.
3. 심볼릭 링크는 "깨질 수 있는데도" 왜 실무의 기본일까
하드 링크는 원본을 지워도 멀쩡한데, 심볼릭 링크는 원본이 사라지면 깨집니다. 안정성만 보면 하드 링크가 나아 보이는데, 현업에서는 심볼릭 링크를 압도적으로 많이 씁니다. 이 역설을 풀어보세요. 심볼릭 링크가 주는 자유(폴더·다른 디스크·아직 없는 경로까지 가리킴)와 명확함(->로 정체가 드러남)이, "깨질 수 있음"이라는 약점을 어떻게 압도하는지요. 그리고 "원본이 사라지면 링크가 눈에 띄게 깨진다"는 것이, 오히려 문제를 숨기지 않고 드러내는 장점이 될 수 있다는 관점도 함께 생각해보세요.
✅ 예시 답안정답 보기
과제와 생각해볼 주제의 예시답안입니다. 모든 명령은 여러분 자신의 환경에서 직접 쳐보며 확인하는 게 가장 중요해요. 파일 이름이나 권한 숫자가 책과 조금 달라도 정상이니, 흐름이 맞는지를 보면 됩니다. 권한은 특히 ls -l로 바뀐 10글자를 눈으로 확인하는 리듬이 핵심이에요.
🎯 [과제 1 예시답안] 권한 10글자 읽고 바꾸기
채점 포인트
| 확인 항목 | 무엇을 보면 되는가 |
|---|---|
| 10글자 읽기 | ls -l의 권한 10글자를 파일종류 1 + owner·group·others로 풀어 적었는가 |
| 기호 모드 변경 | chmod g+w로 group 칸의 -가 w로 바뀐 걸 확인했는가 |
| 실행 권한 막힘 | 실행 권한이 없어 ./hello.sh가 Permission denied로 막히는 걸 봤는가 |
| 실행 권한 부여 | chmod u+x로 owner에 x를 켜서 실행되게 만들었는가 |
풀이 예시
$ cd ~/practice
# 파일을 만들고 권한 10글자 확인
$ touch memo.txt
$ ls -l memo.txt
-rw-r--r-- 1 alice alice 0 Jun 16 11:40 memo.txt
10글자 -rw-r--r--를 풀어 읽으면 이래요.
- 맨 앞
-→ 일반 파일 rw-(owner) → 주인은 읽기·쓰기, 실행은 없음r--(group) → 그룹은 읽기만r--(others) → 그 외도 읽기만
# 그룹에 쓰기 권한 추가 — group 칸의 - 가 w 로 바뀐다
$ chmod g+w memo.txt
$ ls -l memo.txt
-rw-rw-r-- 1 alice alice 0 Jun 16 11:40 memo.txt
# 스크립트를 만들면 실행 권한이 없어 막힌다
$ echo '#!/bin/bash' > hello.sh
$ ./hello.sh
bash: ./hello.sh: Permission denied
# ls -l 로 보면 x 가 하나도 없다 — 그래서 막힌 것
$ ls -l hello.sh
-rw-r--r-- 1 alice alice 12 Jun 16 11:41 hello.sh
# owner 에 실행 권한을 켜주면 실행된다
$ chmod u+x hello.sh
$ ls -l hello.sh
-rwxr--r-- 1 alice alice 12 Jun 16 11:41 hello.sh
$ ./hello.sh
$
(hello.sh는 #!/bin/bash 한 줄뿐이라 화면에 출력이 없어요. 에러 없이 프롬프트가 돌아왔다면 성공이에요.)
핵심은 두 가지예요. 첫째, Permission denied를 만났을 때 ls -l로 10글자를 읽으니 "x가 없어서 막혔구나"가 바로 보였다는 것. 둘째, 그래서 sudo 같은 거창한 게 아니라 chmod u+x 한 줄로 풀렸다는 것. 내 파일이니까요.
💡 튜터의 한마디 — 새 스크립트를 짜면 거의 반사적으로 chmod +x부터 치게 될 거예요. 현업에서도 똑같아요. 그리고 권한을 바꾼 뒤엔 항상 ls -l로 "내가 의도한 대로 바뀌었나"를 눈으로 확인하는 습관을 들이세요. 권한은 한 글자 차이로 동작이 갈리거든요.
🎯 [과제 2 예시답안] 기호 모드와 숫자 모드 오가기
채점 포인트
| 확인 항목 | 무엇을 보면 되는가 |
|---|---|
| 숫자 모드 적용 | chmod 600이 rw-------을 만든 걸 확인했는가 |
| 같은 권한 기호로 | 644를 기호 모드(a+r 등)로도 만들어냈는가 |
| 폴더 기본 권한 | mkdir 폴더가 755인 이유를 umask와 연결했는가 |
| 권한 표 정리 | 755·644·700·600을 rwx 표기와 용도로 정리했는가 |
풀이 예시
# 숫자 모드 — 나만 읽고 쓰기(600)
$ touch report.txt
$ chmod 600 report.txt
$ ls -l report.txt
-rw------- 1 alice alice 0 Jun 16 11:50 report.txt
# 같은 파일을 기호 모드로 644(rw-r--r--) 만들기
# 지금 group·others 가 둘 다 막혀 있으니 둘에 읽기를 더한다
$ chmod a+r report.txt
$ ls -l report.txt
-rw-r--r-- 1 alice alice 0 Jun 16 11:50 report.txt
a+r는 "전체(a)에 읽기(r) 추가"예요. owner는 이미 읽기가 있었으니 그대로, group과 others에 r이 켜져서 rw-r--r--(644)가 됐어요. chmod g+r,o+r로 따로 써도 같은 결과예요.
# 폴더의 기본 권한 확인
$ mkdir shared
$ ls -ld shared
drwxr-xr-x 2 alice alice 4096 Jun 16 11:51 shared
$ umask
0022
폴더가 755(rwxr-xr-x)인 이유: 폴더의 출발점은 777인데, umask 022가 group과 others의 쓰기(w=2)를 깎아내서 777 - 022 = 755가 된 거예요.
자주 쓰는 권한 정리표:
| 숫자 | rwx 표기 | 어떤 파일에 |
|---|---|---|
755 |
rwxr-xr-x |
디렉토리, 실행 스크립트 (남은 읽고 실행만) |
644 |
rw-r--r-- |
일반 파일 (주인만 수정, 남은 읽기만) |
700 |
rwx------ |
나만 쓰는 개인 폴더 (남은 접근 불가) |
600 |
rw------- |
비밀 파일 (나만 읽고 쓰기 — SSH 키 등) |
💡 튜터의 한마디 — 기호 모드와 숫자 모드는 같은 권한을 두 가지 언어로 말하는 거예요. 둘을 자유롭게 오갈 수 있으면 권한을 완전히 손에 넣은 거예요. 실무 스크립트나 문서에선 숫자(chmod 600 ~/.ssh/id_rsa 같은)를 더 자주 보니, 자주 쓰는 네 개(755·644·700·600)는 통째로 외워두면 두고두고 편합니다.
🎯 [과제 3 예시답안] Permission denied 스스로 진단하기 (서버 상황 상상)
채점 포인트
| 확인 항목 | 무엇을 보면 되는가 |
|---|---|
| 막힘 재현 | 시스템 파일을 cat해 Permission denied를 만났는가 |
| 소유자 진단 | ls -l로 소유자가 root임을 확인하고 "내 파일이 아니다"를 짚었는가 |
| sudo 판단 | 정말 관리자 권한이 필요한 경우라 판단하고 sudo로 열었는가 |
| 비밀번호 주체 | sudo가 묻는 비밀번호가 root가 아니라 내 것임을 적었는가 |
| chmod로 해결 | 내 파일은 sudo 없이 chmod만으로 풀 수 있음을 보였는가 |
풀이 예시
# 1) 시스템 파일을 열어보니 막힌다
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
# 2) 무작정 sudo 말고 — ls -l 로 소유자·권한부터 진단
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1234 Jun 10 09:00 /etc/shadow
진단: 소유자가 root, 그룹이 shadow이고 others 칸은 ---(권한 전혀 없음)이에요. 나(alice)는 owner도 아니고 shadow 그룹도 아니니, others 자격이라 아무 권한이 없어요. 그래서 막힌 거예요. 게다가 /etc/shadow는 사용자 비밀번호가 든 가장 민감한 시스템 파일이라, 관리자만 보게 막아둔 게 맞아요. 이건 정말로 관리자 권한이 필요한 경우예요.
# 3) 정당한 경우라 판단했으니 sudo 로 연다
$ sudo cat /etc/shadow
[sudo] password for alice: ← root 가 아니라 '내(alice)' 비밀번호를 넣는다
root:!:19800:0:99999:7:::
...
sudo가 묻는 비밀번호는 root의 것이 아니라 내(alice) 비밀번호예요. "관리자 권한을 빌릴 자격(sudo 그룹)이 있는 alice 본인이 맞는가"를 확인하는 거니까요.
# 4) 반대로 — 내 파일이 막힌 경우엔 sudo 가 필요 없다
$ touch locked.txt
$ chmod 000 locked.txt # 모든 권한을 꺼버림
$ cat locked.txt
cat: locked.txt: Permission denied
$ ls -l locked.txt
---------- 1 alice alice 0 Jun 16 12:00 locked.txt
# 소유자가 나(alice)다! 그러니 chmod 로 직접 풀 수 있다 (sudo 불필요)
$ chmod 644 locked.txt
$ cat locked.txt
$
여기서 핵심: locked.txt는 권한이 000이라 나조차 못 읽지만, 소유자가 나예요. 리눅스에서 소유자는 권한이 막혀 있어도 chmod로 자기 파일의 권한을 다시 열 수 있어요. 그래서 sudo가 전혀 필요 없어요. 반면 /etc/shadow는 소유자가 root라 내가 chmod할 수 없으니 sudo가 필요했던 거고요.
마지막 정리 — chmod 777이 왜 나쁜 해법인가: 777은 그 파일을 아무나(others 포함) 읽고 고치고 실행할 수 있게 만들어요. 권한 문제는 사라지지만, 멀티유저 서버에선 누구든 그 파일을 망치거나 악용할 수 있는 보안 구멍이 생겨요. "문이 안 열려서 문짝을 통째로 떼어버리는" 셈이라, 진짜 해법은 "꼭 필요한 사람에게 꼭 필요한 권한만" 주는 거예요.
💡 튜터의 한마디 — 이 진단 흐름(ls -l로 소유자 확인 → 내 파일이면 chmod → 시스템 파일이면 sudo)이 몸에 배면, Permission denied가 더 이상 무섭지 않아요. 신입과 경력의 차이가 여기서 갈려요. 신입은 일단 sudo부터 붙이고, 경력자는 먼저 ls -l로 읽고 판단해요. 오늘 그 경력자의 습관을 미리 손에 넣은 거예요.
🤔 [생각해볼 주제 1] 왜 권한은 소유자·그룹·그 외 "세 부류"로만 나눌까
문제 상황 요약
리눅스 권한은 owner·group·others 세 부류로만 나뉜다. 사람마다 따로 권한을 정하면 더 세밀할 텐데, 왜 셋으로 단순하게 묶었을까. 단순함의 이점과 그 대가, 그리고 진짜로 사람별 제어가 필요할 때의 보완책을 생각해본다.
튜터의 가이드 및 해설
이 단순함은 게으름이 아니라 의도된 설계예요. 세 부류로 묶은 덕에 얻는 게 분명하거든요.
- 빠른 판단: 권한을 확인할 때 리눅스는 "이 사람이 owner인가? 아니면 group인가? 둘 다 아니면 others"라는 세 단계만 거치면 돼요. 파일마다 수백 명의 권한 목록을 뒤질 필요가 없죠. 파일이 수백만 개인 서버에서 이 차이는 엄청나요.
- 적은 저장 공간: 권한을 단 9비트(owner·group·others × rwx)로 표현할 수 있어요. 우리가 본 10글자가 사실은 작은 숫자 하나로 저장돼요. 사람별 목록이라면 파일마다 그 목록을 다 저장해야 했을 거예요.
- 예측 가능성:
ls -l한 줄만 보면 "누가 뭘 할 수 있나"가 완전히 드러나요. 숨은 규칙이 없죠. 이 투명함이 디버깅과 자동화를 쉽게 만들어요.
대신 포기한 건 사람별 세밀한 제어예요. "이 파일은 alice와 bob만, carol은 빼고" 같은 건 세 부류 모델로는 표현이 안 돼요. group을 쓰면 여러 명을 묶을 순 있지만, "특정 두 사람만"처럼 딱 떨어지지 않는 경우엔 부족하죠.
그래서 리눅스에는 보완책이 있어요. 바로 ACL(Access Control List, 접근 제어 목록)이에요. setfacl·getfacl 명령으로 "이 파일에 한해 carol에게만 추가로 읽기 권한"처럼 사람별·그룹별 예외를 덧붙일 수 있어요. 기본은 단순한 세 부류로 빠르게 가되, 정말 세밀함이 필요한 소수의 파일에만 ACL로 정밀 제어를 더하는 거예요. "기본은 단순하게, 필요할 때만 복잡하게"라는 좋은 설계의 전형이죠.
💡 핵심을 한마디로
"세 부류 모델은 단순함을 택해 속도·공간·예측 가능성을 얻고, 사람별 세밀함은 포기했다. 그 빈자리는 ACL이라는 선택적 보완책이 메운다. 좋은 설계는 흔한 경우를 단순하게 만들고, 드문 경우를 위한 탈출구만 남겨둔다."
🤔 [생각해볼 주제 2] chmod 777은 왜 "해결"이 아니라 "포기"인가
문제 상황 요약
Permission denied를 만났을 때 chmod 777로 다 열면 문제는 즉시 사라진다. 그런데 왜 현업에서는 이걸 나쁜 습관으로 볼까. 777이 멀티유저 서버에서 만드는 위험과, "최소 권한 원칙"이 왜 보안의 기본인지 정리해본다.
튜터의 가이드 및 해설
chmod 777은 "owner·group·others 모두에게 rwx 전부"예요. 권한이라는 잠금장치를 통째로 풀어버리는 거죠. 왜 위험한지 구체적으로 그려볼게요.
내 노트북이라면 어차피 나 혼자 쓰니 큰 문제가 안 느껴질 수 있어요. 그런데 멀티유저 서버를 떠올리면 이야기가 달라져요. 같은 서버를 쓰는 다른 계정(bob, carol, 그리고 서버에 침입한 누군가까지)이 그 파일을 읽고, 고치고, 실행할 수 있게 돼요.
- 설정 파일이
777이면, 누군가 그 안의 DB 비밀번호를 훔쳐보거나 몰래 고칠 수 있어요. - 스크립트가
777이면, 악의적인 누군가가 그 안에 위험한 명령을 끼워 넣어둘 수 있어요. 그게 나중에 관리자 권한으로 실행되면 서버 전체가 위험해지죠. - 특히 웹 서버처럼 외부에 노출된 환경에선, 외부 공격자가 어떤 취약점으로 서버에 발을 들이면
777파일들이 그대로 놀이터가 돼요. "이 파일들은 누구나 고쳐도 됩니다"라고 문을 열어둔 셈이니까요.
그래서 chmod 777은 "문이 안 열려서 문짝을 떼어버린" 거예요. 당장의 불편은 사라지지만, 그 문이 막아주던 모든 걸 함께 잃어요.
진짜 해법은 최소 권한 원칙(Principle of Least Privilege)이에요. "꼭 필요한 사람에게, 꼭 필요한 만큼만" 권한을 주는 거죠. Permission denied가 나면 777을 떠올리는 대신 이렇게 물어요 — "누가 이 파일을 써야 하지? 그 사람이 owner인가, 아니면 어떤 group에 넣어야 하나? 그에게 필요한 게 읽기인가 쓰기인가?" 이 질문에 답하면 chmod 640이나 chmod 750처럼 딱 맞는 최소한의 권한이 나와요. 조금 더 손이 가지만, 그 한 끗이 보안 사고를 막아줍니다.
💡 핵심을 한마디로
"
chmod 777은 문제를 푸는 게 아니라 잠금장치를 포기하는 것이다. 멀티유저·외부 노출 환경에선 그 자체가 보안 구멍이 된다. 권한 문제의 정답은 '다 열기'가 아니라 '누구에게 무엇이 필요한지 묻고 최소한만 주기'다."
🤔 [생각해볼 주제 3] 심볼릭 링크는 "깨질 수 있는데도" 왜 실무의 기본일까
문제 상황 요약
하드 링크는 원본을 지워도 멀쩡하지만, 심볼릭 링크는 원본이 사라지면 깨진다. 안정성만 보면 하드 링크가 나아 보이는데 실무는 심볼릭 링크를 압도적으로 쓴다. 이 역설을 푼다.
튜터의 가이드 및 해설
언뜻 모순 같죠. "더 잘 안 깨지는 쪽"을 두고 "깨질 수 있는 쪽"을 기본으로 쓴다니. 그런데 실무의 요구를 들여다보면 답이 보여요.
먼저 심볼릭 링크가 주는 자유예요. 하드 링크에는 무거운 제약이 있어요.
- 폴더를 못 가리킨다 — 하드 링크는 일반 파일만 걸 수 있어요. 그런데 실무에서 링크를 거는 대상은 폴더인 경우가 정말 많아요(
/app/current → /app/releases/v2.3같은). - 다른 디스크를 못 넘는다 — 하드 링크는 같은 파일시스템 안에서만 동작해요. 서버는 보통 여러 디스크를 쓰는데, 디스크를 넘나드는 링크는 하드 링크로는 불가능해요.
- 심볼릭 링크는 그냥 "경로를 적은 쪽지"라 이 제약이 전부 없어요. 폴더든, 다른 디스크든, 심지어 아직 만들어지지 않은 경로든 자유롭게 가리켜요.
다음은 명확함이에요. 심볼릭 링크는 ls -l에 -> 가리키는곳이 그대로 드러나요. "이건 링크고 진짜는 저기 있다"가 한눈에 보이죠. 반면 하드 링크는 겉보기엔 평범한 파일과 구분이 안 가서, 어떤 게 원본이고 어떤 게 링크인지 알기 어려워요. 시스템을 관리하는 사람 입장에선 이 투명함이 큰 차이예요.
그럼 "깨질 수 있음"은요? 사실 이건 숨은 장점이기도 해요. 가리키던 원본이 사라지면, 심볼릭 링크는 ls에서 깨진 게 눈에 띄게 드러나요. 문제가 숨지 않고 바로 보이는 거예요. 만약 조용히 동작하다 엉뚱한 데이터를 보여줬다면 훨씬 위험했겠죠. "잘못되면 눈에 띄게 멈춘다"는 건 오히려 신뢰할 수 있는 동작이에요.
그래서 실무의 선택은 자연스러워요. 자유와 명확함을 얻고, 그 대가인 "깨질 수 있음"은 오히려 문제를 드러내주는 안전장치로 받아들이는 거예요. 무중단 배포에서 current 링크 하나만 바꿔 새 버전으로 전환하는 패턴이 이 모든 장점을 한 번에 보여줘요.
💡 핵심을 한마디로
"심볼릭 링크는 폴더·다른 디스크까지 자유롭게 가리키고, 정체가
->로 드러나며, 깨지면 눈에 띄게 멈춘다. '깨질 수 있음'은 약점이 아니라 문제를 숨기지 않는 정직함이다. 그래서 실무 배포의 기본 도구가 됐다."