محدّث قبل شهر واحد
파일 전송 프로토콜(FTP)은 1970년대부터 인터넷을 통해 파일을 전송해 왔습니다. 웹이 존재하기 전, 대부분의 사람들이 인터넷이라는 말을 들어본 적도 없던 시절, 그리고 우리가 들어오는 연결을 불신하기 전부터였습니다. 두 포트 구조는 설계 당시에는 우아했지만, 이제 현대 네트워킹의 기본 전제와 충돌하고 있습니다.
FTP가 왜 두 개의 포트를 사용하는지, 그리고 왜 그것이 문제를 일으키는지 이해하면, 어떤 프로토콜이 자신이 설계된 신뢰 모델보다 오래 살아남았을 때 무슨 일이 벌어지는지 알게 됩니다.
두 개의 포트, 두 개의 채널
FTP는 제어와 데이터를 분리합니다. 포트 21은 대화를 담당합니다: 인증, LIST와 RETR 같은 명령, 디렉토리 탐색. 이 연결은 세션 내내 열려 있으며 상태를 유지합니다.
포트 20은 페이로드, 즉 실제 파일 내용, 디렉토리 목록, 바이너리 데이터를 담당합니다. 이렇게 분리해 두면 전송이 진행되는 동안에도 명령을 내릴 수 있고, 명령 세션을 방해하지 않고 데이터 연결을 맺고 끊을 수 있습니다.
포트 21의 제어 채널은 각 데이터 전송을 협상합니다: 무엇을 보낼지, 어떻게 연결할지, 어떤 포트를 쓸지. 그런 다음 데이터는 별도로 흐릅니다. 그 시대에 걸맞은 깔끔한 설계였습니다.
능동 모드: 서버가 클라이언트에게 전화를 걸던 시절
능동 FTP 모드에서는 서버의 포트 21에 접속해 인증합니다. 데이터가 필요하면 PORT 명령을 보내는데, 이는 본질적으로 "나는 포트 5001에서 기다리고 있으니 거기로 데이터를 보내줘"라는 뜻입니다.
그러면 서버가 자신의 포트 20에서 클라이언트가 지정한 포트로 새 연결을 시작합니다. 데이터가 흐릅니다. 전송 완료.
초기 인터넷에서는 이것이 완벽하게 작동했습니다. 모든 기기는 실제 IP 주소를 가지고 있었고, 네트워크는 평탄했습니다. 서버에게 접속하라고 하면 그대로 됐습니다.
그러다 우리는 곳곳에 방화벽을 세웠습니다.
PORT 명령은 FTP가 "이 번호로 나한테 연락해 줘"라고 말하는 것입니다. 방화벽 뒤에 있으면 그 콜백은 차단됩니다. 방화벽은 어떤 서버의 포트 20에서 오는 요청하지 않은 들어오는 연결을 감지하고 거부합니다. 서버는 연결에 실패했다고 판단하고, 클라이언트는 끝내 오지 않는 데이터를 기다립니다.
능동 모드 FTP는 대부분의 사용자에게 사실상 쓸모없어졌습니다. 버그 때문이 아니라, 인터넷이 더 이상 들어오는 연결을 신뢰하지 않기 때문입니다.
수동 모드: 차선책
수동 모드는 데이터 연결 방향을 뒤집습니다. PORT 대신 PASV를 보내면 서버가 자신이 기다리고 있는 IP 주소와 포트로 응답합니다. 예를 들어 "10.0.0.5 포트 52341로 나한테 연결해"라는 식입니다.
이제 클라이언트가 두 연결을 모두 시작합니다: 제어는 포트 21로, 데이터는 서버가 지정한 포트로. 클라이언트 입장에서는 두 연결 모두 나가는 연결입니다. 방화벽은 나가는 연결을 허용합니다. 문제 해결.
그런데 수동 모드도 나름의 문제를 만들어냅니다: 서버가 들어오는 데이터 연결을 위해 높은 포트 범위에서 대기해야 합니다. 일반적인 설정은 포트 50000-50100을 엽니다. 두 개가 아닌 100개의 잠재적 진입점이 생기는 셈입니다. 서버 방화벽이 이 전체 범위를 허용해야 하므로 공격 표면이 넓어집니다.
방화벽에 구멍 하나를 뚫었더니 백 개가 됐습니다.
보안 문제
FTP의 더 근본적인 문제는 포트가 아닙니다. 바로 평문입니다.
FTP 서버에 인증할 때 사용자 이름과 비밀번호가 암호화되지 않은 채로 네트워크를 오갑니다. 패킷을 캡처하는 누구든 그것을 볼 수 있습니다. 파일 내용, 디렉토리 목록, 모든 명령—지켜보는 사람이 있다면 전부 다 보입니다.
1970년대에는 이것이 문제가 되지 않았습니다. 네트워크는 신뢰할 수 있는 공간이었고, 패킷을 도청한다는 건 상상하기도 어려운 일이었습니다.
오늘날, 자격 증명을 평문으로 전송하는 것은 용납할 수 없는 일입니다. WiFi 네트워크, 공유 인프라, 정교한 공격자, 컴플라이언스 규정—신뢰할 수 있는 네트워크라는 가정은 이미 사라진 지 오래입니다.
FTP는 무결성 검증도 없습니다. TCP는 패킷이 도착하는 것을 보장하지만, 전송 중에 파일이 수정되지 않았다는 암호학적 확인 수단이 없습니다. MITM 공격자는 내용을 아무도 모르게 바꿔버릴 수 있습니다.
현대적 대안
SFTP (SSH 파일 전송 프로토콜)는 포트 22의 SSH를 통해 파일 전송을 터널링합니다. 이름이 비슷해 보이지만 완전히 다른 프로토콜입니다. 두 포트의 복잡성도, 능동/수동 모드도, 평문 자격 증명도 없습니다. 모든 것이 암호화된 SSH 세션 안에서 이루어집니다. 포트 하나, 강력한 인증, 단순한 방화벽 규칙.
FTPS는 전통적인 FTP에 TLS 암호화를 추가합니다. 명시적 FTPS는 포트 21에서 시작해 AUTH 명령으로 TLS로 전환합니다. 암묵적 FTPS는 포트 990에서 처음부터 TLS로 연결합니다. FTPS는 FTP의 작업 흐름을 유지하지만 그 복잡성도 그대로입니다. 수동 포트 범위가 여전히 필요하고, 암호화가 방화벽 검사를 방해할 수도 있습니다.
새 시스템에는 SFTP가 단연 낫습니다. FTPS는 기존 FTP 인프라와 TLS를 요구하는 컴플라이언스 규정이 있는 조직을 위해 존재합니다.
방화벽 설정
능동 모드: 클라이언트는 포트 21로 나가는 접근이 필요하고, 서버는 포트 20에서 클라이언트 임시 포트로 나가는 접근이 필요합니다. NAT 환경에서는 거의 작동하지 않습니다.
수동 모드: 클라이언트는 포트 21과 서버의 수동 포트 범위로 나가는 접근이 필요합니다. 서버는 포트 21과 수동 포트 범위로 들어오는 접근이 필요합니다.
일부 방화벽은 FTP 검사(애플리케이션 계층 게이트웨이) 기능을 제공합니다. 제어 채널을 감시하다가 데이터 연결에 필요한 포트를 동적으로 허용하는 방식입니다. 설정이 단순해질 수 있지만 암호화된 FTP 변형에서는 문제가 생기기도 합니다. 많은 관리자들이 이 기능을 끄고 포트를 직접 지정하는 방식을 선택합니다.
SFTP는 모든 것을 단순화합니다: 포트 22, 양방향, 이상.
FTP 포트에 대해 자주 묻는 질문
FTP는 왜 포트 하나 대신 두 개를 사용하나요?
FTP는 제어 트래픽(명령, 인증)과 데이터 트래픽(파일 내용)을 분리합니다. 포트 21은 대화를 처리하고, 포트 20 또는 높은 포트는 실제 전송을 처리합니다. 1970년대에는 합리적인 설계였지만, 오늘날에는 방화벽 문제를 일으킵니다.
능동 FTP는 왜 방화벽을 통과하지 못하나요?
능동 모드에서는 서버가 클라이언트로의 데이터 연결을 시작합니다. 방화벽은 기본적으로 요청하지 않은 들어오는 연결을 차단합니다. 포트 20에서 오는 서버의 연결 시도가 클라이언트에 닿기 전에 차단됩니다.
FTP는 안전하게 사용할 수 있나요?
표준 FTP는 자격 증명과 데이터를 평문으로 전송합니다. 네트워크 트래픽을 캡처할 수 있는 누구든 모든 내용을 볼 수 있습니다. 보안이 중요한 환경에서는 반드시 SFTP나 FTPS를 사용하세요.
SFTP와 FTPS의 차이점은 무엇인가요?
SFTP는 포트 22의 SSH 위에서 동작합니다. 간단한 방화벽 규칙, 강력한 암호화, 다중 포트 불필요. FTPS는 전통적인 FTP에 TLS를 추가해 두 포트 구조를 유지합니다. SFTP가 더 간단하고, FTPS는 하위 호환성을 위해 존재합니다.
هل كانت هذه الصفحة مفيدة؟