Home FTP와 SFTP란 무엇일까?
Post
Cancel

FTP와 SFTP란 무엇일까?

글을 작성하게 된 계기


회사에서 정산 API를 개발 하면서 SFTP를 통해 가맹점의 데이터를 전송하게 되었고, 이 과정에서 알게 된 내용을 정리하기 위해 글을 작성하게 되었습니다.





1. FTP


FTP(File Transfer Protocol)는 네트워크 상에서 파일을 전송하기 위해 오래전부터 사용된 대표적인 표준 프로토콜입니다. FTP는 두 가지 채널을 통해 작동합니다. 먼저, 명령어나 제어 정보를 전달하기 위한 ‘제어 채널(Control Channel)’은 주로 포트 21을 사용하며, 실제 파일 데이터를 전송하는 ‘데이터 채널(Data Channel)’은 별도의 포트를 사용하여 작동합니다.

The File Transfer Protocol (FTP) is a standard communication protocol used for the transfer of computer files from a server to a client on a computer network. FTP is built on a client–server model architecture using separate control and data connections between the client and the server.



FTP의 가장 큰 장점은 프로토콜 구조가 단순하여 구현과 사용이 쉽다는 점입니다. 하지만 보안적 측면에서는 매우 취약합니다. FTP는 암호화되지 않은 상태로 데이터를 전송하기 때문에 네트워크 상에서 악의적인 사용자가 데이터를 도청하거나 가로챌 수 있습니다. 사용자의 계정 정보나 전송되는 파일 내용이 노출될 위험이 있어 중요한 정보나 민감한 데이터를 다룰 때는 사용하지 않는 것이 좋습니다.







2. SFTP


SFTP(Secure File Transfer Protocol)는 FTP의 보안적 단점을 보완하여 만들어진 프로토콜입니다. SFTP는 SSH(Secure Shell)를 기반으로 하며, 모든 데이터가 암호화되어 전송됩니다.

In computing, the SSH File Transfer Protocol, also known as Secure File Transfer Protocol (SFTP), is a network protocol that provides file access, file transfer, and file management over any reliable data stream.



SFTP의 주요 특징은 암호화, 인증 방식, 포트 관리 용이성, 플랫폼 독립성 입니다.

  • 암호화: SFTP를 이용하면 데이터는 전송 과정 전체가 암호화되므로 네트워크 상에서 중간자 공격이나 데이터 도청으로부터 안전합니다. 설령 데이터가 도청되더라도 암호화된 상태이기 때문에 실제 내용을 확인할 수 없습니다.

  • 인증 방식: SFTP는 전통적인 비밀번호 인증 방식뿐만 아니라, SSH 키 기반 인증(SSH Key-based Authentication)을 지원합니다. SSH 키 기반 인증은 공개키 암호화 방식을 사용하여 인증을 수행하므로, 비밀번호 방식보다 훨씬 더 높은 보안을 제공합니다.

  • 포트 관리의 용이성: FTP는 기본적으로 21번 포트를 사용하지만 데이터 채널용으로 추가 포트를 열어 관리가 복잡할 수 있습니다. 반면, SFTP는 SSH와 동일하게 기본적으로 단일 포트(일반적으로 22번)를 사용하기 때문에 방화벽 설정 및 네트워크 관리가 상대적으로 쉽고 안전합니다.

  • 플랫폼 독립성: SFTP는 리눅스(Linux), 윈도우(Windows), 맥OS(MacOS) 등 다양한 운영 체제에서 사용 가능한 클라이언트 및 서버 소프트웨어를 지원하며, 플랫폼에 제약 없이 폭넓게 사용할 수 있습니다.



SFTP의 동작 과정은 다음과 같습니다.

  1. 클라이언트의 연결 요청: SFTP 클라이언트가 서버의 IP 또는 도메인 주소와 포트번호(기본값은 22)를 입력하여 서버로 연결 요청을 보냅니다.

  2. 서버 인증 단계: 서버는 클라이언트에게 자신의 공개 키(Host Key)를 제공합니다. 클라이언트는 이 키가 이전 연결에서 저장된 키와 동일한지 비교하여 서버의 신원을 확인합니다. 처음 연결하는 경우 클라이언트는 사용자에게 이 키를 신뢰할지 물어보게 됩니다.

  3. 클라이언트 인증 단계: 클라이언트는 암호나 SSH 키를 사용하여 자신의 신원을 서버에 증명합니다. SSH 키 방식일 경우, 클라이언트는 개인 키를 이용하여 서명을 하고, 서버는 이 서명을 클라이언트의 공개 키로 검증하여 인증합니다.

  4. 암호화된 세션 수립: 클라이언트와 서버 간 인증이 성공하면 양자 간 암호화된 SSH 세션이 생성됩니다.

  5. 파일 전송 및 관리: 암호화된 세션을 통해 안전하게 파일을 전송하거나, 서버의 파일 시스템을 관리하는 작업(삭제, 디렉터리 생성, 이름 변경 등)을 수행할 수 있습니다.

  6. 세션 종료: 작업이 완료되면 클라이언트는 서버에 세션 종료를 요청하여 연결을 안전하게 종료합니다.



