Amazon S3 파일 업로드
DEXTUploadX5는 Amazon S3 서비스를 이용하여 파일을 업로드할 수 있는 기능을 제공한다.
DEXTUploadX5 제품이 S3 버킷에 파일을 업로드하기 위해서는, 서로 다른 출처끼리 통신을 허용해야 하기 때문에, 버킷에 CORS 설정을 해주어야 한다. 멀티파트 업로드 기능을 사용하기 위해서 반드시 PUT 요청 메소드와 ETag 응답헤더를 허용해야 하고, 운영 시점에는 AllowedOrigins 속성을 '*' 값으로 설정하지 않도록 주의해야 한다.
# S3 CORS configuration
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["HEAD", "GET", "PUT", "POST", "DELETE"],
"AllowedOrigins": ["*"],
"ExposeHeaders": ["ETag"]
}
]
- DEXTUploadX5와 브라우저 AWS SDK 사용하여 업로드하기
-
DEXTUploadX5는 S3 서비스로 파일을 직접 업로드하기 위해서 내부적으로 AWS SDK를 사용한다. SDK를 사용하여 업로드를 하려면 '리전, 버킷, 엑세스키, 비밀엑세스키' 정보가 필요하다. 다음은 해당 정보를 설정하는 코드를 보여준다.
// AWSS3 방식으로 설정한다. dx.setUploadMode("AWSS3"); // 설정 객체의 type 속성을 "NON-SECRET"으로 설정한 후, 나머지 값들을 설정한다. dx.setAWSS3UploadConfig({ type: "NON-SECRET", accessKeyId: "ABCD...1234", secretAccessKey: "ABCD...1234", region: "ap-northeast-2", bucket: "abc-bucket" });버킷에 올라가는 파일은 키(key)로 구분한다. 일반적으로 키 값은 파일명을 사용하지만, 이름이 같은 파일들끼리 서로 덮어쓰는 문제를 해결하기 위해서, 키 값을 좀 더 구체화할 필요가 있다. 제품은 기본적으로 키 값을 파일 이름으로 사용하며, 파일 이름이 아닌 다른 형식으로 키를 설정하기 위해서는 makeKey 속성에 키를 생성하는 함수를 설정하면 된다.
dx.setAWSS3UploadConfig({ ... // 키: 컴포넌트이름/파일이름 makeKey: item => `${item.controlId}/${item.name}` });* S3는 키 값에 '/' 문자를 넣으면 마치 폴더 구조를 가지는 것처럼 파일을 구분할 수 있다.
Amazon S3 서비스로 파일을 업로드하는 것은 업로드 방식을 AWSS3로 설정하는 것과 setAWSS3UploadConfig를 사용하여 설정을 해주는 것이 전부이며, 그 외의 특징은 OROF 또는 EXTS 모드를 사용하는 방식과 동일하다.
- Presigned URL을 사용하여 업로드하기
-
AWS SDK를 사용하여 브라우저에서 직접 S3 서비스로 파일을 업로드하는 방법은 보안상의 이유로 권장되지 않는다. '액세스키, 비밀엑세스키'와 같은 정보는 외부에 노출이 되면 안되는 정보이므로 공개된 곳에서는 사용하는 것은 위험하다. AWS의 자격증명 정보를 노출하지 않고 업로드하기 위해서는 백엔드에서 사전에 서명된 주소(presigned url)를 생성하고 그 주소를 사용하여 파일을 업로드하는 방법이 있다. 서명된 주소는 일정 시간 동안만 유효하며, 업로드를 위한 권한이 내포되어 있다. 다음은 해당 정보를 설정하는 코드를 보여준다.
// AWSS3 방식으로 설정한다. dx.setUploadMode("AWSS3"); // 설정 객체의 type 속성을 "SECRET"으로 설정하거나 생략한다. dx.setAWSS3UploadConfig({ //type: "SECRET", initURL: "https://domain/path/awss3-upload-init", signedURL: "https://domain/path/awss3-upload-geturl", completeURL: "https://domain/path/awss3-upload-complete" });initURL, signedURL, completeURL 주소가 하는 일은 다음과 같으며, 직접 구현해야 한다.
- initURL: 업로드 초기화
- signedURL: Presigned URL 생성
- completeURL: 업로드 완료 처리
플랫폼에 적합한 AWS SDK를 이용하여 서버 측에서 업로드 과정에 필요한 단계를 구현하면, 자격 증명과 같은 정보를 노출하지 않고, 파일 업로드 과정만 DEXTUploadX5가 처리하도록 할 수 있다.
Java Web Application, ASP.NET 환경에서 사용가능한 예제들이 제공되므로, 제공된 예제를 참고하여 구현하도록 한다.
-
Java 그리고 Maven을 사용하는 환경인 경우 AWS SDK를 얻는 법
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.x.x</version> </dependency> -
Java 그리고 Gradle를 사용하는 환경인 경우 AWS SDK를 얻는 법
implementation 'software.amazon.awssdk:s3:2.x.x'
-
ASP.NET 환경인 경우 AWS SDK를 얻는 법
NuGet 패키지 관리자를 사용하여 AWSSDK.S3 패키지를 설치하면, AWSSDK.Core.dll과 AWSSDK.S3.dll을 얻을 수 있다.
- 특징
-
- DEXTUploadX5는 S3 서비스에서 지원하는 멀티파트 업로드 방식을 사용하므로, 대용량 파일 업로드가 가능하다.
- 이어 올리기 기능는 최대 7일 이내에서만 유효하다. 7일은 버킷 라이프사이클에 명시된 값이다.
- 브라우저 AWS SDK를 사용하는 경우, 파일을 업로드하기 시작할 때, SDK를 다운로드하는 시간이 추가로 존재할 수 있다.
- 대용량 파일을 업로드하는 경우 chunkSize 값을 변경해야 할 수 있다. (참고: Amazon S3 multipart upload limits)
- S3로 파일을 업로드하는 경우, 진행창에 표시되는 진행률이 타 업로드 방식들에 비해 자연스럽지 않을 수 있다.
- 메타데이터도 업로드가 된다. 다만 값은 BASE64로 인코딩된다.