파일 전송 프로토콜(FTP)은 오래된 기술이지만, 여전히 유용하게 활용될 수 있습니다. 현대적인 보안 기능이 부족하지만, 때로는 불가피하게 사용해야 할 상황이 있습니다. 이 글에서는 FTP를 안전하게 사용하는 방법에 대해 알아보겠습니다.
주의: 인터넷을 통한 FTP 사용은 피해야 합니다.
FTP(파일 전송 프로토콜)는 1970년대 초에 개발되었으며, 보안을 염두에 두지 않고 설계되었습니다. 암호화를 사용하지 않기 때문에 사용자 이름, 비밀번호, 전송되는 데이터가 일반 텍스트로 전송됩니다. 이는 네트워크를 통해 전송되는 정보를 누구나 쉽게 볼 수 있다는 것을 의미합니다. 그러나 FTP는 여전히 내부 네트워크 환경에서 사용하기에 적합한 측면이 있습니다.
만약 네트워크 내에서 파일을 전송하는 경우, 네트워크 보안이 적절히 갖춰져 있다면 전송 과정에서 민감한 정보가 노출될 위험은 적습니다. 파일이 기밀성이 낮거나 민감하지 않다면 내부 네트워크에서 FTP를 사용하여 파일을 이동하는 것이 효율적일 수 있습니다. 특히 Linux 시스템에서는 표준 명령줄 프로그램인 ‘ftp’를 통해 이러한 작업을 수행할 수 있습니다.
하지만 인터넷을 통해 외부 리소스에 접근하기 위해 ‘ftp’ 명령을 사용하는 것은 매우 위험합니다. 이럴 때는 반드시 명령줄 프로그램인 ‘sftp’를 사용해야 합니다. ‘sftp’는 보안 SSH 파일 전송 프로토콜을 사용하여 데이터를 암호화하여 전송하므로 보다 안전합니다. 이 튜토리얼에서는 ‘ftp’와 ‘sftp’ 두 가지 프로그램 모두를 살펴보겠습니다.
인터넷을 통해 FTP를 사용하면 안 되는 이유를 명확히 보여주는 예시를 살펴보겠습니다. 아래 스크린샷을 보면 FTP 암호가 일반 텍스트로 노출되어 있습니다. 이는 네트워크상에서 누구나 비밀번호가 “MySecretPassword”라는 것을 쉽게 알 수 있다는 의미입니다.
암호화가 없기 때문에 악의적인 사용자는 파일 전송 중에 다운로드하거나 업로드하는 파일을 변조할 수도 있습니다.
‘ftp’ 명령어 사용법
FTP 서버에 유효한 계정이 있다고 가정하고, 다음 명령어를 사용하여 연결할 수 있습니다. 이 글에서 사용되는 IP 주소는 연결하려는 FTP 서버의 IP 주소로 대체해야 합니다.
ftp 192.168.4.25
주의: ‘ftp’ 명령어는 신뢰할 수 있는 로컬 네트워크 내 서버에 연결할 때만 사용해야 합니다. 인터넷을 통해 파일을 전송해야 할 때는 아래에 설명된 ‘sftp’ 명령어를 사용해야 합니다.
FTP 서버는 연결이 성공하면 환영 메시지를 표시합니다. 환영 메시지의 내용은 서버마다 다를 수 있습니다. 그 다음에는 로그인하려는 계정의 사용자 이름을 입력하라는 메시지가 표시됩니다.
연결하려는 서버의 IP 주소와 함께 현재 Linux 사용자 이름이 표시됩니다. 만약 FTP 서버의 계정 이름이 Linux 사용자 이름과 동일하다면, Enter 키를 눌러 바로 진행할 수 있습니다. 이는 Linux 사용자 이름을 FTP 서버 계정 이름으로 사용하겠다는 의미입니다. 만약 Linux 사용자 이름과 FTP 계정 이름이 다르다면, FTP 계정 이름을 입력한 후 Enter 키를 눌러야 합니다.
FTP 서버 로그인
이제 FTP 서버 계정의 비밀번호를 입력하라는 메시지가 표시됩니다. 비밀번호를 입력하고 Enter 키를 누릅니다. 비밀번호는 화면에 표시되지 않습니다. FTP 사용자 계정 이름과 비밀번호가 FTP 서버에서 확인되면 FTP 서버에 로그인됩니다.
‘ftp>’ 프롬프트가 표시됩니다.
파일 검색 및 가져오기
먼저 FTP 서버에 있는 파일 목록을 확인하는 것이 좋습니다. ‘ls’ 명령어를 사용하면 파일 목록을 얻을 수 있습니다. 사용자는 ‘gc.c’라는 파일이 FTP 서버에 있음을 확인하고, 이 파일을 자신의 컴퓨터(FTP 용어로 “로컬 컴퓨터”)로 다운로드하려고 합니다.
파일을 가져오는(또는 “get”) 명령어는 ‘get’입니다. 따라서 사용자는 ‘get gc.c’ 명령어를 실행합니다. ‘get’, 공백, 가져오려는 파일 이름 순서대로 입력합니다.
FTP 서버는 파일을 로컬 컴퓨터로 전송하고, 전송이 완료되었음을 확인하는 메시지를 표시합니다. 파일 크기와 전송에 소요된 시간도 함께 표시됩니다.
ls
get gc.c
한 번에 여러 파일을 가져오려면 ‘mget'(다중 가져오기) 명령어를 사용합니다. ‘mget’ 명령어는 각 파일을 다운로드할지 여부를 확인하는 메시지를 표시합니다. 다운로드하려면 ‘y’를, 다운로드하지 않으려면 ‘n’을 입력하여 응답합니다.
파일 개수가 많으면 이 과정이 번거로울 수 있습니다. 따라서 관련 파일 묶음은 보통 하나의 ‘tar.gz’ 또는 ‘tar.bz2’ 파일로 FTP 서버에 저장됩니다.
mget *.c
FTP 서버에 파일 업로드
FTP 계정에 부여된 권한에 따라 파일을 서버에 업로드(또는 “put”)할 수 있습니다. 파일을 업로드하려면 ‘put’ 명령어를 사용합니다. 이 예시에서는 사용자가 ‘Songs.tar.gz’ 파일을 FTP 서버에 업로드하고 있습니다.
put Songs.tar.gz
예상대로 FTP 서버에 여러 파일을 한 번에 업로드하는 명령어가 있습니다. 바로 ‘mput'(다중 넣기) 명령어입니다. ‘mput’ 명령어는 ‘mget’ 명령어와 마찬가지로 각 파일을 업로드할 때 ‘y’ 또는 ‘n’으로 확인을 요청합니다.
파일 세트를 ‘tar’ 아카이브로 묶어 전송하는 방법이 파일 가져오기 시에도 유용한 것처럼, 파일 업로드 시에도 동일하게 적용됩니다. 사용자는 다음 명령어를 사용하여 여러 ‘.odt’ 파일을 업로드하고 있습니다.
mput *.odt
디렉토리 생성 및 변경
FTP 서버의 사용자 계정에 허용된 권한이 있다면 디렉토리를 생성할 수 있습니다. 디렉토리를 생성하는 명령어는 ‘mkdir’입니다. ‘mkdir’ 명령어로 생성한 모든 디렉토리는 로컬 컴퓨터가 아닌 FTP 서버에 생성된다는 점을 명심해야 합니다.
FTP 서버의 디렉토리를 변경하려면 ‘cd’ 명령어를 사용합니다. ‘cd’ 명령어를 사용해도 ‘ftp>’ 프롬프트가 새로운 현재 디렉토리를 반영하여 변경되지는 않습니다. 현재 디렉토리를 확인하려면 ‘pwd'(작업 디렉토리 인쇄) 명령어를 사용해야 합니다.
사용자는 ‘music’이라는 디렉토리를 생성하고, 그 새로운 디렉토리로 이동한 후 ‘pwd’ 명령어를 사용하여 현재 위치를 확인하고, 해당 디렉토리에 파일을 업로드합니다.
mkdir music
cd music
pwd
put songs.tar.gz
현재 디렉토리의 상위 디렉토리로 빠르게 이동하려면 ‘cdup’ 명령어를 사용합니다.
cdup
로컬 컴퓨터에 접근
로컬 컴퓨터의 디렉토리를 변경하려면 ‘ftp>’ 프롬프트에서 ‘lcd’ 명령어를 사용할 수 있습니다. 하지만 로컬 파일 시스템 내에서 자신의 위치를 추적하는 것은 쉽지 않을 수 있습니다. 로컬 파일 시스템에 접근하는 더 편리한 방법은 ‘!’ 명령어를 사용하는 것입니다.
‘!’ 명령어는 로컬 컴퓨터에 대한 셸 창을 엽니다. 표준 터미널 창에서 할 수 있는 모든 작업을 이 셸에서 수행할 수 있습니다. ‘exit’를 입력하면 ‘ftp>’ 프롬프트로 돌아갑니다.
사용자가 ‘!’ 명령어를 실행하여 로컬 컴퓨터의 셸 창으로 들어갔습니다. ‘ls’ 명령어를 실행하여 해당 디렉토리에 어떤 파일이 있는지 확인한 다음, ‘exit’를 입력하여 ‘ftp>’ 프롬프트로 돌아갔습니다.
!
ls
exit
파일 이름 변경
FTP 서버에 있는 파일의 이름을 변경하려면 ‘rename’ 명령어를 사용합니다. 여기서는 FTP 사용자가 ‘rename’ 명령어를 사용하여 파일 이름을 변경한 다음, ‘ls’ 명령어를 사용하여 변경된 디렉토리의 파일 목록을 확인합니다.
rename songs.tar.gz rock_songs.tar.gz
ls
파일 삭제
FTP 서버에서 파일을 삭제하려면 ‘delete’ 명령어를 사용합니다. 한 번에 여러 파일을 삭제하려면 ‘mdelete’ 명령어를 사용합니다. 각 파일을 삭제할 때마다 ‘y’ 또는 ‘n’으로 확인 메시지에 응답해야 합니다.
여기서는 FTP 사용자가 파일을 나열하여 이름을 확인하고, 삭제할 파일을 선택했습니다. 그 후, 모두 삭제하기로 결정했습니다.
ls
delete gc.o
mdelete *.o
‘sftp’ 명령어 사용법
IP 주소 체계에 익숙한 독자라면 위 예제에서 사용된 FTP 서버의 IP 주소 ‘192.168’은 내부 IP 주소, 즉 사설 IP 주소라는 것을 알 수 있을 것입니다. 이 글의 서두에서 언급했듯이 ‘ftp’ 명령어는 내부 네트워크에서만 사용해야 합니다.
원격 또는 공용 FTP 서버에 연결하려면 ‘sftp’ 명령어를 사용해야 합니다. 여기서는 사용자가 ‘test.trebex.net’에 있는 공개적으로 접근 가능한 FTP 서버의 ‘demo’라는 SFTP 계정에 연결할 것입니다.
연결이 설정되면 연결이 성공했음을 알리는 메시지가 표시됩니다. 또한 호스트의 신원을 확인할 수 없다는 경고 메시지가 표시됩니다. 이것은 새로운 호스트에 처음 연결할 때 나타나는 정상적인 현상입니다. 연결을 수락하려면 ‘y’를 입력합니다.
사용자 계정 이름(‘demo’)이 명령줄에 이미 입력되었으므로 사용자 계정 이름을 묻는 메시지는 표시되지 않습니다. 비밀번호만 묻는 메시지가 표시됩니다. 비밀번호를 입력하고 확인 및 수락하면 ‘sftp>’ 프롬프트가 표시됩니다.
sftp [email protected]
위에서 설명한 ‘ftp’ 명령어는 몇 가지 예외를 제외하고 SFTP 세션에서도 동일하게 작동합니다.
파일을 삭제하려면 ‘rm’을 사용합니다. (‘ftp’는 ‘delete’ 사용)
여러 파일을 삭제하려면 ‘rm’을 사용합니다. (‘ftp’는 ‘mdelete’ 사용)
상위 디렉토리로 이동하려면 ‘cd ..’를 사용합니다. (‘ftp’는 ‘cdup’ 사용)
사용자는 SFTP 세션에서 몇 가지 명령어를 사용했습니다. ‘ls’ 명령어를 사용하여 파일 목록을 확인하고, ‘cd’ 명령어를 사용하여 ‘pub’ 디렉토리로 이동했습니다. ‘pwd’ 명령어를 사용하여 현재 작업 디렉토리를 확인했습니다.
리눅스 환경에서는 파일을 전송하는 다른 방법도 있습니다. 특히 ‘scp'(보안 복사)를 사용할 수도 있지만, 여기서는 FTP 및 SFTP에 집중했습니다. 사용 시나리오에 따라 이 두 명령어는 파일 저장 및 검색 요구 사항을 충족시키는 데 유용하게 활용될 것입니다.