아이엠 !나이롱맨😎
article thumbnail
반응형

 

S3는 퍼블릭 액세스 차단 기능을 이용하여 버킷 내 객체에 대한 접근을 제한 할 수 있습니다.

 

퍼블릭 액세스 차단을 활성화 하게 되면 자원을 안전하게 보호할 수 있지만, 외부에서 접근이 불가능해 s3 객체에 접근할 수 없습니다.

 

따라서 S3는 퍼블릭 액세스 차단을 하면서 외부에서 접근할 수 방법을 제공해주는데, 그 방법에 대해 알아보고자 합니다.

 

  1. Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)/다운로드(GET) 하기
  2. Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 서버를 프록시로 두어 서버에서 S3에 접근하여 다운로드(GET)하기
  3. Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 goofys를 사용하여 S3 버킷을 리눅스에 파일 시스템으로 마운트하여 다운로드(GET)하기

 


Pre-Signed-URL S3 객체 업로드/다운로드

 

Pre-Signed-URL 을 이용하여 업로드와 다운로드를 모두 진행할 수 있습니다.

 

Pre-Signed-URL 란?

정해진 시간동안 S3 객체에 접근 권한을 가질 수 있습니다. 정해진 시간이 초과되면 더 이상 접근을 할 수가 없어서 자원을 보호할 수 있습니다.

 

클라이언트 - 서버 - S3

 

Pre-Signed-URL 프로세스

  1. 클라이언트는 서버에게 pre-signed-url 을 요청합니다.
  2. pre-signed-url 를 응답해줍니다. 만약 업로드라면 pre-signed-url을 생성할 때 HttpMethod를 PUT으로, 다운로드라면 GET으로 해줍니다.
  3. pre-signed-url 를 통해 S3에 업로드 혹은 S3 객체를 다운로드를 합니다.
  4. 성공적으로 마쳤다는 응답값을 클라이언트에게 보내줍니다.

 

Pre-Signed-URL 을 사용하므로 얻을 수 있는 이점

  1. 서버를 통해 업로드하는 것이 아니라 S3로 바로 업로드하기 때문에 서버의 리소스를 절약할 수 있습니다.
  2. 퍼블릭 액세스 차단을 활성화 하면서 S3 객체에 접근이 가능합니다.
  3. AWS Pre-Sigend-URL 샘플 코드 를 제공해주기 때문에 쉽게 개발 할 수 있습니다.

 

Pre-Signed-URL 만 있으면 쉽게 업로드/다운로드가 가능하지만 아래와 같은 문제가 있을 수 있습니다.

 

Problem) 예를 들어 게시글을 작성하였는데, 글에 이미지가 있을 경우 코드가 깔끔하지 않을 수 있습니다. 왜냐하면 항상 pre-signed-url 을 통해 객체에 접근해야하기 때문에 이미지 또한 그냥 URL이 아니라 pre-signed-url로 바꿔줘야합니다.

 

→ Problem은 게시글을 불러올 때 마다 pre-signed-url 로 바꿔줘야 하기 때문에 비효율적일 수 있습니다. 이를 해결해주기 위해선 버킷을 하나 만들어서 퍼블릭 액세스를 허용해주는 방법이 있습니다. 중요한 파일일 경우는 액세스 퍼블릭이 차단된 버킷에, 이미지와 같은 파일은 액세스 퍼블릭이 허용된 버킷에 넣어줍니다. 하지만 결국 버킷을 2개 관리해야 하기 때문에 비효율적 일 수 있습니다.

 

사례별로 알아본 안전한 s3 가이드 를 참고하시기 바랍니다.

 


S3 객체 업로드는 Pre-Signed-URL , 다운로드는 프록시 서버를 통해

 

internet == S3

 

 

업로드는 pre-signed-url 을 통해 동일하게 진행되고, 다운로드만 다릅니다.

 

  1. 클라이언트가 프록시 서버에게 다운로드할 파일에 대해 요청합니다.
  2. 프록시 서버는 AWS Credential을 갖고 있기 때문에 S3 버킷에 접근이 가능하고, 객체를 가져올 수 있습니다.
  3. 가져온 객체를 클라이언트에게 전달해줍니다.

 

위 방식을 이용하게 되면 다음과 같은 이점이 있습니다.

 

  1. 서버의 인증을 통해 S3 객체를 가져올 수 있으므로, 퍼블릭 액세스 차단을 활성화 할 수 있고, pre-signed-url 가 필요 없습니다.
  2. pre-signed-url 와 같이 정해진 시간이 없으므로, 프록시 서버에게 인증받은 클라이언트라면 계속해서 객체에 접근이 가능합니다.
  3. AWS 샘플코드 을 제공해주기 때문에 쉽게 개발이 가능합니다.

 

하지만 위 방식을 이용하게 되면 늘 프록시 서버를 통해 S3 에 접근하기 때문에 속도 측면에서 느릴 수 있습니다. 프록시 서버가 S3 버킷 내 객체를 미리 가지고 있다면, 좀 더 빠르지 않을까요?

 


S3 객체 업로드는 Pre-Signed-URL , 다운로드는 goofys 를 통한 마운트

 

goofys 란?

Go로 작성된 S3 mount 패키지이며, goofys를 사용하면 S3 버킷을 리눅스에서 파일 시스템으로 마운트 할 수 있습니다.

 

goofys 를 통해 직접 개발을 해보지는 않아서 관련 글로 대체 합니다.

 

AWS S3와 goofys 연동

반응형

article prev thumbnail
article next thumbnail
profile on loading

Loading...