AWS Presigned URL

GreenBean·2023년 1월 18일
0
post-thumbnail

Presigned URL

  • 이미지 ∙ 동영상 업로드 기능 및 CDN 은 이미지나 동영상을 제공하는 서비스에서는 너무나 필수적으로 사용되고 있는 플랫폼
    • 다만 인증된 사용자만 업로드 기능하게 한다던지 넷플릭스 처럼 유료 회원만 특정 컨텐츠를 시청하게 한다던지 하려면 꽤 많은 부분을 고려하여 개발 해야 함
    • AWS 에서는 Presinged URLSigned URL 을 제공하여 이러한 니즈들을 보다 빠르게 구현할 수 있음

Tip! 추가 내용

  • 클라이언트에서 S3에 파일을 업로드 하는 방법으로는 크게 2가지 존재
    1. AWS SDK 를 이용해 직접 업로드
    2. API 서버에 파일을 전달하고 API 서버에서 S3 에 업로드
  • 1번의 방법은 서버를 거치지 않지만 AWS SDK 를 써서 S3 이용이 가능해야 하기 때문에 브라우저에서 AWS SDK 를 사용하는 시점에 AWS Access Key 와 Secret Key 정보를 알고 있어야 함
    • 이는 Key 정보가 브라우저에서 노출될 수 있고 악성 해커가 이를 이용하면 S3 리소스를 탈취해 갈 수 있는 위험성이 있음
  • 2번의 방법은 API 서버에서 파일을 업로드하기 때문에 AWS Access Key 와 Secret Key 정보를 서버가 가지고 있어 Key 정보가 노출되는 위험은 없음
    • 이때 파일을 업로드하면 파일 전달 흐름이 브라우저 → 서버 → S3 순으로 되게 되는데 이는 저장하지도 않을 파일들이 서버를 통해 가면서 불필요한 서버의 리소스를 사용하게 됨
    • 또한 과도한 업로드 작업이 생기면 서버에 과부하가 걸리게 되고 서버를 한 번 거쳐가는 지연시 간이 생기게 됨
  • 결국 위 두 가지 방법 모두 가능하지만 단점이 존재
    • 이러한 단점을 보완하기 위해 AWS 에서는 S3 에 객체를 업로드하고 다운로드하기 위한 방법으로 Presigned URL 기능을 지원하고 있음

Presigned URL 이란?

  • 미리 서명된 URL 의 생성자가 해당 객체에 대한 액세스 권한을 보유할 경우 미리 서명된 URL 은 URL 에서 식별된 객체에 대한 액세스를 부여
    • 즉, 객체를 업로드하기 위해 미리 서명된 URL 을 수신하는 경우 미리 서명된 URL 의 생성자가 해당 객체를 업로드하는 데 필요한 권한을 보유하는 경우에만 객체를 업로드할 수 있음
  • 모든 객체 및 버킷은 기본적으로 비공개
    • 사용자∙고객이 특정 객체를 버킷에 업로드할 수 있기를 원하는 경우 미리 서명된 URL 이 유용하지만 AWS 보안 자격 증명 또는 권한을 요구하지는 않음
  • 미리 서명된 URL을 생성하는 경우 보안 자격 증명을 제공한 후 버킷 이름∙객체 키∙HTTP 메서드 ( 객체 업로드 PUT ) 및 만료 날짜∙시간을 지정해야 함
    • 사전 서명된 URL 은 지정된 기간 동안만 유효
    • 즉, 만료 날짜 및 시간 전에 작업을 시작해야 함
    • 작업이 멀티 파트 업로드와 같이 여러 단계로 구성된 경우 만료 전에 모든 단계를 시작해야 함

Tip! 추가 내용

