Content-Security-Policy-Report-OnlyContent-Security-Policy-Report-Only는 CSP 정책을 실제로 강제하지 않고, 만약 강제했다면 어떤 위반이 발생했을지를 브라우저가 리포트로만 전송하게 하는 헤더입니다. 정책을 프로덕션에 적용하기 전에 부작용을 안전하게 관찰하는 '드라이런' 모드입니다.
문법과 지시어는 Content-Security-Policy와 완전히 동일하지만, 위반이 발생해도 리소스를 차단하지 않고 콘솔 경고와 함께 위반 리포트만 report-to(또는 구식 report-uri)로 보냅니다. 덕분에 강력한 정책(예: unsafe-inline 제거, nonce 도입)을 실제 사용자 트래픽에 실험하면서 어떤 인라인 스크립트·서드파티가 깨질지 사전에 파악할 수 있습니다.
권장 도입 절차는 ① Report-Only로 관대한 정책부터 시작 → ② 리포트를 분석해 예외·nonce·해시를 정리 → ③ 위반이 사라지면 같은 정책을 Content-Security-Policy(강제)로 승격입니다. 두 헤더를 동시에 보낼 수도 있는데, 이때 CSP는 강제하고 CSP-Report-Only는 더 엄격한 다음 단계 정책을 관찰하는 병행 운영이 가능합니다.
리포트는 Reporting API를 통해 전달됩니다. 최신 브라우저는 Reporting-Endpoints 헤더로 정의한 그룹으로 보내며, report-to 지시어가 그 그룹 이름을 가리킵니다. 구형 경로인 report-uri는 별도의 CSP 전용 보고 형식으로 여전히 일부 브라우저가 지원하지만 폐기 방향입니다.
Content-Security-Policy-Report-Only: <directive> <source-list>[; ...]; report-to <group>e.g. Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'nonce-r4nd0m'; report-to csp-endpoint
<CSP directives> | 일반 CSP와 동일한 지시어(default-src·script-src·frame-ancestors 등)를 사용하되 강제하지 않고 위반만 보고. |
report-to <group> | 위반 보고를 전송할 Reporting-Endpoints 그룹 이름. 리포트 전용 모드에서 필수 요소. |
report-uri <url> | 구식 보고 방식. 위반 리포트를 POST할 URL(현재는 report-to로 대체 권장). |