서버 접속과 파일 전송에서 SSH·SFTP·FTP·FTPS는 어떻게 다른가요?
원격 서버에서 명령을 실행하려면 SSH, 파일을 전송하려면 SFTP를 사용합니다. SFTP는 SSH 연결을 이용하며, FTP에 TLS를 적용한 FTPS와는 다른 방식입니다.
적용 조건·범위: 검증 상태: 이 글의 TaskFlow 운영 서버 접속·파일 전송은 미확인입니다. 위 항목은 수행 기준이며, 이미 성공했다는 기록이 아닙니다.
본문 근거: OpenBSD ssh(1): 원격 명령 실행·인증·호스트 키 · OpenBSD sftp(1): 파일 전송과 로컬·원격 명령 · RFC 4217: FTP에 TLS 적용
SSH로 서버의 파일 목록 보기
내 PC의 터미널에서 시작합니다. user는 서버 계정, example-server는 서버 주소로 바꾸세요. 접속에 성공하면 같은 터미널에서 입력하는 명령이 서버에서 실행됩니다.
처음 접속할 때는 서버를 식별하는 호스트 키 지문을 확인합니다. 서버 관리자 등 신뢰할 수 있는 별도 경로로 받은 지문과 대조한 뒤 접속하세요.
# 내 PC에서 접속
ssh user@example-server
# 접속한 서버에서 실행
pwd
ls -la
# pwd 출력 예시
/home/user
결과 읽기: pwd가 /home/user를 출력했다면 서버의 그 폴더에 있다는 뜻입니다. ls -la는 그 안의 파일 목록·소유자·권한을 보여줍니다. 서버의 현재 폴더가 웹 서비스 경로와 같지는 않을 수 있습니다.
SFTP로 내 파일을 서버에 올리기
파일을 전송하려면 내 PC의 새 터미널에서 SFTP로 접속합니다. 아래에서 로컬은 내 PC, 원격은 접속한 서버를 뜻합니다.
# 내 PC에서 접속
sftp user@example-server
접속 후 현재 폴더를 확인하고 report.txt를 올리는 명령 예시입니다.
sftp> lpwd
Local working directory: /home/me/upload
sftp> pwd
Remote working directory: /home/user
sftp> put report.txt approved-test/report.txt
보내는 파일: 내 PC의 /home/me/upload/report.txt
저장할 위치: 서버의 /home/user/approved-test/report.txt
put은 내 PC에서 서버로 올리기, get은 서버에서 내 PC로 내려받기입니다. 위 예시의 approved-test 폴더는 서버에 미리 있어야 하고, 해당 계정에 파일을 쓸 권한이 필요합니다.
| 작업 | 내 PC | 서버 |
|---|---|---|
| 현재 경로 | lpwd |
pwd |
| 경로 이동 | lcd 경로 |
cd 경로 |
전송 성공과 웹 반영 성공은 별도로 확인합니다. 확인 절차는 파일 전송 후 점검을 참고하세요.
SSH·SFTP·FTP·FTPS 차이
| 방식 | 용도 | 연결 보호 |
|---|---|---|
| SSH | 원격 로그인·명령 실행 | SSH 암호화 |
| SFTP | 파일 업로드·다운로드 | SSH 연결 이용 |
| FTP | 파일 업로드·다운로드 | 평문 전송은 인증 정보·데이터 노출 위험 |
| FTPS | FTP 방식 파일 전송 | TLS 적용 |
어떤 접속 방식을 선택할지 더 알아보기
SFTP는 SSH 연결로 파일을 전송합니다
SFTP는 SSH File Transfer Protocol입니다. GUI 클라이언트에서도 호스트·계정·인증 방식과 로컬·원격 경로를 구분합니다. 서버가 SFTP만 허용하고 셸은 막을 수도 있으므로, SSH 명령 실행과 파일 전송 권한은 각각 확인합니다.
- 내 PC터미널 또는 파일 전송 클라이언트
- SSH 연결서버 신원 확인과 사용자 인증
- 서버에서 할 일SSH는 명령 실행, SFTP는 파일 전송
FTPS와 SFTP는 호환되지 않습니다
FTPS는 FTP에 TLS를 적용한 방식이고 SFTP는 SSH 기반입니다. 클라이언트에서 서버 제공자가 지정한 프로토콜과 보안 설정을 선택합니다.
환경에 맞는 선택
- VPS·자체 Linux 서버: 명령은 SSH, 파일은 서버가 허용한 SFTP 등으로 다룹니다.
- 기존 FTP 시스템: FTPS 지원 여부와 TLS 요구 사항을 확인합니다.
- Vercel·Firebase Hosting: 플랫폼의 빌드·배포 경로를 사용하므로 직접 SSH 접속이 필요하지 않을 수 있습니다.
사용자 키와 서버 호스트 키 구분하기
키 인증은 사용자를 확인합니다
서버는 계정에 등록된 공개키와 개인키의 관계로 사용자를 인증합니다. 개인키는 내 PC에서 보호하고 저장소·공유 문서에 넣지 않습니다. 공개키는 접속을 허용할 서버 계정에 등록합니다.
접속 별칭과 키 경로를 지정하는 SSH 설정 예시입니다.
Host taskflow-server
HostName example-server
User deploy
IdentityFile ~/.ssh/taskflow_deploy
호스트 키는 서버를 확인합니다
클라이언트는 호스트 키로 서버 신원을 확인합니다. 처음 보거나 기존과 다른 지문이면 접속을 멈추고, 신뢰할 수 있는 별도 경로로 지문과 변경 이유를 확인합니다. 경고를 없애려고 known_hosts를 무조건 지우거나 호스트 키 확인을 끄지 않습니다.
Permission denied가 나오면
“권한이 없어 거부됐다”는 뜻입니다. 서버 접속이 거부됐는지, 접속 후 파일 저장이 거부됐는지부터 나누면 확인할 곳을 좁힐 수 있습니다.
| 멈춘 지점 | 의미 | 먼저 확인 |
|---|---|---|
| SSH 로그인 전 | 사용자 인증 실패 | 호스트·계정·키·허용된 인증 방식 |
로그인 후 put |
파일 쓰기 거부 | 원격 경로·쓰기 권한·대상 파일·서버 정책 |
| 디렉터리 이동·읽기 | 경로 접근 거부 | 상위 경로 포함 권한·소유자·그룹 |
로그인은 되지만 /var/www/app에 쓸 수 없다면 경로 권한을 확인합니다. pwd와 ls -la로 상태를 보고 필요한 계정·그룹에 필요한 권한만 부여합니다. 운영 서버에서 chmod 777을 기본 해결책으로 쓰지 않습니다.
파일은 올랐는데 웹 화면이 그대로라면
업로드 경로와 서비스가 읽는 경로를 비교합니다. 예를 들어 /home/deploy/app에 올려도 서비스는 /var/www/app이나 빌드 산출물을 제공할 수 있습니다. No such file은 현재 경로와 대상 경로부터 대조합니다. SFTP에서 보이는 경로가 셸과 다르면 서버 설정·운영 문서에서 대응 관계를 확인합니다.
파일 전송 후 점검
- 서버·계정·현재 경로와 실제 서비스 경로를 대조합니다.
- 기존 파일의 백업·버전을 확인한 뒤 승인된 파일을 전송합니다.
- 파일 존재·크기·소유자·권한을 확인합니다.
- 브라우저나 HTTP 응답으로 실제 서비스 반영을 확인합니다.
파일 전송 오류 읽어보기
다음은 연습용 가상 기록입니다. 이 페이지에서 실제 서버에 접속하거나 파일을 전송하지 않습니다.
SSH 로그인: 성공
SFTP pwd: /home/demo
put report.txt: Permission denied
공개 웹 서비스 경로: /srv/site
어디부터 확인할까요? 비밀번호를 다시 입력해야 할까요, 파일을 저장할 위치를 확인해야 할까요?
답과 이유 보기
파일을 저장할 위치와 쓰기 권한부터 확인합니다.
- 로그인: SSH 로그인은 성공했습니다. 이 기록에서 사용자 인증이 실패한 것은 아닙니다.
- 파일 전송:
put이 거부됐으므로 파일을 올리는 데 실패했습니다. 웹에 반영됐다고 할 수 없습니다. - 다음 확인: SFTP의 현재 폴더
/home/demo와 실제 서비스 경로/srv/site를 대조하고, 저장하려는 폴더의 쓰기 권한을 확인합니다.
호스트 키 지문이 이전과 달라졌다면 권한 확인보다 먼저 접속을 멈춥니다. 신뢰할 수 있는 별도 경로로 지문과 변경 이유를 다시 확인하세요.
과정 안내와 학습 체크리스트
배포·서버 과정에서 다루는 범위
명령 실행·파일 전송 도구를 고르고, 인증·권한·경로 오류를 구분하는 선택 확장 단계입니다. Vercel이 주 배포 경로인 TaskFlow에서는 서버를 새로 만들지 않고 접속 확인 문서를 작성합니다.
준비할 지식
파일 경로와 터미널 명령의 기초면 충분합니다. 원격 서버 없는 판단 연습부터 진행할 수 있습니다.
- SSH 명령 실행과 SFTP 파일 전송의 역할을 구분할 수 있습니다.
- SFTP와 FTPS가 서로 다른 프로토콜임을 설명할 수 있습니다.
- 개인키 보호와 서버 호스트 키 확인의 목적을 구분할 수 있습니다.
- 사용자 인증·파일 권한·경로 오류의 발생 단계를 찾을 수 있습니다.
- 전송 완료와 서비스 반영 완료를 별도로 확인할 수 있습니다.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 작업을 관리하는 예제 앱입니다. 이 선택 실습에서는 앱을 배포하고 서버·설정·운영 결과를 확인합니다.
Runbook은 작업 순서와 확인 항목을 적어 두는 문서입니다. 이번 단계에서는 이 파일만 추가합니다.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 이 블로그에서 단계별로 만드는 할 일 앱입니다. 연재를 따라가는 분은 서버 접속·파일 전송 전후에 확인할 내용을 docs/server-access-runbook.md에 정리합니다.
SSH와 SFTP의 차이만 찾으셨다면 여기까지 읽어도 됩니다. 앱 실행·전체 코드·테스트 서버 실습이 필요할 때 아래 자료를 펼쳐보세요.
전체 프로젝트 시작·실행과 체크포인트
이 글부터 시작하는 전체 프로젝트
시작 ZIP — deploy-step-02-artifact-strategy-full-20260928을 새 폴더에 풀고, 이번 단계 완료 ZIP은 다른 폴더에 풀어 비교합니다. ZIP 안에서 package.json이 있는 프로젝트 폴더가 실행 루트입니다.
출발점은 Next.js 누적 TaskFlow와 같은 38단계 소스입니다. 홈·로그인·개인 작업 화면, 작업 추가·완료·삭제, Route Handler와 캐시 예제, 버전을 고정한 package-lock.json을 포함합니다. 이전 글의 코드를 모으지 않아도 됩니다.
이전 체크포인트
deploy-step-02-artifact-strategy에서 시작해 deploy-step-03-server-access로 이어집니다.
변경 파일과 실행 순서
이번 변경은 docs/server-access-runbook.md 추가입니다. 기존 docs/deployment-plan.md와 앱 파일은 유지합니다.
- Node.js 24와 npm을 사용해 실행 루트에서
npm ci를 실행합니다. - 아래 runbook 전체 내용 또는 완료 ZIP의 같은 파일을 대조해 적용합니다.
npm run typecheck와npm run build를 실행합니다. 오류가 있으면 첫 오류의 파일·명령을 기록하고 해결한 뒤 진행합니다.npm run setup-auth로 일회용 로컬 학습 계정을 설정하고npm run dev를 실행합니다. 생성된.env.local과 입력 값은 공유하지 않습니다.
예상 동작: 홈과 로그인 화면은 공개됩니다. 로그인 전 /tasks는 로그인 화면으로 이동하고 /api/tasks는 401을 반환합니다. 로그인 후 작업 추가·완료·삭제를 확인합니다. /cache-lab의 별도 캐시 실습에는 npm run cache-api가 필요합니다.
저장 범위: 작업은 단일 Node 프로세스 메모리에 저장되며 인증은 학습용 계정 예제입니다. 서버 재시작·서버리스 인스턴스 사이의 데이터 유지는 보장하지 않습니다. 로컬 실행 확인과 실제 운영 서비스 구축을 구분합니다.
완료 체크포인트
deploy-step-03-server-access. 다음 글에는 이번 전체 완료 ZIP을 시작본으로 가져갑니다.
서버 접속 메모와 참고 파일
Runbook은 작업 순서와 확인 항목을 적어 두는 문서입니다. 이번 단계에서는 이 파일만 추가합니다. 배포 계획과 README는 참고용이며, 실행 앱은 전체 완료 ZIP에 있습니다.
서버 접속 메모와 참고 문서 3개 보기
전체 파일·코드 보기
docs/server-access-runbook.md
# Server Access Runbook
## Connection
- host: 저장하지 않음
- user: 환경별 문서에서 별도 관리
- authentication: SSH key 우선
- private key: 저장소에 포함 금지
## Before upload
1. 대상 서버 확인
2. 현재 경로 확인
3. 배포 대상 경로 확인
4. 기존 파일 상태 확인
## After upload
1. 파일 존재 확인
2. owner / permission 확인
3. 서비스가 실제 경로를 읽는지 확인
4. HTTP 결과 확인
## Never commit
- private key
- password
- access token
- production secret
docs/deployment-plan.md
# TaskFlow Deployment Plan
## Build
- package manager: npm
- install: npm ci
- build: npm run build
## Primary deployment
- platform: Vercel
- environment: Production
## Alternative deployment
- Firebase Hosting: static output일 때 검토
- Firebase App Hosting: server runtime이 필요할 때 검토
## Verification
- Production URL 응답
- 주요 화면 확인
- 환경변수 확인
- 주요 route 확인
- 현재 commit 확인
- rollback 가능 여부 확인
## Runtime decision
- static-only: no
- server runtime required: yes
- reasons:
- Route Handler
- server-side environment variables
## Primary
Vercel Production
## Firebase alternative
App Hosting 우선 검토
## Static variant
정적 결과물로 분리할 경우 Firebase Hosting 검토
README.md — 최소 문서 ZIP 안내
이 README는 아래 체크포인트 다운로드의 문서·설정 최소 ZIP에 대한 안내입니다. 위의 -full-20260928.zip 전체 앱과 구분합니다.
# 배포·서버 03 — deploy-step-03-server-access
이 ZIP은 배포 준비·운영 문서와 해당 회차 설정/코드 조각을 누적한 적용 자료입니다. 실행 앱 전체는 포함하지 않습니다. 기존 deploy-step-00-build-ready 프로젝트에 해당 파일을 검토하여 적용하세요. 이 ZIP 루트에서 npm ci/build를 실행하는 구조가 아닙니다.
이 자료에는 실제 배포·DNS 변경·SSH 접속·메일/알림·롤백 결과가 없습니다. 운영 작업은 독자가 본인 환경과 권한을 확인한 후 수행해야 합니다. 문서의 확인 항목은 수행할 체크리스트이며 이미 통과했다는 기록이 아닙니다.
테스트 서버가 있을 때의 실습·결과·복구 기준
전제: 자신이 관리하는 테스트 서버의 승인된 계정·경로와 신뢰할 수 있는 호스트 키 지문이 있을 때만 원격 실습을 합니다. 관리형 Vercel 배포에는 SSH 접속이 필요하지 않습니다. 비밀번호·개인키 원문은 문서와 저장소에 남기지 않습니다.
- 명령 실행(SSH)과 파일 전송(SFTP)의 목적을 나눕니다. runbook 또는 별도 환경 문서에 호스트 별칭·계정 역할·승인된 원격 디렉터리·검증 파일 이름을 정리합니다. 실제 호스트 값과 인증 정보는 공개 저장소에 남기지 않습니다.
- 별도 신뢰 경로로 호스트 키 지문을 확인한 뒤 SSH 접속과 SFTP의
pwd·ls를 각각 확인합니다. - 원격 경로와 쓰기 권한을 확인한 후 승인된 테스트 파일 하나만 전송합니다. 운영 파일 덮어쓰기는 이 연습에 포함하지 않습니다.
- 전송 전후 파일 목록·크기를 대조하고, 복구가 필요하면 승인된 경로의 해당 테스트 파일만 정리하며 변경 이력을 기록합니다.
실패 판정: SSH 접속이 성공해도 SFTP 쓰기는 실패할 수 있습니다. Permission denied는 인증 단계인지 파일 권한 단계인지 나누고, No such file은 현재 경로와 대상 경로를 대조합니다. 호스트 키가 예상과 다르면 접속을 중단하고 관리자가 지문을 재확인해야 합니다.
검증 상태: 이 글의 TaskFlow 운영 서버 접속·파일 전송은 미확인입니다. 위 항목은 수행 기준이며, 이미 성공했다는 기록이 아닙니다.
문서·설정 체크포인트 다운로드
아래는 기존 최소 문서·설정 자료입니다. 앱을 실행하려면 위의 전체 프로젝트 시작·완료 ZIP을 사용하세요.
다음에는 배포 URL을 확인합니다
다음 04회차는 서버에 직접 접속하지 않고 GitHub 저장소를 Vercel Production에 연결합니다. Production URL·배포된 commit·주요 화면을 확인하는 흐름으로 이어집니다.
공식 문서
본문 개편 시 OpenSSH의 원격 명령·키 인증·호스트 키 설명, OpenBSD SFTP 명령, FTPS의 TLS 구분을 대조했습니다. 확인 기준: 2026-10-15.
- OpenBSD ssh(1): 원격 명령 실행·인증·호스트 키
- OpenBSD sftp(1): 파일 전송과 로컬·원격 명령
- OpenBSD sshd_config(5): SFTP 전용 접근과 경로 제한
- RFC 4217: FTP에 TLS 적용
- OpenSSH 공식 사이트
- SSH.COM: SSH 프로토콜 소개

이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 11개 · 필수 7개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.