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
'Web Application > Spring boot' 카테고리의 다른 글
[spring] Spring Boot를 이용하여 RESTful API 개발(1) - REST, RESTful API에 대한 설명 및 REST의 제약조건과 장점 (0) | 2023.04.21 |
---|---|
[Spring] spring boot에서 MySQL 연결 - 스프링부트에서 JPA를 사용하는 방법 및 간단한 기능 구현 (0) | 2023.04.14 |
[spring] Spring Boot - Aop개념 및 사용 방법 (0) | 2023.04.06 |
[spring] ERROR - MyBatis Invalid bound statement (not found) 오류 (0) | 2023.04.06 |
[spring] 간편결제 - 카카오페이(kakao pay) 결제 api (1) - 결제취소 기능 구현 (0) | 2023.04.01 |