Content-Security-PolicyContent-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 | 정책 위반 보고를 전송할 엔드포인트. |