Content-Security-Policy
응답 헤더 Security

개요

Content-Security-Policy(CSP)는 브라우저가 페이지에서 어떤 출처의 스크립트·스타일·이미지·프레임 등을 로드하거나 실행할 수 있는지를 지시어(directive)로 세밀하게 통제하는 보안 헤더입니다. 신뢰하지 않은 리소스를 차단해 XSS·데이터 유출·클릭재킹을 크게 완화합니다.

정책은 default-src·script-src 같은 지시어와 각 지시어의 허용 출처 목록으로 구성됩니다.

자세히

가장 강력한 효과는 script-src로 인라인 스크립트와 임의 도메인 스크립트를 차단하는 것입니다. XSS로 삽입된 <script>가 실행되지 못하게 하려면 unsafe-inline을 피하고, 서버가 매 응답마다 무작위 nonce를 발급해 자신이 심은 스크립트에만 nonce="..."를 붙이는 방식(script-src 'nonce-...')이나 스크립트 해시('sha256-...')를 씁니다. 여기에 'strict-dynamic'을 더하면 신뢰된 스크립트가 로드하는 하위 스크립트로 신뢰가 전파되어 도메인 허용 목록 관리 부담이 줄어듭니다.

frame-ancestors 지시어는 이 페이지를 누가 iframe으로 감쌀 수 있는지를 통제하며, 클릭재킹을 막는 X-Frame-Options의 현대적·상위 호환 대체입니다. frame-ancestors 'none' 또는 'self'로 외부 프레이밍을 차단합니다.

정책을 실서비스에 바로 강제하면 정상 리소스까지 깨질 수 있으므로, 먼저 Content-Security-Policy-Report-Only 헤더로 위반 사항만 report-to/report-uri로 수집·검토한 뒤 실제 CSP로 승격하는 단계적 도입이 안전합니다.

문법

Content-Security-Policy: <directive> <source-list>[; <directive> <source-list>]*

e.g. Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-r4nd0m'; object-src 'none'; frame-ancestors 'none'

지시어 / 값

default-src다른 -src 지시어가 없을 때 적용되는 기본 리소스 출처 정책.
script-src스크립트를 로드/실행할 수 있는 출처 — XSS 방어의 핵심.
style-src스타일시트/인라인 스타일 허용 출처.
img-src / connect-src / font-src이미지·fetch/XHR/WebSocket·폰트의 허용 출처.
frame-ancestors이 페이지를 iframe으로 감쌀 수 있는 출처 — X-Frame-Options의 현대적 대체.
'nonce-<base64>' / 'sha256-<hash>'특정 인라인 스크립트만 nonce/해시로 허용(unsafe-inline 회피).
'strict-dynamic'nonce로 신뢰된 스크립트가 로드하는 하위 스크립트를 전파 신뢰.
report-to / report-uri정책 위반 보고를 전송할 엔드포인트.

실무 참고

관련 헤더

Content-Security-Policy-Report-OnlyX-Frame-OptionsX-Content-Type-OptionsReferrer-Policy

관련 상태코드

스펙 근거