임팩트: 캐시 히트율 개선, 배포 후 무효화 시간 단축 — FE↔인프라 경계 설계 판단


AS-IS

개요

CloudFront의 캐싱 TTL을 개별 객체 단위로 동적으로 제어할 수 있는 기능을 구현했습니다. 클라이언트에서 요청 헤더의 Cache-Control max-age 값을 통해 각 리소스의 캐시 기간을 유연하게 설정할 수 있도록 개선했습니다.

CloudFront TTL 정책

현재 CloudFront 설정:

  • 최소 TTL: 1초
  • 최대 TTL: 1년
  • 기본 TTL: 1일

기존 구조 및 문제점

현재 아키텍처

type: flow-horizontal
title: AS-IS 아키텍처
labels:
  - Client
  - CloudFront
  - ALB
  - Thumbor

발견된 문제

클라이언트에서 요청 헤더에 Cache-Control max-age 값을 설정하여 전송했지만, CloudFront의 캐싱 TTL이 변경되지 않는 문제가 발생했습니다.

원인 분석

CloudFront는 오리진의 응답 헤더에 포함된 Cache-Control max-age 값을 참조하여 TTL을 설정합니다. 즉, 클라이언트의 요청 헤더가 아닌 Thumbor 서버의 응답 헤더를 기준으로 캐싱 정책이 결정됩니다.

TO-BE

해결 방안

구현 전략

  1. 요청 헤더 전달: CloudFront에서 모든 요청 헤더를 오리진에 그대로 전달하도록 설정
  2. 중간 프록시 서버 구축: ALB와 Thumbor 사이에 Nginx 프록시 서버를 배치
  3. 헤더 변환 로직: 요청 헤더의 max-age 값을 응답 헤더로 변환

새로운 아키텍처

  1. Client
  2. CloudFront
  3. ALB
  4. Nginx (프록시)
  5. Thumbor

AS-IS (기존)

장점

  • 단순한 아키텍처
  • 관리 포인트 적음

고려할 점

  • 클라이언트에서 개별 TTL 제어 불가
  • 모든 리소스에 동일한 기본 TTL 적용
  • 배포 후 캐시 무효화 시간 길어짐

TO-BE (개선)

장점

  • 클라이언트에서 개별 객체 TTL 동적 제어 가능
  • 리소스 특성에 따른 유연한 캐싱 정책
  • 기존 Thumbor 서버 변경 없이 구현

고려할 점

  • Nginx 프록시 레이어 추가로 홉 증가
  • Nginx 서버 운영/모니터링 필요

구현 과정

1. CloudFront 설정 변경

CloudFront 배포 설정에서 모든 요청 헤더를 오리진에 전달하도록 구성했습니다.

2. Nginx 프록시 서버 구성

ALB와 Thumbor 서버 사이에 Nginx를 배치하여 다음 역할을 수행하도록 설정했습니다:

  • 클라이언트 요청 헤더에서 Cache-Control max-age 값 추출
  • Thumbor 서버로 이미지 리사이징 요청 전달
  • Thumbor 응답을 받아 응답 헤더에 Cache-Control max-age 추가
  • 수정된 응답을 ALB로 반환

3. 헤더 변환 로직

Nginx에서 요청 헤더의 캐시 제어 값을 응답 헤더로 변환하는 로직을 구현했습니다.

최종 프로세스 플로우

  1. 1. 클라이언트: Cache-Control max-age=3600 헤더 설정
  2. 2. CloudFront: 요청 헤더를 그대로 오리진에 전송
  3. 3. ALB: 요청을 Nginx 프록시로 라우팅
  4. 4. Nginx: max-age 값 추출 → Thumbor에 리사이징 요청
  5. 5. Thumbor: 리사이징된 이미지 반환
  6. 6. Nginx: 응답에 Cache-Control max-age=3600 헤더 추가
  7. 7. CloudFront: 오리진 응답 max-age로 TTL 설정 후 캐싱

구현 결과

✅

동적 캐시 제어

클라이언트에서 개별 객체의 캐시 기간을 동적으로 제어 가능

✅

유연한 TTL 설정

CloudFront TTL 정책 범위 내에서 유연한 캐싱 설정

✅

최소 침입적 구현

기존 Thumbor 서버 로직 변경 없이 기능 구현

🔧

확장성

다양한 캐시 정책을 유연하게 적용 가능

📊

캐시 히트율 개선

리소스별 최적 TTL로 캐시 적중률 향상

⚡

배포 무효화 단축

배포 후 캐시 갱신 시간을 개별 제어로 최소화

향후 개선 방안

  1. 모니터링 강화: 캐시 적중률 및 TTL 설정 현황 모니터링
  2. 설정 검증: 클라이언트에서 설정한 max-age 값의 유효성 검증 로직 추가
  3. 로깅 개선: 캐시 제어 관련 상세 로그 수집 및 분석

결론

클라이언트 요청 헤더를 통해 CloudFront 캐싱 TTL을 개별 제어하는 기능을 성공적으로 구현했습니다. Nginx 프록시를 활용한 헤더 변환 방식으로 기존 시스템에 미치는 영향을 최소화하면서도 유연한 캐시 제어가 가능한 구조를 완성했습니다.