재우니 개발자 블로그

 

DATADOG 을 함께 운영하는 사이트 경우, 서브 도메인 주소를 WEB API 로 호출할 경우, 아래와 같이 HEADER 에 정책을 추가해 줘야 합니다.

 

Datadog RUM의 allowedTracingUrls 설정으로 인해 자동으로 추가되는 분산 추적 헤더(traceparent, tracestate)가 CORS Preflight 요청에서 차단되고 있기 때문이죠.

 

문제점:

  • Datadog RUM이 allowedTracingUrls에 포함된 도메인으로의 XHR/Fetch 요청에 traceparent 헤더를 자동 삽입
  • 서브 도메인 간 Cross-Origin 요청이므로 Preflight 요청(OPTIONS) 발생
  • 서버의 Access-Control-Allow-Headers에 traceparent가 없으면 CORS 차단

 

Access to XMLHttpRequest at 'https://XXXXX/api/...' 
from origin 'https://XXXXX.XXX.kr' has been blocked by CORS policy: 
Request header field traceparent is not allowed by Access-Control-Allow-Headers

 

 

서버 측 CORS 설정에 Datadog 헤더 추가


서브 도메인 간 분산 추적이 반드시 필요한 경우, 서버의 CORS 정책에 Datadog 헤더를 허용 목록에 추가합니다.

 "traceparent",  "tracestate" 를 허용해주면 됩니다.

 

// =============================
// 1. CORS 정책 등록 (API 외부 호출 필요시)
// =============================
var corsOrigins = builder.Configuration.GetSection("SiteSettings:CorsOrigins").Get<string[]>()
    ?? throw new InvalidOperationException("SiteSettings:CorsOrigins 설정이 필요합니다.");

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowSubdomains", policy =>
    {
        policy.WithOrigins(corsOrigins)
            // ==========================================
            // [수정] W3C Trace Context 헤더 추가
            // ==========================================
            .WithHeaders(
                // 기본 헤더
                "Content-Type",
                "Authorization",
                "X-Requested-With",
                "requestverificationtoken",
                // [중요] W3C Trace Context 표준 헤더 (Datadog RUM 필수)
                "traceparent",              // ← 추가 필요
                "tracestate",               // ← 추가 필요
                // Datadog 전용 헤더 (기존 유지)
                "x-datadog-trace-id",
                "x-datadog-parent-id",
                "x-datadog-origin",
                "x-datadog-sampling-priority"
            )
            .WithMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
            .AllowCredentials()
            .SetIsOriginAllowedToAllowWildcardSubdomains();
    });
});