MMeshOps
바이브코딩을 위한 Git과 리눅스 기초
6예상 8입문

외부 파일 가져오기와 원격 서버 접속

인터넷에서 파일을 다운로드하는 curl 명령어와 원격 서버에 안전하게 접속하기 위한 ssh 명령어의 기초를 학습합니다.

서버 내부에 들어가서 이리저리 돌아다니고 파일을 다루는 방법은 어느 정도 손에 익었습니다. 그렇다면 처음부터 그 서버 내부에는 어떻게 들어가는 것일까요? 또, 브라우저가 없는 터미널 환경에서 인터넷에 있는 외부 데이터나 라이브러리를 내 서버 안으로 다운로드 받으려면 어떻게 해야 할까요? 이번 시간에는 외부 세상과 내 서버를 연결해 주는 통신 명령어인 `ssh`와 `curl`에 대해 알아봅니다.

먼 곳의 서버로 텔레포트: `ssh`

클라우드 환경에서 웹 서버를 임대하면(예: AWS EC2, 카페24, 리눅스 호스팅), 그 컴퓨터는 저 멀리 거대한 데이터 센터 안에 존재합니다. 내 모니터와 키보드가 그 서버와 직접 연결되어 있지 않습니다. 이렇게 멀리 떨어진 리눅스 컴퓨터에 인터넷을 통해 안전하게 접속하여, 마치 내 눈앞에 있는 것처럼 터미널 창을 열어 조종하게 해주는 마법의 명령어가 바로 `ssh`입니다.

`ssh`는 Secure Shell의 약자입니다. 인터넷이라는 위험한 바다를 건너 명령을 주고받을 때, 그 내용이 남에게 보이지 않도록 강력하게 암호화(Secure)하여 전달하는 껍데기(Shell)라는 의미입니다.

사용하는 기본 구조는 `ssh [아이디]@[서버IP주소]` 입니다. 예를 들어 서버에서 제공받은 아이디가 `ubuntu`이고 접속 주소가 `192.168.0.100`이라면, 내 컴퓨터의 터미널을 열고 다음과 같이 입력합니다.

ssh 명령어 접속 흐름

$ ssh [email protected]
[email protected]'s password: [비밀번호 입력]
Welcome to Ubuntu 22.04 LTS!
ubuntu@my-server:~$

비밀번호를 성공적으로 입력하면, 터미널 프롬프트의 이름표가 바뀌면서 이제부터 치는 모든 명령어는 내 컴퓨터가 아니라 저 멀리 있는 서버 안에서 실행되게 됩니다.

비밀번호 대신 사용하는 안전한 열쇠: SSH Key

실무에서는 보안상의 이유로 비밀번호 입력을 아예 막아두고, 공개키/개인키 암호화 방식(SSH Key)을 많이 사용합니다. 이는 매우 복잡하고 긴 특수 암호 파일을 물리적인 '열쇠'처럼 사용하는 방식입니다. 내 컴퓨터에는 '개인키(Private Key)'라는 절대 남에게 주면 안 되는 마스터키를 보관하고, 접속하려는 서버의 자물쇠에는 '공개키(Public Key)'를 미리 박아둡니다.

서버를 처음 임대하면 `.pem` 형태의 열쇠 파일을 주는데, 이 파일을 이용해 접속하려면 `-i` 옵션을 써서 열쇠의 위치를 알려주어야 합니다. `ssh -i my-key.pem [email protected]`과 같이 명령을 내리면, 비밀번호를 묻지 않고 문이 철컥 열립니다.

터미널 안의 인터넷 브라우저: `curl`

서버에 무사히 들어왔다면, 웹사이트 구축에 필요한 외부 데이터(폰트 파일, 예제 코드, 오픈소스 설치 스크립트)를 인터넷에서 다운로드 받아야 합니다. 크롬 브라우저가 없기 때문에 '다른 이름으로 저장' 버튼을 누를 수 없습니다. 이때 터미널에서 웹사이트 주소로 요청을 보내고 데이터를 받아오는 도구가 `curl`입니다.

`curl`은 Client URL의 약자로, 서버 관리자나 바이브코딩 AI가 외부 API나 파일을 가져올 때 가장 즐겨 쓰는 명령어입니다. 단순히 터미널에 `curl http://example.com`을 입력하면, 해당 웹사이트를 이루고 있는 HTML 코드 전체가 화면에 텍스트로 주르륵 출력됩니다.

하지만 우리의 목적은 화면에 출력하는 것이 아니라 파일로 예쁘게 다운로드 받아 디스크에 저장하는 것입니다. 이때 대문자 `-O` 옵션(Output)을 사용합니다.

curl을 이용한 외부 데이터 다운로드

bash
```bash
$ curl -O https://raw.githubusercontent.com/meshops/sample/main/config.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1024  100  1024    0     0   4096      0 --:--:-- --:--:-- --:--:--  4096
$ ls
config.json
```
  1. 1원본 이름 그대로 저장: curl -O https://example.com/logo.png (주소 마지막에 있는 logo.png라는 이름으로 현재 폴더에 다운로드합니다.)
  2. 2리다이렉션 추적: curl -L -O https://example.com/download/latest (주소가 다른 곳으로 자동 이동(리다이렉션)하더라도 끝까지 추적해서 최신 버전을 다운로드합니다.)
  3. 3API 테스트: curl https://api.github.com/users/meshops (브라우저 없이 특정 데이터 서버가 올바른 JSON 결과값을 뱉어내는지 바로 확인할 때 유용합니다.)

바이브코딩 중에 AI가 "다음 명령어를 입력하여 설치 스크립트를 다운받으세요"라며 `curl`로 시작하는 긴 문장을 준다면, 이는 위험한 해킹 명령이 아니라 단순히 인터넷의 특정 주소에 있는 설정 파일을 내 서버 폴더 안으로 다운로드하는 과정임을 이해하시면 됩니다.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

원격지에 있는 리눅스 서버에 접속할 때, 암호가 담긴 열쇠 파일(secret-key.pem)을 증명서로 제출하여 안전하게 접속하려고 합니다. 빈칸에 들어갈 가장 알맞은 ssh 옵션은 무엇인가요? [ ssh (빈칸) secret-key.pem [email protected] ]

3줄 요약

  1. 1ssh 명령어는 인터넷 너머 멀리 떨어져 있는 원격 리눅스 서버에 안전하게 접속하여 터미널 명령을 내릴 수 있게 해주는 필수 통로입니다.
  2. 2실무에서는 보안을 위해 비밀번호 대신 개인키 파일(.pem)을 사용하는 공개키 암호화 방식 접속을 주로 활용합니다.
  3. 3터미널 환경에서 브라우저 없이 인터넷의 특정 주소로부터 파일이나 데이터를 내 서버 안으로 직접 다운로드받을 때는 curl -O 명령어를 사용합니다.