캐시 포이즈닝(Cache Poisoning)은 공격자가 악의적인 콘텐츠를 Fastly 캐시에 저장하도록 유도해, 정상적인 사용자에게도 잘못된 또는 공격자가 제어한 응답이 제공되도록 만드는 공격 방식입니다. Fastly 공식 문서에서는 이 문제가 언제 발생할 수 있는지, 그리고 어떻게 예방할 수 있는지에 대해 명확한 가이드를 제공합니다. 이번 글에서는 Fastly가 권장하는 캐시 포이즈닝 방지 전략을 정리했습니다.
1. 캐시 포이즈닝은 언제 발생하는가?
일부 백엔드 서버는 다음과 같은 헤더의 내용을 기반으로 어느 사용자에게 어떤 응답을 보낼지 혹은 어떤 보안 영역(security domain)에 해당하는지를 결정할 수 있습니다.
- X-Forwarded-Host
- X-Rewrite-URL
- X-Original-URL
문제는 이 헤더들이 공격자가 임의로 조작할 수 있는 값이라는 점입니다.
공격 가능 조건
Fastly 구성에서 이 헤더들을 백엔드로 전달하고, 동시에 이 헤더 값이 캐시 키(cache key)에 반영되지 않는 경우, 악성 공격자가 다음과 같은 방식으로 캐시를 오염시킬 수 있습니다.
공격 시나리오
- 공격자가 위 헤더들 중 하나를 조작한 요청을 보냄
- 백엔드는 이 조작된 헤더 값을 보고 공격자가 의도한 응답을 반환
- Fastly는 캐시 키에 이 헤더 정보를 포함하지 않으므로
- → 이 응답을 “정상 요청의 응답”으로 판단
- 이 잘못된 응답(공격자가 만든 응답)이 Fastly 캐시에 저장됨
- 공격자는 피해 사용자에게 “오염된 URL”을 방문하도록 유도
- 피해자는 정상 페이지 대신 캐시된 악성 콘텐츠를 전달받게 됨
즉,
백엔드가 조작 가능한 헤더를 신뢰하고,
Fastly 캐시 키가 이 헤더를 고려하지 않을 때
캐시 포이즈닝이 발생한다.
2. 캐시 포이즈닝을 어떻게 완화할 수 있는가?
1) 오리진(백엔드)에서 문제 해결
백엔드가 사용자 식별 또는 보안 영역 선택을 위해 조작 가능한 헤더(X-Forwarded-Host, X-Rewrite-URL, X-Original-URL)를 사용하고 있다면 다음 조치를 수행해야 합니다.
- 백엔드 설정을 변경하여 이 헤더들을 신뢰하지 않도록 구성
- Fastly가 공지한 보안 업데이트를 적용
즉:
백엔드가 공격자가 조작할 수 있는 값으로 보안 결정을 하지 않도록 고쳐야 한다.
2) Fastly VCL에서 헤더 제거 또는 정규화(normalize)
문제의 핵심 헤더는 다음 세 가지입니다:
- X-Forwarded-Host
- X-Rewrite-URL
- X-Original-URL
Fastly는 이 헤더들을 다음과 같은 방법으로 처리할 것을 권장합니다.
(1) 헤더를 안전한 값으로 재설정하기
예: X-Forwarded-Host를 실제 Host 값으로 강제 통일
set req.http.x-forwarded-host = req.http.host;
→ 공격자가 어떤 값을 넣어도 의미 없음
(2) 헤더를 완전히 제거하기 (unset)
X-Original-URL:
unset req.http.x-original-url;
X-Rewrite-URL:
unset req.http.x-rewrite-url;
→ 이러한 헤더 기반 공격 벡터를 근본적으로 제거
3) (대안) 캐시 키 또는 Vary에 포함하기
위 헤더들을 캐시 키 또는 Vary 헤더에 포함하면 헤더 값이 다를 때마다 캐시가 따로 생성되므로 보안 영역 간의 캐시 섞임을 방지할 수 있습니다.
결론
🔹 캐시 포이즈닝은 “조작 가능한 헤더를 백엔드가 신뢰할 때” 발생한다.
🔹 이를 막으려면 Fastly에서 해당 헤더를 제거하거나 안전한 값으로 바꾸고,
🔹 필요하다면 캐시 키 또는 Vary 헤더에 포함해 캐시 오염을 방지해야 한다.
이 두 가지 조치만으로 공격자가 캐시를 오염시키는 것을 사실상 차단할 수 있습니다.
이 포스팅은 패스틀리의 공식 문서 를 기반으로 작성했습니다. 자세한 내용으로 아래의 사이트에서 참고하시길 부탁드립니다. 긴 글 읽어주셔서 감사합니다.
Preventing cache poisoning via HTTP X-headers | Fastly Documentation
Fastly service configurations may be vulnerable to cache poisoning if they do not take into consideration the interaction between HTTP "X…
www.fastly.com
'Fastly_CDN > CDN_설정' 카테고리의 다른 글
| 패스틀리(Fastly), AI Accelerator에 대해서 (0) | 2025.12.10 |
|---|---|
| 패스틀리(Fastly), Stale Content 제공하기 (0) | 2025.12.09 |
| 패스틀리(Fastly), Cache Key조작에 대해서 (0) | 2025.11.26 |
| 패스틀리(Fastly), Segmented Caching의 이용 (0) | 2025.11.12 |
| 패스틀리(Fastly), 캐싱 베스트 프랙티스 정리 (0) | 2025.10.28 |