안녕하세요.

베스핀글로벌 클라우드 기술지원팀 이주원 입니다.



고객사 기술지원 문의 중 "시스템 개발 중 클라이언트 화면에서 직접 S3에서 객체를 다운로드 하기 위해 AWS에서 제공하는 Node.js SDK API 를 사용하여 다운로드 시

URL을 통해 가져오는데 이 때 다운로드가 되지 않고 미리보기 형태만 보여진다" 는 문의가 들어왔습니다.



오늘은 자주 사용하는 AWS의 Simple Storage Service (S3) 의 퍼블릭 접근과 제공하는 URL에 대해 간단히 알아보려 합니다.



우선, AWS S3 서비스의 퍼블릭 접근 권한을 구성하는 방법은 이전에 솔루션을 통해 소개했으니 넘어가겠습니다.

[AWS] Amazon S3 Bucket Public Access 설정


권한 구성을 통해 S3 버킷의 객체에 대해 퍼블릭 접근이 가능하게 되면 해당 객체 URL을 통해 어디서든 퍼블릭 하게 접근할 수 있습니다.

이러한 URL은 보통 사용자들이 브라우저를 통해 URL을 요청하게 되며 해당 URL의 경로를 따라 객체 정보를 응답하게 됩니다.


[S3 서비스에서 버킷-객체의 URL 복사]



위와 같이 S3 객체의 URL을 통해 브라우저로 접근하게 되면

브라우저에서 호환되는 파일의 형태일 경우 읽기(열기)형태로 브라우저에서 파일을 읽어 옵니다.


단순하게 생각하면 웹브라우저 또한 웹서버들에서 제공하고 있는 여러가지 형태의 파일들을 읽어오는 프로그램이며 S3 또한 서버의 역할로서 객체를 제공하는 것이기 때문이죠.





Question.


서버사이드 Node.js를 이용해 페이지에 해당하는 파일의 다운로드url을 발행하여 화면쪽에서 파일을 다운로드하려고 합니다만 왜인지 자꾸 파일미리보기만 되며 다운로드는 되지 않습니다.


(

 params = { Bucket, Key, Expires }

 url = s3.getSignedUrl('getObject', params) 

)




Answer.


위와 같은 고객의 문의 중 잘못이해하신 부분이 설명드린 URL 부분과 같습니다.

현재 고객님이 다운로드를 위해 URL을 가져오는 API 로 사용하신 s3.getSignedURL() 은 다운로드 URL 이라기 보다는 GetObject 를 위한 URL을 가져오는 것입니다.

또한, SignedURL 이란 해당 API 를 호출한 서버의 자격증명으로 임시 서명된 URL을 가져오는 것이지요.


따라서 퍼블릭하게 접근권한을 열어두지 않더라도 위와 같이 접근가능한 자격증명에서 일시적인 SignedURL을 가져와 Client가 해당 URL로 S3 의 객체를 Get 할 수 있는 것입니다.


다만 고객이 문의주신 다운로드 되지않고 미리보기만 된다 의 이유는 위와 같이 해당 URL이 객체의 URL이기 때문에 브라우저에서 URL을 바로 사용할 경우 브라우저에서 읽을 수 있는 형태의 파일이라면 바로 파일이 읽어지기 때문입니다.


브라우저에서 읽을 수 없는 파일 형태인 경우에는 다운로드를 할 수 있습니다.


[S3 버킷의 'test.txt' 객체 URL을 브라우저로 접근 시]




[S3 버킷의 'test.zip' 객체 URL을 브라우저로 접근 시]






고객님 같은 경우 node.js에서 S3의 객체를 바로 다운로드 하기 위해서는 getSignedURL() 이 아닌 S3의 객체를 불러와 파일시스템에 write로 해당 파일을 직접 경로를 주어 쓰기(다운로드) 방법으로 사용하거나

axios 와 같은 모듈을 통해 URL을 다운로드 할 수 있게 사용해야 합니다.


 -  Node.js 에서 파일 다운로드 : https://acloud24.com/blog/download-file-from-s3-using-node-js/
 -  AXIOS 를 통한 URL 다운로드 : https://dev.to/ldsrogan/aws-sdk-with-javascript-download-file-from-s3-el2





S3는 접근성이 좋은 자주 사용하는 서비스 이지만 접근에 대한 개념 또는 기능들에 대해 간혹 잘 모르시는 분들이 있어 포스팅하였습니다.


도움이 되셨기를 바랍니다.




감사합니다.


베스핀글로벌 클라우드기술지원팀

이주원