본문 바로가기

Web Application/Spring boot

[spring] Spring Boot(스프링부트) - sftp를 사용하여 원격서버 파일 다운로드 받는 방법

728x90
반응형
SMALL

FTP vs SFTP 차이점

sftp를 사용하기 전에 ftp와 sftp의 차이점을 먼저 알아보자.

 

첫번째는 ftp와 sftp는 보안적으로 차이가 있는데,

ftp의 경우 인증 및 암호화 기능이 없고 sftp ssh 프로토콜을 사용하기 때문에 기본적으로 인증 및 암호화 기능을 제공한다.

 

두번째는 기능에 차이가 있다.

ftp는 파일 전송만 가능하고, sftp는 파일 전송 뿐만 아니라 원격 서버에서 명령 실행 등 다양한 기능을 제공한다.

 

이 외에도 다른 차이점들이 존재하는데, 

보안이 중요한 경우에는 sftp를 사용하는게 좋다.


원격서버 접속

원격서버에 접속하기 위해서 JSch 라이브러리를 사용하여 접속한다.

Maven을 사용하기 때문에 아래 의존성을 pom.xml에 추가해준다.

<dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.54</version>
</dependency>

 

application.properties에 원격서버의 host, port, id, password를 정의한다.

그 다음 원격서버에 접속할 수 있는 getSftpCnannel을 클래스를 생성한다.

 

아래 getSftpCnannel는 sftp 서버에 접속하는 부분까지 구현되었다.

@Component
public class SftpConnector {
    
    @Value("${sftp.host}")
    private String host;
    
    @Value("${sftp.port}")
    private int port;
    
    @Value("${sftp.username}")
    private String username;
    
    @Value("${sftp.password}")
    private String password;
    
    
    public ChannelSftp getSftpChannel() throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession(username, host, port);
        session.setPassword(password);
        
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        
        ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
        channel.connect();
        
        return channel;
    }
}

 

파일 다운로드

원격 서버에 접속한 후에는, SFTP 채널을 가져와 원격 파일을 지정된 로컬 경로에 다운로드 한다.

@Component
public class SftpFile {
    
    @Autowired
    private SftpConnector sftpConnector;
    
    public void downloadFile(String remoteFile, String localFilePath) throws Exception {
        ChannelSftp sftpChannel = sftpConnector.getSftpChannel();
        
        File file = new File(localFilePath);
        OutputStream outputStream = new FileOutputStream(file);
        sftpChannel.get(remoteFile, outputStream);
        
        outputStream.close();
        sftpChannel.exit();
        sftpChannel.getSession().disconnect();
    }
}

 

이제 해당 downloadFile 클래스를 애플리케이션에서 호출하면 된다.

 

파일 업로드

이제 SFTP 채널을 가져와서 로컬 파일을 지정된 원격 파일 이름으로 업로드 하는 소스를 살펴보자.

 

public void uploadFile(String localFilePath, String remoteFileName) throws Exception {
    ChannelSftp sftpChannel = sftpConnector.getSftpChannel();

    File file = new File(localFilePath);
    FileInputStream inputStream = new FileInputStream(file);
    sftpChannel.put(inputStream, remoteFileName);

    inputStream.close();
    sftpChannel.exit();
    sftpChannel.getSession().disconnect();
}

 

Controller

@Controller
public class FileController {
    
    @Autowired
    private SftpFile sftpFile;
    
    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) throws Exception {
        String localFilePath = file.getOriginalFilename();
        String remoteFileName = file.getOriginalFilename();
        
        sftpFile.uploadFile(localFilePath, remoteFileName);
        
        return "redirect:/success";
    }
}
728x90
반응형
LIST