AWS를 사용하는 대부분의 웹사이트에서 이미지를 S3에서 바로 보내지 않고 CloudFront(이하 CF)를 통해서 제공합니다.
CF는 AWS 에서 제공하는 CDN 서비스입니다
S3에서 바로 보내는 것보다 비용(트래픽,GET요청)이 싸고 네트워크 속도도 더 빠릅니다.
이미지 같은 정적인 데이터 외에도 웹서버에서 보내주는 JSON 같은 동적인 데이터도 CF를 통해 제공할 수 있습니다.
AWS 공식 블로그에서도 관련 글을 찾아볼 수 있습니다
CF 사용시 아래와 같은 장점이 있습니다.
네트워크 응답이 빠릅니다
트래픽 전송 비용이 더 저렴합니다.
정적 데이터 캐싱이 가능합니다
하나의 도메인에 여러 경로를 각각 다른 원본에 매핑할 수 있습니다.
ex:
이 외에도 SSL 적용이 쉽고 ddos 방지 등의 장점이 있습니다.
CF에서 사용되는 단어 몇가지만 알면 쉽게 사용할 수 있습니다.
하나의 배포를 만들고, 사용할 원본들을 모두 등록 후 경로에 맞게 동작탭에서 매핑해주면 됩니다.
웹 서버에서 CF를 통해 데이터를 가져올 때는 ‘AllViewer’ 원본 요청 정책을 설정하는 것이 일반적입니다.
CF 응답 캐싱은 변경이 발생하지 않는 데이터에 사용하기 좋습니다.
예를 들어, RDB에서 append-only(추가만 되는 구조)의 내역 테이블이 있습니다
CREATE TABLE articles
(
id BIGINT UNSIGNED PRIMARY KEY,
writer_id BIGINT UNSIGNED NOT NULL,
created_at DATETIME NOT NULL
) comment '게시글'
;
CREATE TABLE article_histories
(
id BIGINT UNSIGNED PRIMARY KEY,
article_id BIGINT UNSIGNED NOT NULL,
title VARCHAR(255) NOT NULL,
contents MEDIUMTEXT NOT NULL,
created_at DATETIME NOT NULL,
FOREIGN KEY (article_id) REFERENCES articles (id)
) comment '게시글 변경내역'
게시글을 작성 한 후 수정하더라도 테이블에 수정(update) 없이 article_histories 테이블에 행이 하나 추가(insert)됩니다.
/article/{id}/histories/{historyId} 응답을 CloudFront에서 캐싱하면,
데이터가 수정되지 않으므로 무효화가 필요 없이 항상 최신 데이터를 받을 수 있습니다.
즉, 캐싱 이후 클라이언트의 요청은 서버에 전혀 접근하지 않고 빠르게 데이터를 가져올 수 있습니다.
원본 데이터가 수정된 경우, 무효화 기능이 있지만 비용이 발생하고 느립니다. (1회당 0.005 USD = 약 7원)
데이터가 바뀔때마다 무효화 기능을 사용하기엔 무리가 있습니다.
대신, 버전을 나타내는 쿼리 파라미터를 활용하는 것이 일반적입니다.
CloudFront는 기본적으로 URL의 Path가 다르면 다른 데이터로 판단하여 원본을 다시 조회합니다.
또한 설정을 통해 Header나 Query 문자열, Cookie 값이 달라도 다른 데이터로 판단하도록 할 수 있습니다.
가장 다루기 쉬운 Query 문자열로 원하는 파라미터(_v)를 설정합니다.
위 처럼 설정하는 경우 아래 두 요청은 Path는 동일하지만 _v 쿼리가 다르므로 다른 데이터로 판단합니다.
• /article/1234?_v=1
• /article/1234?_v=2
수정이 발생할 때마다 _v를 1씩 증가시키거나 하는 방법으로 최신 데이터를 조회할 수 있습니다.
하지만 _v 값을 어딘가에 저장한 후 요청할 때마다 조회해야 하는 단점이 있습니다.