게시글을 업로드하는 기능을 구현하는 중에
이미지 파일이나 영상 파일, 기타 pdf 파일 등을 업로드 할 때 서버에 어떻게 주어야 할 지를 생각하고 있었다.
처음에는 blob을 통해서 파일을 blob형태( Binary large object ) 로 변환해서 서버에 직접보내고,
서버는 이 데이터를 받아서 정적 서비스에 따로 저장하는 방식을 사용해야 할 줄 알았다.
그런데 그게 아니였다. github나 notion등 기타 마크다운 에디터들에서 어떻게 파일을 업로드 하는지
계속 봐왔었는데, 자세히 보면 해당하는 파일을 직접 업로드하는게 아니라,
파일을 올렸을 때, 해당 파일이 아니라, 몇 초 뒤에 내가 모르는 링크로 변환이 된다.
이미지 등 정적 파일에 대한 업로드의 형식이 어떤 식으로 진행되는지를 알아보자.
1. 일반적인 방식
- 서버측으로 파일 업로드를 요청
- 서버측에서 비즈니스 로직을 통해 해당 파일을 CDN과 같은 정적 데이터 저장소에 보낸 후,
이 이미지에 해당하는 서버측의 URL을 사용자에게 반환해 준다. - 사용자가 해당하는 파일을 열람하고자 할 때 해당 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을 사용한다고 한다.
'연재작 > Network' 카테고리의 다른 글
웹은 당신의 눈을 속인다(2) - 실시간 (아님) (2) | 2025.03.12 |
---|---|
AWS EC2 Private Instance 구축 (2) VPC, 서브넷, IGW, 라우터 테이블 (0) | 2024.10.31 |
GET 요청 시 Body(JSON)를 사용하지 않는 이유 (2) | 2024.10.28 |
AWS EC2 Private Instance 구축 (1) Architecture (0) | 2024.10.26 |
TCP/IP 4계층, OSI 7계층, Handshaking? chatGPT와 정리 (5) | 2024.09.01 |