이 과정에서 Host Key Warning이 발생할 수 있습니다. 이는 클라이언트가 연결한 서버의 공개 키가 로컬에 등록된 기존 키와 일치하지 않거나, 처음 연결하는 서버의 키를 신뢰할지 확신할 수 없기 때문에 발생합니다. 이 경고는 주로 다음 두 가지 경우에 나타납니다. 이에 대한 자세한 내용은 해당 포스팅을 참조해주세요.

  • 첫 연결 시: 사용자가 최초로 서버에 연결할 때는 서버의 키 정보가 로컬에 존재하지 않기 때문에 클라이언트는 사용자에게 키를 신뢰할지 묻습니다.

  • 서버 키 변경 시: 기존에 연결했던 서버의 키가 변경되었을 때(서버 재설치, IP 변경 등) 기존에 저장된 키와의 불일치가 발생하면서 보안 경고를 표시합니다.







3. Chroot


SFTP는 보안을 더 강화하기 위해 사용자를 특정 디렉터리에 제한하는 Chroot 환경을 구성할 수 있습니다. SSH 설정 파일(sshd_config)에서 ChrootDirectory 지시어를 통해 구현됩니다. 이를 통해 사용자는 특정 디렉터리 밖으로 접근할 수 없게 됩니다.

chroot is an operation on Unix and Unix-like operating systems that changes the apparent root directory for the current running process and its children.



이는 /etc/ssh/sshd_config 파일에서 다음과 같이 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
# SFTP 전용 서브시스템 지정
Subsystem sftp internal-sftp

# SFTP 전용 사용자 또는 그룹 지정 (예: sftpusers 그룹)
Match Group sftpusers
    ChrootDirectory /Users/mac/sftp
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no





Chroot 환경을 구축할 때는 소유권 및 권한 설정, 외부 마운트된 디렉토리 에 대해 주의해야 합니다.

  • 소유권 및 권한 설정: Chroot로 지정된 최상위 디렉터리는 반드시 root 사용자가 소유하고 있어야 하며, 다른 사용자에게는 쓰기 권한이 부여되면 안 됩니다.

  • 외부 마운트된 디렉터리 문제: 네트워크 파일 시스템(NFS)이나 외부 저장소와 같이 외부에서 마운트된 디렉터리를 사용하면 쓰기 권한이나 접근 권한 설정 문제로 인해 Chroot 환경에서 정상 동작하지 않을 수 있으므로 주의해야 합니다.



3-1. 소유권 및 권한 설정

ChrootDirectory로 지정된 /Users/mac/sftp는 반드시 root가 소유해야 하고, 쓰기 권한은 root만 가져야 합니다.

1
2
sudo chown root:root /Users/mac/sftp
sudo chmod 755 /Users/mac/sftp



사용자가 파일 업로드/수정을 할 수 있도록 하위 디렉터리를 생성하고, 해당 디렉터리의 소유권은 해당 사용자에게 부여합니다.

1
2
3
sudo mkdir /Users/mac/sftp/subMalls
sudo chown sftpuser:sftpusers /Users/mac/sftp/subMalls
sudo chmod 755 /Users/mac/sftp/subMalls





3-2. 외부 마운트된 디렉터리 문제

Chroot 환경을 구성할 때, 외부 마운트된 디렉터리를 포함시키려면 해당 디렉터리가 Chroot의 요구사항(특히 소유권과 권한)을 만족하는지, 그리고 보안 및 가용성 측면에서 문제가 없는지 사전에 충분히 검토하고 테스트해야 합니다.

  1. 권한 및 소유권 문제: Chroot 환경에서는 최상위 디렉터리가 반드시 root 소유여야 하며, 쓰기 권한이 제한되어 있어야 합니다. NFS, CIFS와 같은 외부 파일 시스템은 기본적으로 파일 시스템 권한 관리 방식이 로컬 파일 시스템과 다를 수 있어, Chroot 환경의 소유권 및 권한 요건을 충족하지 못할 수 있습니다.

  2. 파일 시스템 일관성 및 보안 문제: 외부 마운트된 디렉터리는 종종 로컬 시스템과 다른 보안 정책이나 인증 메커니즘을 사용할 수 있습니다. 이로 인해, Chroot 환경 내에서 사용자가 예상치 못한 방식으로 접근할 수 있거나, 보안 격리 기능이 제대로 작동하지 않을 위험이 있습니다.

  3. 접근성 문제: 외부 마운트된 디렉터리는 네트워크 지연이나 연결 문제로 인해 Chroot 환경 내에서 안정적으로 접근이 어려울 수 있습니다. Chroot 환경 내에서 외부 자원을 사용하는 경우, 마운트 대상의 가용성과 성능을 면밀히 검토해야 합니다.







4. 정리


FTP와 SFTP에 대해 간단히 살펴보았는데요, 이를 통해 파일 전송을 하는 것은 처음이라 신기하면서도 재미있었네요.


This post is licensed under CC BY 4.0 by the author.

JPA를 사용할 때, 하나의 서버, 여러대의 데이터베이스는 어떻게 처리할까?

GROUP BY에도 종류가 있다고?