장점

  • 파일 업로드 할 때 네트워크 대역폭이나 별도 앱을 제작하지 않는다는게 큰 장점
    • 자체 구현한다고 가정하면 오리진 서버 ∙ 업로드 서버 및 네트워크 대역폭 등 신경 쓸게 많지만 미리 서명된 URL 을 사용하면 앱 서버에서는 Presigned URL 만 클라이언트에게 던져주고 실제 파일 업로드는
      클라이언트에서 진행되기 때문에 트래픽 및 대역폭을 신경쓰지 않아도 됨

Tip! 추가 내용

  • 이미지 업로드는 매우 부하가 큰 작업
    • 이미지 파일 용량 자체가 매우 크기 때문에 JSON 을 주고 받는 일반 API 요청에 비하면 훨씬 부하가 큼
    • 따라서 이미지 업로드가 백엔드 서버를 거치게 되면 백엔드 서버가 금방 다운될 수 있음
    • 혹은 동시 업로드 요청수를 제한해야될텐데 이건 유저 경험이 좋지 않음
  • 프론트에서 바로 S3 와 같은 파일 저장소나 데이터베이스로 데이터를 보내지 않고 백엔드를 거치는 이유는 보안 문제
    • 아무나 업로드하고 삭제하면 안됨
    • 정해둔 규칙 안에서 데이터가 관리되어야 함
  • 일반적인 API 요청은 전달되는 데이터 양이 적기 때문에 ( 많아야 킬로바이트 단위 ) 백엔드를 거쳐서 데이터베이스에 저장되어도 괜찮지만 이미지는 보통 메가바이트 단위
  • Presigned URL 을 이용하면 이미지를 업로드할 때 백엔드 서버를 거치지 않고 클라이언트에서 바로 S3 로 업로드가 가능
    • 원래는 백엔드가 이미지를 S3 로 전달함과 동시에 보안 절차 ( AWS SDK Secret Key 활용해서 AWS S3 접속 ) 도 같이 진행됨
    • 이 과정을 분리시키는 것
    • 백엔드는 Presigned URL 생성으로 보안 절차 작업만 해주면 프론트에서 AWS S3 로 바로 업로드 가능

Signed URL 이란?

  • 인터넷을 통해 콘텐츠를 배포하는 많은 기업에서는 유료 사용자 등 일부 사용자용으로 제작된 각종 문서∙비즈니스 데이터∙미디어 스트림 또는 콘텐츠에 대한 액세스를 제한하고자 함
  • CloudFront 를 통해 이러한 프라이빗 콘텐츠를 안전하게 제공하는 방법
    • 사용자가 특별한 CloudFront 서명된 URL 또는 서명된 쿠키를 사용하여 프라이빗 콘텐츠에 액세스하도록 함
    • 사용자가 오리진 서버 ( 예시: Amazon S3 또는 프라이빗 HTTP 서버 ) 에서 직접 콘텐츠에 액세스하는 URL이 아닌 CloudFront URL 을 사용하여 콘텐츠에 액세스해야 함
    • 반드시 CloudFront URL 을 사용해야 하는 것은 아니지만 서명된 URL 또는 서명된 쿠키에 지정한 제약 조건을 사용자가 우회하지 못하도록 하려면 사용하는 것이 좋음
  • Signed UrlPresinged Url 과 비슷한 구조
    • 다만 방식이 조금 다른데 서명된 URL 로 접근하게 할것인지 서명된 쿠키로 접근하게 할 것인지 선택할 수 있음
  • 다음과 같은 경우 서명된 URL을 사용
    • 애플리케이션 설치 파일을 다운로드하는 등 개별 파일에 대한 액세스를 제한하고 싶은 경우
    • 사용자가 쿠키를 지원하지 않는 클라이언트 ( 예: 사용자 지정 HTTP 클라이언트 ) 를 사용하는 경우
  • 다음과 같은 경우 서명된 쿠키를 사용
    • HLS 형식의 비디오 파일 전체 또는 웹 사이트의 구독자 영역에 있는 파일 전체 등 제한된 파일 여러 개에 대한 액세스 권한을 제공하려는 경우
    • 현재의 URL 을 변경하고 싶지 않은 경우
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글