파일 전송 프로토콜

**파일 전송 프로토콜**(File Transfer Protocol, **FTP**)은 TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일 전송을 하기 위한 표준 통신 프로토콜(standard communication protocol)이다. 파일 전송 프로토콜은 TCP/IP 프로토콜 테이블의 응용 계층에 속하며, 역사는 오래 되었지만 지금도 인터넷에서 자주 사용된다.

최초의 FTP 클라이언트 애플리케이션들은 운영 체제가 그래픽 사용자 인터페이스를 갖추기 이전에 개발된 명령 줄 프로그램이었으며, 대부분의 윈도우, 유닉스, 리눅스 운영 체제에 현재도 기본 포함되어 있다. 그 뒤로 수많은 FTP 클라이언트 및 오토메이션 유틸리티들이 데스크톱, 서버, 모바일 장치, 하드웨어용으로 개발되고 있으며, FTP는 웹 페이지 편집기와 같은 생산성 응용 프로그램들에 통합되고 있다.

## FTP 서버의 역사
원래의 FTP에 대한 사양은 Abhay Bhushan이 작성하였으며, 1971년 4월 16일 RFC 114로 게시되었다. 1980년까지 FTP는 TCP/IP의 전신인 NCP 위에 실행되었다. 이 프로토콜은 나중에 TCP/IP 버전인 RFC 765 (1980년 6월), 그리고 현재의 사양인 RFC 959 (1985년 10월)으로 대체되었다. 제안된 일부 표준들은 RFC 959를 개정하였는데, 이를테면 RFC 1579 (1994년 2월)는 방화벽 친화 FTP (수동 모드)를 활성화하며, RFC 2228 (1997년 6월)은 보안 확장을 제안하며, RFC 2428 (1998년 9월)은 IPv6 지원을 추가하고 새로운 종류의 수동 모드를 정의한다.

## 프로토콜 개요
섬네일|포트 21을 사용하여 수동 연결을 시작하는 그림
HTTP와는 달리 연결의 종류는 2가지가 있다:
* **명령 연결**: 먼저 제어 포트인 서버 21번 포트로 사용자 인증, 명령을 위한 연결이 만들어지고, 여기를 통해 클라이언트에서 지시하는 명령어가 전달된다.
* **데이터 전송용 연결**: 실제의 파일 전송은 필요할 때 새로운 연결이 만들어진다.
** **능동 모드(액티브 모드)**: 서버가 자신의 데이터 포트인 20번 포트에서부터 클라이언트가 지정한 지점으로의 데이터 연결을 만든다. 클라이언트가 지정하는 포트는 주로 1023 보다 큰 번호가 매겨진 포트이다. 클라이언트가 방화벽, NAT(IP 마스킹) 등을 사용하는 환경일 때에 잘 동작하지 않을 수 있는데, 이때 수동 모드를 이용하면 된다.
** **수동 모드(패시브 모드)**: 클라이언트가 서버가 지정한 서버 포트로 연결할 수 있게 한다. 이 때에는 보통 양쪽 포트 모두 1023 보다 큰 포트를 사용한다.

어느 모드에서도 2개의 연결을 만드는 점은 다르지 않다. 하지만 FTP 포트를 변경하게 되고 방화벽이 있는 경우, 방화벽 Inspection 모드 설정에 따라 FTP 통신은 정상적이지만, get 명령이나 ls 명령 등 FTP-DATA포트를 이용한 통신은 정상적으로 이루어지지 않을 수 있다.

## 보안
FTP는 보안 프로토콜로 계획되지 않았기 때문에 수많은 보안 취약점이 존재한다. 1999년 5월에, RFC 2577 저자들은 다음의 문제에 대한 취약점을 나열하였다:
* 무차별 대입 공격
* FTP 바운스 어택
* 패킷 가로채기
* 포트 훔치기 (다음에 열릴 포트를 추측하여 적절한 연결을 빼앗는 것)
* 스푸핑 공격
* 사용자 이름 열거

파일 전송 프로토콜은 서버의 파일을 바꾸거나 지울 수 있기 때문에 전송하기 앞서 사용자 이름과 암호를 묻는 인증 과정이 필요하다. 보통 FTP에서는 암호가 암호화되지 않아 위험하기 때문에 원 타임(한 번만 묻는) 암호를 이용한 인증을 이용하며, 아니면 보안을 더욱 철저하게 하려면 아예 SFTP, SCP 등 다른 방법을 사용하여 파일을 전송한다.

## 파생
### FTPS

FTPS는 FTP 표준의 확장으로, 클라이언트가 FTP 세션이 암호화되도록 요청할 수 있게한다.

### SSH 파일 전송 프로토콜

SSH 파일 전송 프로토콜(SFTP)은 파일을 전송하고 사용자를 위한 비슷한 명령을 갖추고 있으나, 시큐어 셸 프로토콜(SSH)을 사용하여 파일을 전송한다.

### 트리비얼 파일 전송 프로토콜

### 심플 파일 전송 프로토콜
심플 파일 전송 프로토콜(Simple File Transfer Protocol, SFTP)은 RFC 913에 의해 정의되어 있다.

## FTP 명령어

## 같이 보기
* SFTP
* FTPS
* TCP 래퍼

## 참고 문헌
* RFC 697 – CWD Command of FTP. July 1975.
* RFC 959 – (Standard) File Transfer Protocol (FTP). J. Postel, J. Reynolds. October 1985.
* RFC 1579 – (Informational) Firewall-Friendly FTP. February 1994.
* RFC 1635 – (Informational) How to Use Anonymous FTP. May 1994.
* RFC 1639 – FTP Operation Over Big Address Records (FOOBAR). June 1994.
* RFC 1738 – Uniform Resource Locators (URL). December 1994.
* RFC 2228 – (Proposed Standard) FTP Security Extensions. October 1997.
* RFC 2389 – (Proposed Standard) Feature negotiation mechanism for the File Transfer Protocol. August 1998.
* RFC 2428 – (Proposed Standard) Extensions for IPv6, NAT, and Extended passive mode. September 1998.
* RFC 2577 – (Informational) FTP Security Considerations. May 1999.
* RFC 2640 – (Proposed Standard) Internationalization of the File Transfer Protocol. July 1999.
* RFC 3659 – (Proposed Standard) Extensions to FTP. P. Hethmon. March 2007.
* RFC 5797 – (Proposed Standard) FTP Command and Extension Registry. March 2010.
* RFC 7151 - (Proposed Standard) File Transfer Protocol HOST Command for Virtual Hosts. March 2014.
* IANA FTP Commands and Extensions registry – The official registry of FTP Commands and Extensions

## 각주

## 외부 링크
* 
* FTP Server Test (Online)
* FileZilla Server (Windows)
* Pure-FTPd (Unix)
* VsFTPd (Unix)
* ProFTPd (Unix)


분류:응용 계층 프로토콜
분류:인터넷의 역사
분류:인터넷 표준
분류:네트워크 파일 전송 프로토콜
분류:OS/2 명령어
분류:유닉스 네트워크 관련 소프트웨어
분류:파일 공유