ftplib storbinary와 FTPS 연결 시 무한 대기 문제 해결하기
Python의 ftplib를 사용하여 FTPS로 파일을 업로드할 때 storbinary 메서드가 완료되지 않고 무한 대기하는 문제가 발생할 수 있습니다. 이 글에서는 이 문제의 원인과 해결 방법을 살펴보겠습니다.
1. 문제 상황
FTPS를 사용하여 파일을 업로드할 때, 파일 전송이 완료된 후에도 storbinary 메서드가 반환되지 않고 계속 대기하는 현상이 발생합니다[1].
2. 주요 원인
- Python의 SSLSocket 클래스가 서버로부터 데이터를 기다리며 SSL 연결 해제를 시도하지만, 서버가 이에 응답하지 않는 문제[1]
- 특정 FTP 서버(예: Microsoft FTP 서버)와의 호환성 문제[1]
- 소켓 타임아웃 설정 부재[2]
3. 해결 방법
3.1 타임아웃 설정
FTP 연결 생성 시 타임아웃을 설정합니다[2]:
ftp = ftplib.FTP(host, username, password, timeout=10)
3.2 storbinary 메서드 수정
ftplib.py 파일의 FTP_TLS.storbinary() 메서드에서 conn.unwrap() 호출을 제거하거나 수정합니다[1].
3.3 사용자 정의 FTP_TLS 클래스 생성
SSL 세션을 재사용하는 사용자 정의 FTP_TLS 클래스를 만듭니다[3]:
class MyFTP_TLS(ftplib.FTP_TLS):
def ntransfercmd(self, cmd, rest=None):
conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
if self._prot_p:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session)
return conn, size
4. 추가 팁
- FTP 서버 로그를 확인하여 문제의 원인을 파악합니다[3].
- Python 버전에 따라 문제가 다르게 나타날 수 있으므로, 최신 버전의 Python을 사용해 봅니다[4].
- AWS Lambda와 같은 특정 환경에서는 추가적인 설정이 필요할 수 있습니다[4].
결론
ftplib의 storbinary 메서드와 FTPS 연결 시 발생하는 무한 대기 문제는 주로 SSL 연결 해제 과정과 관련이 있습니다. 타임아웃 설정, 메서드 수정, 또는 사용자 정의 클래스 사용 등의 방법으로 이 문제를 해결할 수 있습니다. 서버 유형과 환경에 따라 최적의 해결책이 다를 수 있으므로, 각 상황에 맞는 방법을 선택하여 적용하시기 바랍니다.