콘텐츠 보안 정책

Content Security Policy

브라우저가 불러오거나 실행할 수 있는 리소스 출처를 제한합니다.

···
html
<div class="sd"><div class="sd-head"><strong>CONTENT SECURITY POLICY</strong><span id="state">live check</span></div><div class="sd-stage"><div class="policy mono">script-src: self</div><div class="sources"><div class="tile" id="source">same origin</div><div class="arrow">→</div><div class="shield" id="shield">ALLOW</div></div></div><div class="sd-foot"><span id="caption">checking boundary</span><span>tap to step</span></div></div>
css
.sd{box-sizing:border-box;width:min(94vw,700px);height:min(86vh,318px);padding:clamp(9px,2.3vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(6px,1.8vmin,12px);font:600 clamp(12px,2.6vmin,16px)/1.25 var(--font-sans, sans-serif)}.sd *{box-sizing:border-box}.sd-head,.sd-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:1.25em}.sd-head strong{color:var(--accent);letter-spacing:.06em}.sd-head span,.sd-foot{color:var(--muted)}.sd-foot{font-size:clamp(12px,2.4vmin,14px)}.sd-stage{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:clamp(6px,2vmin,18px);overflow:hidden}.sd .mono{font-family:ui-monospace,monospace}.sd .tile{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(5px,1.5vmin,10px);text-align:center}.sd .good{color:var(--accent);border-color:var(--accent)}.sd .bad{color:var(--accent-3);border-color:var(--accent-3)}.sd .arrow{color:var(--muted);font-size:clamp(15px,4vmin,28px)}.sd .active{background:color-mix(in srgb,var(--accent) 16%,var(--surface));border-color:var(--accent)}.sd .blocked{background:color-mix(in srgb,var(--accent-3) 13%,var(--surface));border-color:var(--accent-3)}.sd-stage{flex-direction:column}.policy{border:1px solid var(--accent);border-radius:7px;color:var(--accent);padding:clamp(4px,1.3vmin,9px)}.sources{display:flex;align-items:center;gap:clamp(8px,2.3vmin,20px)}.shield{border:2px solid var(--accent);border-radius:40% 40% 48% 48%;padding:clamp(7px,2.5vmin,18px);color:var(--accent);min-width:clamp(70px,24vmin,110px);text-align:center}.shield.block{border-color:var(--accent-3);color:var(--accent-3)}
js
let n=0;function advance(){n=1-n;document.getElementById('source').textContent=n?'other origin':'same origin';document.getElementById('shield').textContent=n?'BLOCK':'ALLOW';document.getElementById('shield').classList.toggle('block',!!n);document.getElementById('state').textContent=n?'origin not listed':'origin listed';document.getElementById('caption').textContent=n?'browser refuses script':'browser loads script'}advance();setInterval(advance,900);
document.querySelector('.sd').addEventListener('pointerdown',advance);

CSP는 응답 헤더로 스크립트, 스타일, 이미지 같은 리소스의 허용 출처를 지정합니다. 허용되지 않은 스크립트가 페이지에 삽입돼도 브라우저가 실행을 거부할 수 있습니다.

데모는 두 출처의 스크립트를 정책 경계에 통과시켜 결과를 보여줍니다. CSP는 XSS의 보조 방어이며 안전한 출력 인코딩을 대체하지 않습니다. 처음에는 보고 전용 모드로 실제 차단 영향을 확인할 수 있습니다.

언제 쓰나

웹 앱의 스크립트·이미지 출처를 통제하고 삽입 공격의 영향을 줄일 때 설정합니다.

페이지로 열기 ↗