프로덕트버전에서 fetch시 CORS 이슈(nextjs, aws -S3, cloud front)

sangwoo noh·2024년 9월 29일
0

AWS

목록 보기
31/32

"일반적으로 그냥 get해서 데이터 바인딩할때는 문제 없었는데 fetch시에 CORS문제가 생기면 헤더를 강제로 오버라이딩 할 수 없어서
cloud front에서 이것을 해결하는 과정이다"를 chatGPT가 정리한 내용:

네, 귀하의 설명은 정확합니다. 이 내용을 서론에 추가하면 문제의 배경을 더 명확히 설명할 수 있을 것입니다. 다음과 같이 서론을 구성할 수 있습니다:
서론:
S3(Simple Storage Service)는 AWS에서 제공하는 강력한 객체 스토리지 서비스로, 웹 애플리케이션에서 이미지나 파일을 저장하고 제공하는 데 널리 사용됩니다. 일반적으로 S3에서 직접 이미지를 가져와 데이터 바인딩을 할 때는 문제가 없습니다. 예를 들어, HTML의 <img> 태그나 CSS의 background-image 속성을 통해 이미지를 로드할 때는 대부분 CORS(Cross-Origin Resource Sharing) 문제가 발생하지 않습니다.
하지만 JavaScript의 fetch API나 XMLHttpRequest를 사용하여 S3의 리소스에 접근하려고 할 때 CORS 문제가 발생할 수 있습니다. 이는 브라우저의 동일 출처 정책(Same-Origin Policy) 때문입니다. fetch 요청 시 브라우저는 자동으로 Origin 헤더를 추가하지만, S3는 기본적으로 이 헤더를 인식하지 않습니다.
이 문제를 해결하기 위해 S3 버킷에 직접 CORS 설정을 하는 방법도 있지만, 이는 복잡하고 보안상 위험할 수 있습니다. 또한, 클라이언트 측에서 fetch 요청의 헤더를 강제로 오버라이딩하는 것은 브라우저의 보안 정책상 불가능합니다.
이러한 상황에서 CloudFront를 활용하면 CORS 문제를 효과적으로 해결할 수 있습니다. CloudFront는 필요한 CORS 헤더를 자동으로 추가해주며, S3와의 연동을 통해 안전하고 효율적인 리소스 제공이 가능해집니다.
이 글에서는 S3와 CloudFront를 연동하여 CORS 문제를 해결하고, 웹 애플리케이션에서 효율적으로 이미지를 제공하는 방법에 대해 상세히 알아보겠습니다.
이렇게 서론을 구성하면 문제의 배경, 발생 원인, 그리고 해결 방향을 명확히 제시할 수 있습니다.

1. 배경

S3(Simple Storage Service)는 AWS에서 제공하는 확장성 높은 객체 스토리지 서비스입니다.
웹 애플리케이션에서 이미지나 파일을 저장하고 제공하는 데 자주 사용됩니다.

2.문제점

S3에서 직접 이미지를 가져올 때 CORS(Cross-Origin Resource Sharing) 문제가 발생할 수 있습니다.
특히 fetch API를 사용할 때 origin 헤더가 없어 CORS 정책을 위반하게 됩니다.
S3 버킷에 CORS 설정을 하는 것은 복잡하고 보안상 위험할 수 있습니다.

3.해결책: CloudFront 사용

CloudFront는 AWS의 CDN(Content Delivery Network) 서비스입니다.
S3와 CloudFront를 연동하면 CORS 문제를 효과적으로 해결할 수 있습니다.
CloudFront는 필요한 CORS 헤더를 자동으로 추가해 줍니다.

4. 구현 단계

a. CloudFront 배포 생성

S3 버킷을 오리진으로 설정
CORS 관련 설정 활성화

b. SSL 인증서 설정 (선택사항)

AWS Certificate Manager를 통해 무료 SSL 인증서 발급

c. S3 버킷 정책 업데이트

CloudFront를 통한 접근만 허용하도록 설정

d. 애플리케이션 코드 수정

S3 URL을 CloudFront URL로 변환하는 함수 구현
코드 예시

   export default function convertS3ToCloudFrontURL(originalURL: string): string {
     const s3Domain = process.env.NEXT_PUBLIC_S3_DOMAIN ?? ''
     const cloudFrontDomain = process.env.NEXT_PUBLIC_CLOUD_FRONT_DOMAIN ?? ''

     if (originalURL.includes(s3Domain)) {
       return originalURL.replace(s3Domain, cloudFrontDomain)
     }
     return originalURL
   }

6.장점

CORS 문제 해결
콘텐츠 전송 속도 향상
S3 버킷에 대한 직접적인 public 접근 차단으로 보안 강화
기존 데이터베이스의 URL을 수정하지 않고도 점진적으로 적용 가능

7. 주의사항

CloudFront 배포 설정 시 올바른 CORS 헤더 설정 필요
환경 변수를 통한 도메인 관리로 유연성 확보
캐싱 전략 고려 필요

8.결론:

CloudFront를 S3와 함께 사용하면 CORS 문제를 효과적으로 해결하고, 더 나은 성능과 보안을 제공할 수 있습니다. 이 방법은 특히 Next.js와 같은 현대적인 웹 프레임워크를 사용하는 프로젝트에서 유용하게 활용될 수 있습니다.

powered by chatGPT

profile
하기로 했으면 하자

0개의 댓글