본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 28. · 23 Views
리눅스 기초 명령어 완벽 가이드
터미널을 처음 접하는 개발자를 위한 리눅스 핵심 명령어 가이드입니다. 쉘 기본 명령어부터 SSH 접속까지 실무에서 바로 활용할 수 있는 내용을 담았습니다.
목차
1. 쉘 기본 명령어
입사 첫날, 김개발 씨는 새로 지급받은 맥북 앞에서 당황했습니다. 선배가 "터미널 열어서 프로젝트 폴더로 이동해봐요"라고 했는데, 검은 화면에 깜빡이는 커서만 보일 뿐이었습니다.
윈도우에서는 폴더를 더블클릭하면 됐는데, 이 낯선 세계에서는 어떻게 해야 할까요?
쉘 기본 명령어는 터미널에서 컴퓨터와 대화하는 가장 기초적인 언어입니다. 마치 외국에 처음 갔을 때 "안녕하세요", "감사합니다" 같은 기본 인사말을 배우는 것과 같습니다.
ls, cd, pwd, cat 네 가지 명령어만 익히면 파일 시스템을 자유롭게 탐험할 수 있습니다.
다음 코드를 살펴봅시다.
# pwd: 현재 위치 확인 (Print Working Directory)
pwd
# 출력: /home/kimdev/projects
# ls: 현재 폴더의 파일 목록 보기 (List)
ls -la
# -l: 상세 정보, -a: 숨김 파일 포함
# cd: 디렉토리 이동 (Change Directory)
cd /home/kimdev/projects
cd .. # 상위 폴더로 이동
cd ~ # 홈 디렉토리로 이동
# cat: 파일 내용 출력 (Concatenate)
cat README.md
cat -n app.js # 줄 번호와 함께 출력
김개발 씨는 입사 첫날의 그 당혹감을 아직도 기억합니다. 화려한 GUI 대신 검은 화면과 흰 글씨만 가득한 터미널이라니.
하지만 3개월이 지난 지금, 그는 오히려 터미널 없이는 일을 할 수 없게 되었습니다. 선배 박시니어 씨가 처음 알려준 것은 pwd 명령어였습니다.
"지금 네가 어디에 있는지 모르면 어디로 가야 할지도 모르잖아." Print Working Directory의 약자인 이 명령어는 현재 위치를 알려주는 나침반과 같습니다. 터미널을 처음 열면 보통 홈 디렉토리에서 시작합니다.
pwd를 입력하면 /home/kimdev 같은 경로가 출력됩니다. 이것이 바로 지금 서 있는 위치입니다.
다음으로 배운 것은 ls 명령어입니다. List의 약자로, 현재 폴더에 어떤 파일과 디렉토리가 있는지 보여줍니다.
마치 방 안에 불을 켜서 무엇이 있는지 살펴보는 것과 같습니다. ls만 입력해도 되지만, 실무에서는 ls -la를 더 자주 사용합니다.
-l 옵션은 파일의 권한, 소유자, 크기, 수정 날짜 등 상세 정보를 보여주고, -a 옵션은 점(.)으로 시작하는 숨김 파일까지 모두 보여줍니다. .gitignore나 .env 같은 중요한 설정 파일들이 숨김 파일로 존재하기 때문입니다.
위치를 알았고 주변에 무엇이 있는지도 봤으니, 이제 이동할 차례입니다. cd 명령어는 Change Directory의 약자로, 원하는 폴더로 이동할 수 있게 해줍니다.
마치 집 안에서 거실에서 방으로, 방에서 부엌으로 이동하는 것과 같습니다. cd 다음에 이동하고 싶은 경로를 적으면 됩니다.
cd /home/kimdev/projects처럼 전체 경로를 적을 수도 있고, cd projects처럼 현재 위치 기준 상대 경로를 적을 수도 있습니다. 특별한 기호들도 있습니다.
**cd ..**은 상위 폴더로, cd ~는 홈 디렉토리로 바로 이동합니다. 마지막으로 cat 명령어입니다.
Concatenate의 약자지만, 실무에서는 주로 파일 내용을 터미널에 출력하는 용도로 사용합니다. cat README.md를 입력하면 해당 파일의 내용이 화면에 출력됩니다.
cat -n 옵션을 붙이면 줄 번호까지 함께 표시되어 코드 리뷰할 때 유용합니다. 김개발 씨는 이제 이 네 가지 명령어를 손가락이 기억할 정도로 자연스럽게 사용합니다.
pwd로 현재 위치를 확인하고, ls -la로 주변을 살피고, cd로 원하는 곳으로 이동하고, cat으로 파일 내용을 확인합니다. 이것이 터미널 세계에서 살아남는 첫 번째 생존 기술입니다.
실전 팁
💡 - cd - 명령어를 사용하면 직전에 있던 디렉토리로 바로 돌아갈 수 있습니다
- ls -lh 옵션을 사용하면 파일 크기가 KB, MB 단위로 읽기 쉽게 표시됩니다
2. 파일 및 디렉토리 관리
프로젝트 세팅을 마친 김개발 씨에게 새로운 미션이 떨어졌습니다. "logs 폴더 만들고, 거기에 있는 오래된 로그 파일들 정리 좀 해줘요." GUI에서는 마우스 우클릭으로 간단히 할 수 있는 일인데, 터미널에서는 어떻게 해야 할까요?
파일과 디렉토리 관리는 개발자의 일상입니다. mkdir로 폴더를 만들고, touch로 빈 파일을 생성하고, cp로 복사하고, mv로 이동하거나 이름을 바꾸고, rm으로 삭제합니다.
이 다섯 가지 명령어는 마치 사무실에서 서류를 정리하는 기본 동작들과 같습니다.
다음 코드를 살펴봅시다.
# mkdir: 디렉토리 생성 (Make Directory)
mkdir logs
mkdir -p src/components/common # 중간 경로까지 한번에 생성
# touch: 빈 파일 생성 또는 수정 시간 갱신
touch app.log
touch .gitkeep # 빈 폴더를 git에 포함시킬 때 사용
# cp: 파일/디렉토리 복사 (Copy)
cp config.json config.backup.json
cp -r src/ src_backup/ # -r: 디렉토리 전체 복사
# mv: 이동 또는 이름 변경 (Move)
mv old_name.js new_name.js # 이름 변경
mv app.log logs/ # 파일 이동
# rm: 파일/디렉토리 삭제 (Remove)
rm temp.txt
rm -rf node_modules/ # -r: 재귀적, -f: 강제 삭제
박시니어 씨는 김개발 씨에게 파일 관리 명령어를 알려주며 이렇게 말했습니다. "이건 마치 사무실에서 서류 정리하는 것과 똑같아요.
새 폴더 만들고, 파일 복사하고, 옮기고, 필요 없으면 버리고." 첫 번째는 mkdir 명령어입니다. Make Directory의 약자로, 새로운 디렉토리를 생성합니다.
mkdir logs라고 입력하면 현재 위치에 logs라는 폴더가 만들어집니다. 하지만 실무에서 더 유용한 것은 -p 옵션입니다.
mkdir -p src/components/common이라고 입력하면, src 폴더가 없어도 중간 경로를 모두 자동으로 생성해줍니다. 마치 건물을 지을 때 기초 공사부터 차근차근 하는 것처럼, 필요한 모든 상위 디렉토리를 한 번에 만들어줍니다.
두 번째는 touch 명령어입니다. 원래 목적은 파일의 수정 시간을 갱신하는 것이지만, 실무에서는 빈 파일을 생성하는 용도로 더 많이 사용합니다.
touch app.log라고 입력하면 내용이 없는 빈 파일이 만들어집니다. 재미있는 활용법도 있습니다.
Git은 빈 폴더를 추적하지 않는데, touch .gitkeep으로 빈 파일을 만들어두면 빈 폴더도 저장소에 포함시킬 수 있습니다. 많은 프로젝트에서 이 관례를 사용합니다.
세 번째는 cp 명령어입니다. Copy의 약자로, 파일이나 디렉토리를 복사합니다.
cp config.json config.backup.json처럼 사용하면 설정 파일의 백업을 만들 수 있습니다. 디렉토리 전체를 복사하려면 -r 옵션이 필요합니다.
r은 recursive, 즉 재귀적으로 하위 내용까지 모두 복사한다는 의미입니다. 네 번째는 mv 명령어입니다.
Move의 약자인데, 두 가지 용도로 사용됩니다. **mv app.log logs/**처럼 파일을 다른 위치로 이동할 수도 있고, mv old_name.js new_name.js처럼 파일 이름을 변경할 수도 있습니다.
같은 위치에서 이름만 다르게 지정하면 이름 변경이 되는 것입니다. 마지막으로 rm 명령어입니다.
Remove의 약자로, 파일이나 디렉토리를 삭제합니다. 여기서 주의할 점이 있습니다.
터미널에서 삭제한 파일은 휴지통으로 가지 않고 바로 사라집니다. 복구가 매우 어렵습니다.
특히 rm -rf 명령어는 신중하게 사용해야 합니다. -r은 디렉토리와 그 안의 모든 내용을 재귀적으로 삭제하고, -f는 확인 없이 강제로 삭제합니다.
node_modules처럼 다시 설치할 수 있는 폴더를 지울 때는 유용하지만, 잘못된 경로에 사용하면 돌이킬 수 없는 결과를 초래합니다. 김개발 씨는 한 번 실수로 중요한 설정 파일을 지운 적이 있습니다.
그 이후로는 rm 명령어를 사용하기 전에 항상 경로를 두 번 확인하는 습관이 생겼습니다. "측정하고, 또 측정하고, 그 다음에 자르라"는 목수의 격언처럼, 삭제 전에는 반드시 확인해야 합니다.
실전 팁
💡 - rm -rf를 사용하기 전에 항상 pwd로 현재 위치를 확인하세요
- cp -i, mv -i 옵션을 사용하면 덮어쓰기 전에 확인을 요청합니다
3. 권한 관리
어느 날 김개발 씨가 배포 스크립트를 실행하려는데 "Permission denied"라는 에러가 발생했습니다. 분명히 파일이 있는데 왜 실행이 안 될까요?
박시니어 씨가 다가와 ls -l 결과를 보더니 말했습니다. "실행 권한이 없네요.
chmod로 권한을 줘야 해요."
리눅스는 모든 파일에 읽기(r), 쓰기(w), 실행(x) 권한을 부여합니다. 이 권한은 소유자, 그룹, 기타 사용자 세 부류에게 각각 다르게 설정됩니다.
마치 회사에서 문서에 대한 열람, 수정, 결재 권한을 직급별로 다르게 주는 것과 같습니다. chmod로 권한을 변경하고, chown으로 소유자를 변경합니다.
다음 코드를 살펴봅시다.
# 파일 권한 확인
ls -l deploy.sh
# -rwxr-xr-- 1 kimdev developers 1024 Jan 15 10:30 deploy.sh
# 소유자(rwx) 그룹(r-x) 기타(r--)
# chmod: 권한 변경 (Change Mode)
chmod +x deploy.sh # 실행 권한 추가
chmod 755 deploy.sh # rwxr-xr-x (숫자 방식)
chmod 644 config.json # rw-r--r-- (읽기 전용 설정 파일)
# 숫자 의미: r=4, w=2, x=1
# 7(rwx) = 4+2+1, 5(r-x) = 4+1, 4(r--) = 4
# chown: 소유자 변경 (Change Owner)
sudo chown kimdev:developers app.log
sudo chown -R www-data:www-data /var/www/ # 재귀적 변경
박시니어 씨는 칠판에 권한 구조를 그리며 설명을 시작했습니다. "리눅스 권한은 처음엔 복잡해 보이지만, 원리를 알면 간단해요." ls -l 명령어로 파일을 조회하면 맨 앞에 -rwxr-xr-- 같은 문자열이 보입니다.
첫 번째 문자는 파일 종류입니다. 일반 파일이면 -, 디렉토리면 d입니다.
그 뒤의 아홉 글자가 바로 권한을 나타냅니다. 이 아홉 글자는 세 글자씩 세 묶음으로 나뉩니다.
첫 번째 묶음은 소유자(owner) 권한, 두 번째는 그룹(group) 권한, 세 번째는 기타 사용자(others) 권한입니다. 마치 회사에서 팀장, 팀원, 외부인에게 서로 다른 접근 권한을 주는 것과 같습니다.
각 묶음에서 r은 읽기(read), w는 쓰기(write), x는 실행(execute) 권한을 의미합니다. 권한이 있으면 해당 문자가, 없으면 -가 표시됩니다.
rwxr-xr--는 소유자는 모든 권한, 그룹은 읽기와 실행, 기타는 읽기만 가능하다는 뜻입니다. chmod 명령어로 이 권한을 변경할 수 있습니다.
가장 간단한 방법은 기호를 사용하는 것입니다. chmod +x deploy.sh는 실행 권한을 추가하고, chmod -w config.json은 쓰기 권한을 제거합니다.
하지만 실무에서는 숫자 방식을 더 많이 사용합니다. r=4, w=2, x=1로 계산하여 각 묶음의 권한을 합산합니다.
rwx는 4+2+1=7, r-x는 4+1=5, r--는 4입니다. 그래서 chmod 755는 rwxr-xr-x가 되고, chmod 644는 rw-r--r--가 됩니다.
자주 사용하는 권한 조합을 외워두면 편리합니다. 755는 실행 파일이나 디렉토리에, 644는 일반 파일에, 600은 비밀 설정 파일에 사용합니다.
SSH 키 파일 같은 경우 반드시 600이어야 하는데, 다른 사용자가 읽을 수 있으면 보안상 위험하기 때문입니다. chown 명령어는 파일의 소유자를 변경합니다.
Change Owner의 약자입니다. sudo chown kimdev:developers app.log처럼 사용자와 그룹을 콜론으로 구분하여 지정합니다.
시스템 파일의 소유자를 바꾸려면 관리자 권한이 필요하므로 sudo를 붙여야 합니다. 웹 서버를 운영할 때 이 명령어가 특히 중요합니다.
웹 서버 프로세스는 보통 www-data 같은 특별한 사용자로 실행되는데, 해당 사용자가 파일에 접근할 수 있어야 웹사이트가 정상 작동합니다. **chown -R www-data:www-data /var/www/**처럼 재귀적으로 소유자를 변경하는 경우가 많습니다.
김개발 씨는 이제 "Permission denied" 에러를 보면 당황하지 않습니다. ls -l로 권한을 확인하고, 필요에 따라 chmod나 chown으로 적절히 조정하면 됩니다.
권한 관리는 보안의 첫걸음이자, 리눅스 시스템을 안전하게 운영하는 핵심 기술입니다.
실전 팁
💡 - SSH 키 파일은 반드시 chmod 600으로 설정해야 합니다
- 디렉토리에 x 권한이 없으면 해당 디렉토리에 들어갈 수 없습니다
4. 프로세스 관리
"서버가 느려요!" 슬랙 채널에 급한 메시지가 올라왔습니다. 김개발 씨가 서버에 접속해보니 CPU 사용량이 100%입니다.
무엇이 시스템 자원을 잡아먹고 있는지 찾아서 조치를 취해야 합니다. 이럴 때 필요한 것이 바로 프로세스 관리 명령어입니다.
프로세스는 실행 중인 프로그램입니다. 리눅스에서는 ps로 프로세스 목록을 확인하고, top으로 실시간 모니터링을 하며, kill로 문제가 되는 프로세스를 종료합니다.
마치 회사의 관리자가 직원들의 업무 상황을 파악하고, 필요하면 업무를 조정하는 것과 같습니다.
다음 코드를 살펴봅시다.
# ps: 프로세스 목록 확인 (Process Status)
ps aux # 모든 프로세스 상세 정보
ps aux | grep node # node 관련 프로세스만 필터링
ps -ef --forest # 프로세스 트리 구조로 표시
# top: 실시간 프로세스 모니터링
top # 실시간 모니터링 시작
# q: 종료, k: 프로세스 kill, M: 메모리순 정렬
# kill: 프로세스 종료
kill 12345 # PID 12345 프로세스에 종료 신호
kill -9 12345 # 강제 종료 (SIGKILL)
killall node # 이름이 node인 모든 프로세스 종료
# 유용한 조합
pgrep -f "node app.js" # 특정 명령어의 PID 찾기
pkill -f "node app.js" # 특정 명령어 프로세스 종료
박시니어 씨는 서버 장애 상황에서 침착하게 터미널을 열었습니다. "먼저 무슨 일이 벌어지고 있는지 파악해야 해요." 프로세스란 현재 실행 중인 프로그램을 말합니다.
웹 브라우저를 열면 브라우저 프로세스가, Node.js 서버를 실행하면 노드 프로세스가 생성됩니다. 리눅스에서는 모든 프로세스에 고유한 **PID(Process ID)**가 부여됩니다.
ps 명령어는 Process Status의 약자로, 현재 실행 중인 프로세스 목록을 보여줍니다. 가장 많이 사용하는 조합은 ps aux입니다.
a는 모든 사용자의 프로세스, u는 상세 정보, x는 터미널에 연결되지 않은 프로세스까지 포함한다는 의미입니다. 출력 결과가 너무 많을 때는 grep과 조합합니다.
ps aux | grep node라고 입력하면 node가 포함된 프로세스만 필터링됩니다. 파이프(|)는 앞 명령어의 출력을 뒤 명령어의 입력으로 전달하는 역할을 합니다.
top 명령어는 실시간으로 프로세스 상태를 모니터링합니다. 마치 자동차 계기판처럼 CPU 사용량, 메모리 사용량, 각 프로세스의 자원 점유율을 계속 갱신하며 보여줍니다.
q를 누르면 종료되고, M을 누르면 메모리 사용량 순으로 정렬됩니다. top 화면에서 가장 위에 있는 프로세스가 자원을 가장 많이 사용하는 것입니다.
서버가 느려졌을 때 top을 실행하면 범인을 금방 찾을 수 있습니다. CPU 사용량이 비정상적으로 높은 프로세스를 발견했다면, 이제 조치를 취할 차례입니다.
kill 명령어는 프로세스에 신호를 보내 종료시킵니다. kill 12345처럼 PID를 지정하면 해당 프로세스에 종료 요청 신호(SIGTERM)를 보냅니다.
대부분의 프로세스는 이 신호를 받으면 정리 작업을 수행한 후 스스로 종료됩니다. 하지만 가끔 프로세스가 종료 신호를 무시하거나 응답하지 않을 때가 있습니다.
이럴 때는 kill -9 옵션을 사용합니다. 9번 신호(SIGKILL)는 강제 종료 신호로, 프로세스가 거부할 수 없습니다.
다만 정리 작업 없이 즉시 종료되므로 데이터 손실이 발생할 수 있어 최후의 수단으로 사용해야 합니다. killall 명령어는 프로세스 이름으로 종료할 수 있어 편리합니다.
killall node라고 입력하면 이름이 node인 모든 프로세스가 종료됩니다. 비슷하게 pkill 명령어는 더 유연한 패턴 매칭을 지원합니다.
김개발 씨는 top 화면에서 CPU를 100% 점유하고 있는 프로세스를 발견했습니다. 무한 루프에 빠진 백그라운드 작업이었습니다.
kill 명령어로 해당 프로세스를 종료하자 서버가 다시 정상으로 돌아왔습니다. 프로세스 관리 명령어를 알고 있었기에 신속하게 대응할 수 있었습니다.
실전 팁
💡 - htop을 설치하면 top보다 더 직관적인 인터페이스로 프로세스를 관리할 수 있습니다
- kill -9는 최후의 수단입니다. 먼저 일반 kill을 시도하세요
5. 환경 변수 설정
김개발 씨가 로컬에서 잘 돌아가던 애플리케이션을 서버에 배포했는데 갑자기 데이터베이스 연결이 안 됩니다. 코드를 살펴보니 process.env.DATABASE_URL을 참조하고 있었습니다.
"환경 변수가 설정되어 있지 않네요." 박시니어 씨의 진단이었습니다.
환경 변수는 운영체제 수준에서 프로그램에 전달되는 설정값입니다. 마치 극장의 조명이나 온도 설정처럼, 같은 공연이라도 환경에 따라 다르게 연출될 수 있습니다.
개발, 스테이징, 프로덕션 환경마다 다른 데이터베이스 주소나 API 키를 사용하는 것이 대표적인 예입니다.
다음 코드를 살펴봅시다.
# 환경 변수 확인
echo $HOME # 특정 변수 출력
echo $PATH # 실행 파일 검색 경로
env # 모든 환경 변수 출력
printenv DATABASE_URL # 특정 변수 확인
# 환경 변수 설정 (현재 세션에서만)
export DATABASE_URL="postgres://localhost:5432/mydb"
export NODE_ENV=production
export API_KEY="your-secret-key"
# 명령어 실행 시 일회성으로 설정
NODE_ENV=test npm run test
# 영구 설정 (~/.bashrc 또는 ~/.zshrc에 추가)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc # 변경 사항 즉시 적용
# 환경 변수 삭제
unset DATABASE_URL
박시니어 씨는 환경 변수의 중요성을 이렇게 설명했습니다. "코드에 비밀번호나 API 키를 직접 적으면 안 돼요.
그건 마치 집 열쇠를 현관문에 붙여두는 것과 같아요." 환경 변수는 프로그램 외부에서 설정값을 주입하는 방법입니다. 같은 코드라도 환경 변수에 따라 다르게 동작할 수 있습니다.
개발 환경에서는 로컬 데이터베이스를, 프로덕션에서는 실제 데이터베이스를 사용하는 식입니다. echo $변수명으로 환경 변수의 값을 확인할 수 있습니다.
echo $HOME을 입력하면 홈 디렉토리 경로가, echo $PATH를 입력하면 실행 파일을 찾는 경로 목록이 출력됩니다. PATH는 특히 중요한데, 터미널에서 명령어를 입력하면 시스템이 PATH에 지정된 디렉토리들을 순서대로 뒤져서 해당 명령어를 찾기 때문입니다.
export 명령어로 새로운 환경 변수를 설정합니다. **export DATABASE_URL="postgres://localhost:5432/mydb"**처럼 사용합니다.
단, 이렇게 설정한 변수는 현재 터미널 세션에서만 유효합니다. 터미널을 닫으면 사라집니다.
일회성으로 환경 변수를 설정하고 싶을 때는 명령어 앞에 바로 적을 수 있습니다. NODE_ENV=test npm run test라고 입력하면 npm run test가 실행되는 동안에만 NODE_ENV가 test로 설정됩니다.
환경 변수를 영구적으로 설정하려면 셸 설정 파일을 수정해야 합니다. Bash를 사용한다면 ~/.bashrc, Zsh를 사용한다면 ~/.zshrc 파일에 export 문을 추가합니다.
수정 후에는 source ~/.bashrc 명령어로 변경 사항을 즉시 적용할 수 있습니다. 실무에서는 .env 파일을 많이 사용합니다.
환경 변수들을 한 파일에 모아두고, 애플리케이션 시작 시 자동으로 로드하는 방식입니다. Node.js의 dotenv, Python의 python-dotenv 같은 라이브러리가 이 역할을 합니다.
중요한 것은 .env 파일을 절대 Git에 커밋하면 안 된다는 점입니다. .gitignore에 반드시 추가해야 합니다.
unset 명령어는 환경 변수를 삭제합니다. unset DATABASE_URL을 입력하면 해당 변수가 제거됩니다.
테스트할 때 특정 환경 변수가 없는 상황을 시뮬레이션하고 싶을 때 유용합니다. 김개발 씨는 서버에 필요한 환경 변수들을 설정한 후 애플리케이션을 다시 시작했습니다.
데이터베이스 연결이 성공했습니다. 이제 그는 환경 변수의 중요성을 몸소 체험했고, 민감한 정보는 절대 코드에 직접 쓰지 않는 습관이 생겼습니다.
실전 팁
💡 - .env 파일은 반드시 .gitignore에 추가하여 저장소에 커밋되지 않도록 하세요
- printenv나 env 명령어로 현재 설정된 모든 환경 변수를 확인할 수 있습니다
6. SSH 접속 및 키 관리
드디어 김개발 씨가 처음으로 실서버에 접속할 일이 생겼습니다. 선배가 알려준 IP 주소와 함께 PEM 키 파일을 받았는데, 어떻게 사용해야 할지 막막합니다.
"SSH로 접속하면 돼요. 어렵지 않아요." 박시니어 씨가 옆에서 차근차근 알려주기 시작했습니다.
**SSH(Secure Shell)**는 원격 서버에 안전하게 접속하는 프로토콜입니다. 마치 은행 금고에 들어가려면 열쇠가 필요하듯, SSH 접속에도 개인 키가 필요합니다.
비밀번호 방식보다 키 기반 인증이 더 안전하며, 한 번 설정해두면 비밀번호 없이 편리하게 접속할 수 있습니다.
다음 코드를 살펴봅시다.
# SSH 기본 접속
ssh username@192.168.1.100 # 비밀번호 방식
ssh -p 2222 username@server.com # 포트 지정
# SSH 키 생성
ssh-keygen -t ed25519 -C "kimdev@company.com"
# Enter file: ~/.ssh/id_ed25519 (기본값)
# Enter passphrase: (빈값 또는 암호 설정)
# 키 파일로 접속
ssh -i ~/.ssh/my-server-key.pem ubuntu@ec2-server.com
# 공개키를 서버에 복사 (비밀번호 인증이 가능할 때)
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server.com
# SSH 설정 파일 (~/.ssh/config)
# Host production
# HostName ec2-12-34-56-78.compute.amazonaws.com
# User ubuntu
# IdentityFile ~/.ssh/production.pem
# Port 22
# 설정 후 간편 접속
ssh production
박시니어 씨는 SSH를 이렇게 비유했습니다. "SSH는 원격 서버로 가는 안전한 터널이에요.
그리고 키는 그 터널의 입구를 여는 열쇠죠." **SSH(Secure Shell)**는 네트워크를 통해 다른 컴퓨터에 안전하게 접속하는 프로토콜입니다. 데이터가 암호화되어 전송되기 때문에 중간에서 누군가 엿보더라도 내용을 알 수 없습니다.
가장 기본적인 접속 방법은 ssh username@서버주소입니다. 비밀번호를 물어보면 입력하고 엔터를 누르면 됩니다.
하지만 비밀번호 방식은 보안상 취약합니다. 무작위 대입 공격에 노출될 수 있기 때문입니다.
더 안전한 방법은 키 기반 인증입니다. SSH 키는 두 개로 이루어집니다.
**개인 키(private key)**는 나만 가지고 있어야 하고, **공개 키(public key)**는 접속하려는 서버에 등록합니다. 마치 자물쇠와 열쇠 관계와 같습니다.
공개 키는 자물쇠처럼 여러 서버에 설치해도 되지만, 개인 키는 열쇠처럼 절대 유출되면 안 됩니다. ssh-keygen 명령어로 키 쌍을 생성합니다.
-t ed25519 옵션은 알고리즘을 지정하는데, ed25519가 현재 가장 권장되는 방식입니다. -C 옵션은 키에 주석을 달아 어떤 용도인지 구분하기 쉽게 해줍니다.
키 생성 시 파일 경로와 암호(passphrase)를 물어봅니다. 기본 경로를 사용하면 ~/.ssh/id_ed25519에 개인 키가, ~/.ssh/id_ed25519.pub에 공개 키가 저장됩니다.
암호는 보안을 위해 설정하는 것이 좋지만, 매번 입력해야 하는 불편함이 있습니다. AWS EC2 같은 클라우드 서버에서는 .pem 확장자의 키 파일을 제공합니다.
이 파일로 접속하려면 ssh -i 키파일경로 username@서버주소 형식을 사용합니다. 중요한 것은 키 파일의 권한입니다.
chmod 600 키파일.pem으로 본인만 읽을 수 있도록 설정해야 합니다. 그렇지 않으면 SSH가 보안상의 이유로 연결을 거부합니다.
자주 접속하는 서버가 많다면 ~/.ssh/config 파일을 활용하세요. 여기에 서버별 설정을 저장해두면 ssh production처럼 별칭만으로 간편하게 접속할 수 있습니다.
호스트 주소, 사용자명, 키 파일 경로, 포트 번호 등을 미리 지정해둘 수 있습니다. ssh-copy-id 명령어는 공개 키를 서버에 등록하는 가장 쉬운 방법입니다.
이 명령어를 실행하면 서버의 ~/.ssh/authorized_keys 파일에 공개 키가 자동으로 추가됩니다. 이후부터는 비밀번호 없이 키만으로 접속할 수 있습니다.
김개발 씨는 처음에는 긴 접속 명령어를 매번 입력했지만, 이제는 config 파일을 설정해두고 ssh dev, ssh prod처럼 간단히 입력합니다. SSH 키 관리와 config 파일 설정은 처음 한 번만 해두면 이후로는 생산성을 크게 높여주는 투자입니다.
실전 팁
💡 - 키 파일 권한은 반드시 600으로 설정하세요 (chmod 600 keyfile.pem)
- ssh-agent를 사용하면 passphrase를 매번 입력하지 않아도 됩니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
CloudFormation 기초 완벽 가이드
AWS 인프라를 코드로 관리하는 CloudFormation의 기초부터 실전까지 다룹니다. 템플릿 작성부터 스택 관리까지, 초급 개발자도 쉽게 따라 할 수 있는 실무 중심 가이드입니다.
AWS CodePipeline 구성 완벽 가이드
AWS CodePipeline을 처음 접하는 개발자를 위한 실전 가이드입니다. 파이프라인 생성부터 소스, 빌드, 배포 스테이지 구성까지 단계별로 배워봅니다. 자동화된 CI/CD 파이프라인을 직접 만들어보세요.
ECS 오토스케일링 완벽 가이드
AWS ECS에서 트래픽에 따라 자동으로 서비스를 확장하고 축소하는 오토스케일링 설정 방법을 초급 개발자도 쉽게 이해할 수 있도록 실무 중심으로 설명합니다. 비용 최적화와 안정적인 서비스 운영의 핵심 기술입니다.
ECR에 이미지 푸시 완벽 가이드
Docker 이미지를 AWS ECR에 안전하게 푸시하는 전체 과정을 초급자 관점에서 쉽게 설명합니다. 로그인부터 취약점 스캔까지 실무에서 바로 활용할 수 있는 완벽한 가이드입니다.
AWS ECR 레포지토리 생성 완벽 가이드
Docker 이미지를 안전하게 저장하고 관리하는 ECR 레포지토리 생성부터 권한 설정까지, 초급 개발자를 위한 실무 중심 가이드입니다. 프라이빗과 퍼블릭의 차이, 이미지 태그 전략, 수명 주기 정책까지 모두 다룹니다.