"Life is Full of Possibilities" - Soul, 2020

우아한테크코스

S3, AWS CloudFront(CDN) 캐시 설정의 차이점

m2ndy 2024. 9. 17. 00:12

 
 
성능 개선 중 S3와 CDN에 배포를 진행하며 캐시를 설정했다.
CDN과 S3의 데이터에 새롭게 변할 데이터가 거의 없을 것이라 판단하여 모두 캐싱 기간을 1년으로 설정해 두었다.
 
여기서 궁금한 점이 생겼는데, S3에도 캐시 기간 설정을 할 수 있고 CDN에서도 캐시 설정을 할 수 있다. 그렇다면 각 캐싱이 어디에 적용되는지 헷갈렸다😵‍💫
 
 
 
정리하자면,
 
1. S3의 max-age : 브라우저가 캐시를 저장하는 시간

  • 이때, CDN의 최소 TTL < max-age < 최대 TTL인 경우 : CDN의 캐싱 시간은 max-age
  • max-age < 최소 TTL인 경우 : CDN의 캐싱 시간은 최소 TTL
  • 최대 TTL < max-age인 경우 : CDN의 캐싱 시간은 최대 TTL

2. S3의 s-maxage : CDN이 캐시를 저장하는 시간

  • 이때, CDN의 최소 TTL < s-maxage < 최대 TTL인 경우 : CDN의 캐싱 시간은 s-maxage
  • s-maxage < 최소 TTL인 경우 : CDN의 캐싱 시간은 최소 TTL
  • 최대 TTL < s-maxage인 경우 : CDN의 캐싱 시간은 최대 TTL

3. S3에 max-age와 s-maxage가 같이 설정되어 있을 경우

  • CDN : 2번의 s-maxage 규칙을 따름
  • 브라우저 : S3의 max-age 값을 따름

 
 
참고 AWS 가이드
 
 
 
따라서 CDN의 최소 TTL이 60초, S3의 max-age가 30초일 때, 브라우저는 30초 동안 데이터를 캐싱하고 CDN은 60초 동안 캐싱한다. 30초가 지나면 브라우저는 CDN에 다시 요청을 보내게 되고, CDN에 캐싱되어 있는 데이터는 60초 동안 저장되기 때문에 캐싱된 데이터를 브라우저에 전달한다.
 

 
 
1. S3의 max-age = 30초 & CDN의 최소 TTL = 60초 일 때 30초가 지나면

30초가 지났을 때 브라우저가 웹 사이트를 방문한다면, CDN의 캐싱은 60초 동안 유효하므로 브라우저의 요청은 S3와 원본 데이터를 거치지 않고 CDN에 캐싱된 데이터를 전달받는다.
 
 
 
2. S3의 max-age = 30초 & CDN의 최소 TTL = 60초 일 때 60초가 지나면
 

 
 
60초가 지났을 때 브라우저가 웹 사이트를 방문한다면, 브라우저의 요청은 CDN을 거쳐 S3까지 간다. 이어서 S3의 캐싱도 만료되었음을 확인하고, S3에서 원본 데이터를 새롭게 받아온 뒤 S3 캐시에 저장한다. 이후 S3의 캐시에 저장된 데이터를 CDN을 거쳐 브라우저로 전달한다.
 
 
3. S3의 max-age = 60초 & CDN의 최소 TTL = 30초 일 때 30초가 지나면
 

이 경우 브라우저의 캐시는 60초로 지정되어 있지만 브라우저에서 임의로 캐시를 삭제했다고 가정해 보자.

30초가 흐른 상태에서 CDN의 캐시가 30초인 경우, 브라우저가 CDN으로 요청을 보내면 CDN의 캐시가 만료되었으므로 S3로 데이터를 요청한다. S3는 캐싱이 60초이므로 S3에 캐싱된 데이터를 CDN에 전달한다.
 
 
 
 

CDN의 캐싱 설정
S3의 메타데이터 설정

 
 
 
 
 
참고 자료
https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist
https://cloudnature.net/blog/optimizing-content-delivery-the-complete-guide-through-s3-caching-and-cloudfront