본문 바로가기

연재작/Network

Image 파일은 서버를 거치지 않아도 된다.

 

게시글을 업로드하는 기능을 구현하는 중에

이미지 파일이나 영상 파일, 기타 pdf 파일 등을 업로드 할 때 서버에 어떻게 주어야 할 지를 생각하고 있었다.

처음에는 blob을 통해서 파일을 blob형태( Binary large object ) 로 변환해서 서버에 직접보내고,

서버는 이 데이터를 받아서 정적 서비스에 따로 저장하는 방식을 사용해야 할 줄 알았다.

 

그런데 그게 아니였다. github나 notion등 기타 마크다운 에디터들에서 어떻게 파일을 업로드 하는지

계속 봐왔었는데, 자세히 보면 해당하는 파일을 직접 업로드하는게 아니라,

github Markdown 에디터에서 이미지를 업로드 할 경우

파일을 올렸을 때,  해당 파일이 아니라, 몇 초 뒤에 내가 모르는 링크로 변환이 된다.

 

이미지 등 정적 파일에 대한 업로드의 형식이 어떤 식으로 진행되는지를 알아보자.

 

1. 일반적인 방식

  1. 서버측으로 파일 업로드를 요청
  2. 서버측에서 비즈니스 로직을 통해 해당 파일을 CDN과 같은 정적 데이터 저장소에 보낸 후,
    이 이미지에 해당하는 서버측의 URL을 사용자에게 반환해 준다.
  3. 사용자가 해당하는 파일을 열람하고자 할 때 해당 URL(서버측의 URL)를 통해
    이미지를 서버측에 요청하고, 서버는 다시 CDN에서 이를 받아오는 방식이다.

이렇게 될 경우,

요청에 "사용자 ➡️ 서버 ➡️ CDN ➡️ 서버 ➡️ 사용자" 라는 3각 형태의 요청과 응답이 진행되며,

이후 자료를 가져올 때 또한 마찬가지로 "사용자 ➡️ 서버 ➡️ CDN ➡️ 서버 ➡️ 사용자" 의 순서가 반복되어야 한다.

서버가 처리해야 할 일이 많아지고, 불필요한 트래픽이 많아진다.

 

 

2. AWS S3가 이를 해결하는 방식 : presigned URL

 

https://aws.amazon.com/ko/s3/faqs/

Q: Amazon S3란 무엇입니까?
Amazon S3는 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있도록 구축된 객체 스토리지입니다. S3는 업계 최고 수준의 내구성, 가용성, 성능, 보안 및 거의 무제한의 확장성을 아주 저렴한 요금으로 제공하는 단순한 스토리지 서비스입니다.

 

S3는 정적인 데이터를 처리할 때 사용되는 스토리지 서버로,

앞서 설명했던 정적 파일이나 HTML, CSS, JS파일 등을 배포할 수 있는 서비스를 지원한다.

 

참고로 가용성과 성능등이 상당히 중요하기 때문에

S3는 Region 서비스이며, 지역성의 문제가 있을 수 있다.(특정 지역에서는 사용 불가능 할 수 있다고 한다.)

 

여기서 Presigned URL이라는 기능을 제공하는데,

이 방식이 위에서 설명한 4단계의 전송을 2단계로 줄여준다.

즉, 서버측이 정해둔 URL을 지정해두고, 업로드를 할 경우 서버측의 URL을 통해 접근하는 것이 아니라

바로 S3의 URL로 접근하게 된다. 즉, "사용자 ➡️ S3 ➡️ 사용자" 가 되는 것이다.

 

이는 서버의 부하를 줄여 줄 뿐만 아니라, 사용자에게도 좀 더 나은 성능과 UI을 제공한다.

또한, 유효시간을 주거나 HTTPS를 사용할 수 있기에 보안적인 측면도 보장해준다.

 

참고로 AWS CloudFront나 CloudFlare, Azure 같은 CDN 또한 Presigned URL을 사용한다고 한다.