ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AWS] S3 퍼블릭 접근, S3에서의 URL 이란
    공부/Cloud 공부 2026. 1. 6. 16:03

    1. Public Access S3란?

    • S3의 설정 중 하나로 별도의 계정,비밀번호 입력 과정을 거쳐서 접근하지 않아도 URL을 식별을 통해
      URL만 가지고 있다면 누구나 접근 가능한 저장소로 만드는 옵션이다. 

        

    2. 언제 사용될까?

    기능 활용 사례 설명
    이미지/영상서버 블로그나 커뮤니티 게시판에 들어가는 사진들을 저장하고 보여줄 때
    공공 데이터 공유 누구나 다운로드 받아야 하는 매뉴얼, 오픈 소스 데이터셋 배포 시
    프론트엔드 배포 React, Vue 같은 프레임워크로 만든 웹사이트를 인터넷에 공개할 때

    3. Public Access URL 구조 

    • 설정을 통해 퍼블릭 접근이 가능해지면, 객체 URL을 통해 어디서든 접근이 가능해진다.
    • 이런 URL은 보통은 사용자들이 브라우저를 통해 URL을 요청하게되며, 해당URL의 경로를 따라서 객체 정보를 응답하게 된다.

    버킷-객체 URL복사

    • 브라우저는 웹 파일 뷰어로 URL을 통해 들어온 응답 데이터가 자신이 해석할 수 있는 형태(HTML, 이미지, PDF, 텍스트 등)라면 서버(S3)로부터 데이터를 받아 화면에 바로 렌더링(열기)합니다.
    •  S3 객체 URL로 접근하는 것은 웹 서버에 파일을 요청하는 것과 같습니다. S3는 요청받은 객체의 정보를 응답할 뿐, 이를 강제로 '다운로드'하게 만들지는 않습니다.

    4. 파일이 다운로드가 실패하는 이유

    서버사이드 Node.js를 이용해 페이지에 해당하는 파일의 다운로드url을 발행하여 화면쪽에서 
    파일을 다운로드하려고 합니다만 왜인지 자꾸 파일미리보기만 되며 다운로드는 되지 않습니다.
    
    
    
    (
    
     params = { Bucket, Key, Expires }
    
     url = s3.getSignedUrl('getObject', params) 
    
    )

     

    위 배경을 이해하고, 참고한 글의 예시상황을 통해 왜 실패하는지 체크해보자
    s3.getSignedUrl()방식은 '다운로드 전용 URL'를 생성하는 기능이 아니다.

    GetObject의 본질은 특정 객체에 접근할 수 있는 권한이 담긴 임시 서명 URL을 생성하는 기능

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

     

    따라서 퍼블릭하게 접근 권한을 열어두지 않더라도 위 방법을 통해 접근가능한 자격증명에서 일시적인 SignedURL을 가져와

    Client가 해당 URL로 S3의 객체를 Get 할 수 있는 것이다. 

     

    그렇다면 왜 다운로드는 실패하고 미리보기가 될까?

     

    이렇게 이미지파일의 경우 미리보기가 되버린다.

    그건 URL이 객체의 URL이기 때문에 브라우저에서 URL을 바로 사용할 경우 브라우저에서 읽을 수 있는 형태의 파일이라면

    바로 파일이 읽어지기 때문이다. 

     

    그래서 해당 상황의 경우 node.js에서 S3의 객체를 바로 다운로드 하기 위해서는 getSignedURL() 이 아닌

    S3의 객체를 불러와 파일시스템에 write로 해당 파일을 직접 경로를 주어 쓰기(다운로드) 방법으로 사용하거나

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

     

    추가로, S3 버킷를 새로 생성할 때 퍼블릭 정책을 설정해도 파일에 대해서 접근이 거부가된다.

    이유는 정책으로 허용을 명시하지 않은 경우 AWS의 기본 상태는 거부를 우선하기 때문에 따라서 접근이 거부된다.

    이런 경우에는 아래와 같이 정책을 생성하여 적용하면 된다. 

     

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Statement1",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::s3이름/*"
            }
        ]
    }

     

     

     

     

    참고한 글 

    베스핀 글로벌 테크노트

    '공부 > Cloud 공부' 카테고리의 다른 글

    [AWS] AWS Config 정리  (1) 2026.01.07
    [AWS] AWS CLI 사용방법  (0) 2025.12.24
    [AWS] AWS IAM(Identity and Access Management), Policy  (0) 2025.12.24
    [AWS] Cloud Trail 란?  (0) 2025.12.22
    [Terraform] 테라폼 Data block (9)  (0) 2025.11.18
Designed by Tistory.