pulse.huny.dev
HunyDev
Preventing Abuse in Cloudflare Image and Stream Transformations

Preventing Abuse in Cloudflare Image and Stream Transformations

Cloudflare Images/Transformations·Stream에서 “아무 크기/품질로 막 변환 요청”되는 걸 막는 가장 안전한 방법은 **서명 URL(HMAC 토큰)**을 쓰는 것이다.

Hun Jang
Hun Jang Dec 1, 2025

Cloudflare Images/Transformations·Stream에서 “아무 크기/품질로 막 변환 요청”되는 걸 막는 가장 안전한 방법은 **서명 URL(HMAC 토큰)**을 쓰는 것이다. 아래처럼 설정하면 된다.

왜 서명 URL?

  • /cdn-cgi/image/<options>/... 같은 URL 기반 변환은 매우 편하지만, 옵션을 마음대로 바꿔 트래픽이 남용될 수 있다. Cloudflare는 이 경로 포맷을 공식 지원하고(예: width, height, quality 등), 이미지 최적화를 즉시 제공한다. (Cloudflare Docs)

권장 아키텍처(요약)

  1. 클라이언트는 사전 정의된 변환 프리셋만 쓰는 짧은 URL을 받는다.
  1. 워커(Workers) 가 요청을 받아 만료시간(expires)·경로+쿼리를 HMAC-SHA256으로 검증한다.
  1. 검증 통과 시에만 원래 변환 엔드포인트(예: /cdn-cgi/image/width=.../origin.jpg)로 프록시한다.
    1. → 이렇게 하면 임의 옵션을 차단하면서 캐시 키 일관성긴 TTL을 유지할 수 있다. Cloudflare는 이미지에 대해 서명 토큰/HMAC을 공식 안내하고 있으며, Stream 동영상도 서명 토큰으로 접근 제어가 가능하다. (Cloudflare Docs)

구현 스니펫(Workers — 검증 + 프록시)

  • 위 패턴은 Cloudflare의 HMAC 서명·검증 예제와 동일한 발상이다. (Cloudflare Docs)

서명 생성(백엔드)

  • URL을 만들 때 path + '?' + query(= exp=..., 기타 필요한 파라미터)비밀키로 HMAC-SHA256sig로 붙인다. Cloudflare 내부 글에서도 **“경로와 쿼리를 HMAC으로 서명”**하는 절차를 설명한다. (The Cloudflare Blog)

Cloudflare Images: 프라이빗 이미지 & 토큰

  • Images 저장형(Hosted Images)Signed URL 토큰을 공식 제공한다(키는 대시보드 > Hosted Images > Keys). 토큰이 필요한 이미지엔 토큰 없이는 접근 불가다. (Cloudflare Docs)

Cloudflare Stream: 동영상 토큰

  • 비공개(Private) 영상에 대해 /accounts/{account_id}/stream/{video_uid}/token API로 1시간짜리 서명 토큰을 발급받아 재생 URL에 붙인다(웹·SDK 모두 제공). (Cloudflare Docs)

Transformations vs Images Variants 간단 정리

  • Transformations: 원본이 외부/내부 어디있든 /cdn-cgi/image/... 또는 Workers로 요청 시 변환하는 기능(실시간). (Cloudflare Docs)
  • Images Variants: Images에 업로드된 자산에 대해 사전 정의된 프리셋(variant) 이름을 통해 서빙한다(요청 시 계산되지만 프리셋에 한정). (Cloudflare Docs)
    • → 남용 방지는 두 경우 모두 서명 URL로 해결 가능.

토큰·권한(FAQ)

  • API 토큰 스코프: 일반적으로 Account 단위 API Token을 만들고(대시보드 > My Profile > API Tokens), Stream 토큰 발급이나 Images 키 조회 등 필요한 리소스 권한을 최소화해 부여하면 된다. account_id / zone_id는 본인 계정·도메인에 따라 다르며, 대시보드나 Zones API에서 확인한다. (Cloudflare Docs)

You might also like

BlogPro logo
Made with BlogPro

Tags