Skip to content

[Preview] Cloudflare RUM beacon이 sandbox 프리뷰에서 CORS 차단되어 콘솔 에러 #113

Description

@Danto7632

증상

프리뷰가 정상 동작하는데 콘솔에 이 에러만 남는다:

Access to XMLHttpRequest at 'https://qeploy.com/cdn-cgi/rum?' from origin 'null'
  has been blocked by CORS policy: Response to preflight request doesn't pass
  access control check: No 'Access-Control-Allow-Origin' header is present
POST https://qeploy.com/cdn-cgi/rum? net::ERR_FAILED

원인 (실측)

  • Cloudflare가 이 zone의 HTML 응답에 beacon.min.js(cloudflareinsights)를 자동 주입한다 — curl https://qeploy.com/ 응답에서 확인.
  • 그 beacon이 수집 데이터를 같은 도메인의 /cdn-cgi/rum으로 POST한다. 이 경로는 Cloudflare 엣지가 처리하며 우리 서버에 도달하지 않는다(server: cloudflare + cf-ray, OPTIONS → 404, ACAO 없음). 백엔드 코드에 rum/beacon 관련 코드는 전무하다.
  • 프리뷰 문서는 CSP sandbox(Issue Issue AP: [Preview] 프리뷰 콘텐츠가 서비스와 같은 오리진에서 실행되는 문제 차단 #102, allow-same-origin 미포함)로 불투명 오리진이라 이 POST가 cross-origin이 되고, Origin: null에는 ACAO가 내려오지 않아 브라우저가 차단한다.

즉 프리뷰 앱 기능과 무관하며(비컨 하나가 실패할 뿐), 본 사이트에서는 same-origin이라 에러가 나지 않는다.

수정 방향

프리뷰 HTML 응답에만 Cache-Control: no-transform을 추가한다. Cloudflare는 이 지시어가 있으면 payload를 변형하지 않으므로 beacon이 주입되지 않는다(Cloudflare Web Analytics FAQ).

  • 자산(JS/CSS) 응답에는 붙이지 않는다 — no-transform은 Cloudflare의 압축 등 다른 변형에도 영향을 줄 수 있는데, 주입은 HTML에만 일어나므로 HTML로 한정하면 목적만 달성하고 자산 전송은 그대로 둘 수 있다.
  • 프리뷰는 어차피 불투명 오리진이라 RUM 데이터가 지금도 수집되지 않는다 — 잃는 것이 없다.
  • 본 사이트(FE)의 Web Analytics는 프리뷰 응답에만 헤더를 붙이므로 영향받지 않는다.

대안(코드 변경 없음): Cloudflare 대시보드에서 Web Analytics 자동 주입을 끄거나 Configuration Rule로 /api/v1/previews/*disable_rum을 적용. 사이트 전체 분석 정책과 얽히므로 서버 헤더 쪽이 국소적이다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions