Content-Security-Policy와 Permissions-Policy의 지시어 58종. 문법·소스 표현식·보안 모범사례를 정리했습니다.
base-uribase-uri 는 문서의 <base> 요소가 설정할 수 있는 기준 URL 을 제한합니다. <base href> 는 페이지 내 모든 상대 URL 의 해석 기준을 바꾸므로, 공격자가 주입한 <base> 로 리소스 경로를 통째로 탈취하는 것을 막습니다. 이 지시어는 default-src 로 폴백되지 않습니다.block-all-mixed-contentblock-all-mixed-content 는 HTTPS 페이지에서 http 로 로드되는 모든 혼합 콘텐츠(passive·active 불문)를 차단하도록 지시하는 플래그형 지시어입니다. 값을 받지 않습니다. 다만 폐기(deprecated) 상태이며 최신 브라우저의 기본 혼합 콘텐츠 정책으로 대체되었습니다.child-srcchild-src 는 프레임(iframe)과 워커(Web Worker·Shared Worker)의 문서/스크립트 출처를 함께 제어하는 상위 지시어입니다. 현재는 frame-src(프레임)와 worker-src(워커)의 폴백 역할을 주로 담당합니다. 미지정 시 default-src 를 상속합니다.connect-srcconnect-src 는 스크립트가 열 수 있는 네트워크 연결의 대상을 제어합니다. fetch(), XMLHttpRequest, WebSocket, EventSource(SSE), navigator.sendBeacon, <a ping> 등이 모두 여기에 걸립니다. 미지정 시 default-src 를 상속합니다.default-srcdefault-src 는 다른 fetch 지시어가 명시되지 않았을 때 적용되는 대체(fallback) 정책을 정의합니다. script-src·style-src·img-src·font-src·connect-src 등 대부분의 리소스 로딩 지시어가 빠져 있으면 이 값을 상속받습니다. 사실상 정책 전체의 기본 바닥을 까는 핵심 지시어입니다.fenced-frame-srcfenced-frame-src 는 <fencedframe> 요소로 임베드할 수 있는 콘텐츠의 출처를 제어합니다. Fenced Frame 은 프라이버시 샌드박스(Privacy Sandbox)의 일부로, 임베드된 콘텐츠와 부모 페이지 간 통신을 강하게 차단하는 새로운 격리 임베드 방식입니다.font-srcfont-src 는 @font-face 등으로 로드되는 웹폰트 파일의 출처를 제어합니다. 미지정 시 default-src 를 상속합니다. 폰트 자체는 스크립트가 아니라 실행 위험은 낮지만, 로딩 도메인을 제한하는 위생적 통제 지점입니다.form-actionform-action 은 <form> 이 제출(submit)될 수 있는 대상 URL 을 제한합니다. action 속성이나 스크립트로 지정된 폼 제출 목적지를 통제해 자격증명·데이터가 임의의 외부 서버로 전송되는 것을 막습니다. 이 지시어는 default-src 로 폴백되지 않습니다.frame-ancestorsframe-ancestors 는 어떤 오리진이 현재 페이지를 <iframe>·<frame>·<object>·<embed> 로 감쌀 수 있는지 제어합니다. 즉 클릭재킹 방어의 핵심 지시어로, 구식 X-Frame-Options 헤더를 대체합니다. 이 지시어는 default-src 로 폴백되지 않습니다.frame-srcframe-src 는 <iframe>·<frame> 으로 임베드할 수 있는 문서의 출처를 제어합니다. 즉 '내 페이지 안에 어떤 사이트를 넣을 수 있는가'를 통제합니다. 미지정 시 child-src 로, child-src 도 없으면 default-src 로 폴백합니다.img-srcimg-src 는 이미지와 파비콘 리소스를 어디서 불러올 수 있는지 제어합니다. <img>, <picture>, CSS background-image, favicon, SVG <image> 등이 대상입니다. 미지정 시 default-src 를 상속합니다.manifest-srcmanifest-src 는 웹 앱 매니페스트(<link rel="manifest" href="...">)를 로드할 수 있는 출처를 제어합니다. PWA(Progressive Web App)의 설치 메타데이터인 manifest.json 이 대상입니다. 미지정 시 default-src 를 상속합니다.media-srcmedia-src 는 <audio>, <video>, 그리고 <track> 요소가 로드하는 오디오·비디오·자막 리소스의 출처를 제어합니다. 미지정 시 default-src 를 상속합니다.navigate-tonavigate-to 는 문서가 이동(navigate)할 수 있는 목적지 URL 을 제한하려던 지시어로, 링크 클릭·form 제출·window.location·window.open 등 모든 내비게이션을 대상으로 삼았습니다. 그러나 명세가 진전되지 못하고 프라이버시·구현 우려로 사실상 폐기되어 주요 브라우저에서 지원되지 않습니다.object-srcobject-src 는 <object>, <embed> (그리고 레거시 <applet>)로 로드되는 플러그인 콘텐츠의 출처를 제어합니다. 미지정 시 default-src 를 상속합니다. 현대 웹에서는 거의 항상 'none' 으로 완전 차단하는 것이 모범 사례입니다.plugin-typesplugin-types 는 <object>·<embed> 로 로드할 수 있는 플러그인을 MIME 타입 기준으로 제한하던 지시어입니다(예: application/pdf 만 허용). 그러나 플러그인 시대의 종말과 함께 폐기(deprecated)되었고 최신 브라우저에서 제거·미지원 상태입니다.prefetch-srcprefetch-src 는 <link rel="prefetch"> 및 <link rel="prerender"> 로 사전 로드(프리페치/프리렌더)하는 리소스의 출처를 제어합니다. 미지정 시 default-src 를 상속합니다. 다만 표준화가 진전되지 않아 브라우저 지원이 제한적이고 사실상 폐기 경로에 있습니다.report-toreport-to 는 CSP 위반 리포트를 보낼 대상을 이름(그룹명)으로 지정하는 현대적 리포팅 지시어입니다. 실제 엔드포인트 URL 은 별도의 Reporting-Endpoints(또는 구식 Report-To) HTTP 헤더에서 그 이름에 매핑합니다. 폐기된 report-uri 의 후속입니다.report-urireport-uri 는 CSP 위반이 발생했을 때 브라우저가 위반 리포트(JSON)를 POST 로 전송할 URL 을 지정합니다. 정책을 어긴 리소스·차단된 지시어 정보를 수집해 정책을 튜닝하거나 공격 시도를 모니터링합니다. 이 지시어는 폐기(deprecated)되었고 후속은 report-to 입니다.require-trusted-types-forrequire-trusted-types-for 는 DOM 의 위험한 싱크(innerHTML, script.src, eval 등)에 문자열을 직접 대입하지 못하게 하고, 반드시 Trusted Types 객체를 거치도록 강제하는 지시어입니다. 값으로 'script' 를 지정해 DOM 기반 XSS(sink 인젝션)를 구조적으로 차단합니다.sandboxsandbox 는 iframe 의 sandbox 속성과 유사한 제약을 문서 전체에 적용해 페이지 기능을 격리·제한합니다. 스크립트 실행·폼 제출·팝업·top-level 내비게이션 등을 기본 차단하고, allow-* 토큰으로 필요한 능력만 되살립니다. 이 지시어는 default-src 로 폴백되지 않습니다.script-srcscript-src 는 페이지가 실행할 수 있는 JavaScript 소스를 제어하는, CSP에서 가장 중요한 XSS 방어 지시어입니다. 외부 <script src> 로딩과 인라인 스크립트, eval() 계열 실행을 모두 관장합니다. 미지정 시 default-src 를 상속합니다.script-src-attrscript-src-attr 은 인라인 이벤트 핸들러 속성(onclick, onload 등 on* 속성)의 JavaScript 실행만 제어하는 세분화된 지시어입니다. <script> 요소는 담당하지 않습니다. 미지정 시 script-src → default-src 순으로 폴백합니다.script-src-elemscript-src-elem 은 <script> 요소(외부 src 로딩과 인라인 <script> 블록)에만 적용되는 세분화된 스크립트 지시어입니다. 인라인 이벤트 핸들러 속성은 담당하지 않습니다. 미지정 시 script-src → default-src 순으로 폴백합니다.style-srcstyle-src 는 스타일시트와 인라인 CSS 소스를 제어합니다. 외부 <link rel=stylesheet>, <style> 블록, style= 인라인 속성, CSSOM API(insertRule 등)를 모두 관장합니다. 미지정 시 default-src 를 상속합니다.style-src-attrstyle-src-attr 은 요소의 인라인 style 속성(예: <div style="...">)에 적용되는 CSS만 제어하는 세분화된 지시어입니다. 스타일시트나 <style> 블록은 담당하지 않습니다. 미지정 시 style-src → default-src 순으로 폴백합니다.style-src-elemstyle-src-elem 은 스타일시트 요소, 즉 <link rel=stylesheet> 와 <style> 블록에만 적용되는 세분화된 스타일 지시어입니다. 인라인 style= 속성은 담당하지 않습니다. 미지정 시 style-src → default-src 순으로 폴백합니다.trusted-typestrusted-types 는 Trusted Types API 로 생성할 수 있는 정책(policy)의 허용 이름 목록을 정의합니다. 각 정책은 문자열을 TrustedHTML 등 안전 객체로 변환하는 규칙(정화 로직)을 담으며, 이 지시어로 어떤 이름의 정책만 만들 수 있는지 제한합니다.upgrade-insecure-requestsupgrade-insecure-requests 는 페이지 내 http:// 로 참조된 리소스 요청을 브라우저가 자동으로 https:// 로 승격(업그레이드)해 전송하도록 지시하는 플래그형 지시어입니다. 값을 받지 않으며 존재만으로 동작합니다. 혼합 콘텐츠(mixed content) 문제를 마이그레이션 단계에서 완화합니다.worker-srcworker-src 는 Web Worker, Shared Worker, Service Worker 로 로드할 수 있는 스크립트의 출처를 제어합니다. 미지정 시 child-src → script-src → default-src 순으로 폴백합니다.accelerometeraccelerometer 지시어는 페이지와 하위 프레임이 Generic Sensor API의 Accelerometer·LinearAccelerationSensor·GravitySensor 인터페이스로 3축 가속도 데이터를 읽을 수 있는지를 제어합니다. 기본 허용 목록(default allowlist)은 self이므로, 같은 오리진 문서는 별도 설정 없이 접근할 수 있지만 교차 오리진 iframe은 명시적 위임이 필요합니다.ambient-light-sensorambient-light-sensor 지시어는 AmbientLightSensor 인터페이스를 통해 주변 조도(럭스, lux) 값을 읽을 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 이 기능은 아직 실험적이라 브라우저 지원이 제한적입니다.autoplayautoplay 지시어는 <video>·<audio> 요소가 사용자 제스처 없이 자동 재생되거나 HTMLMediaElement.play()가 자동으로 성공할 수 있는지를 제어합니다. 기본 허용 목록은 self로, 같은 오리진 문서는 브라우저의 자동재생 정책 범위 안에서 재생을 시도할 수 있습니다.batterybattery 지시어는 navigator.getBattery()로 접근하는 Battery Status API의 사용 가능 여부를 제어합니다. 이 API는 충전 상태·배터리 잔량·충전/방전 예상 시간을 노출하며, 기본 허용 목록은 self입니다.cameracamera 지시어는 navigator.mediaDevices.getUserMedia({ video: true })로 카메라 영상 트랙을 획득할 수 있는지를 제어합니다. 기본 허용 목록은 self이므로, 같은 오리진 문서만 기본적으로 카메라에 접근할 수 있고 교차 오리진 프레임은 위임이 있어야 합니다.clipboard-readclipboard-read 지시어는 navigator.clipboard.read()·readText()로 시스템 클립보드의 내용을 읽는 비동기 Clipboard API의 사용 가능 여부를 제어합니다. 기본 허용 목록은 self이며, 클립보드 읽기는 민감 작업이라 사용자 권한이 추가로 필요합니다.clipboard-writeclipboard-write 지시어는 navigator.clipboard.write()·writeText()로 시스템 클립보드에 데이터를 쓰는 기능을 제어합니다. 읽기보다 위험이 낮아 대개 사용자 제스처 안에서 허용되며, 기본 허용 목록은 self입니다.cross-origin-isolatedcross-origin-isolated 지시어는 문서가 교차 오리진 격리(cross-origin isolated) 상태로 들어갈 수 있는지를 제어하는 특수 지시어입니다. 이 상태는 SharedArrayBuffer, 고정밀 performance.now(), performance.measureUserAgentSpecificMemory() 같은 강력 기능을 여는 전제 조건입니다.display-capturedisplay-capture 지시어는 navigator.mediaDevices.getDisplayMedia()로 화면·창·탭을 캡처하는 Screen Capture API의 사용 가능 여부를 제어합니다. 화면 공유·녹화 도구의 핵심 기능이며, 기본 허용 목록은 self입니다.encrypted-mediaencrypted-media 지시어는 Encrypted Media Extensions(EME)의 navigator.requestMediaKeySystemAccess() 사용 여부를 제어합니다. EME는 넷플릭스·유튜브 등 DRM 보호 스트리밍 재생에 필요한 콘텐츠 복호화 모듈(CDM) 접근 API입니다. 기본 허용 목록은 self입니다.fullscreenfullscreen 지시어는 Element.requestFullscreen()으로 요소를 전체 화면 모드로 전환할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 교차 오리진 iframe이 전체 화면으로 들어가려면 명시적 위임이 필요합니다.gamepadgamepad 지시어는 Gamepad API(navigator.getGamepads(), gamepadconnected 이벤트)로 연결된 게임패드 상태를 읽을 수 있는지를 제어합니다. picture-in-picture처럼 기본 허용 목록이 *(모든 오리진)이라, 명시하지 않으면 어디서나 허용됩니다.geolocationgeolocation 지시어는 navigator.geolocation의 getCurrentPosition()·watchPosition()으로 사용자 위치에 접근할 수 있는지를 제어합니다. 기본 허용 목록은 self로, 같은 오리진만 기본 접근이 가능하고 교차 오리진 프레임은 위임이 필요합니다.gyroscopegyroscope 지시어는 Generic Sensor API의 Gyroscope 인터페이스로 각속도(회전 속도)를 읽을 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 기기 방향·모션 감지, 3D·VR 인터랙션 등에 쓰입니다.hidhid 지시어는 WebHID API(navigator.hid)로 게임패드·특수 키보드·바코드 스캐너 같은 HID(Human Interface Device) 기기와 통신할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 저수준 기기 접근이라 매우 강력한 권한입니다.idle-detectionidle-detection 지시어는 IdleDetector API로 사용자가 유휴 상태(입력 없음)인지, 화면이 잠겼는지를 감지하는 기능을 제어합니다. 기본 허용 목록은 self이며, 채팅·협업 앱의 ‘자리 비움’ 표시 등에 쓰입니다.local-fontslocal-fonts 지시어는 Local Font Access API의 window.queryLocalFonts()로 사용자 기기에 설치된 로컬 폰트 목록을 열거할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 웹 기반 디자인·문서 편집 도구에서 사용됩니다.magnetometermagnetometer 지시어는 Generic Sensor API의 Magnetometer 인터페이스로 주변 자기장(마이크로테슬라, µT)을 읽을 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 나침반·방위 기능에 쓰입니다.microphonemicrophone 지시어는 navigator.mediaDevices.getUserMedia({ audio: true })로 마이크 오디오 트랙을 획득할 수 있는지를 제어합니다. 기본 허용 목록은 self로, 같은 오리진 문서만 기본 접근이 가능하고 교차 오리진 프레임은 위임이 필요합니다.midimidi 지시어는 Web MIDI API의 navigator.requestMIDIAccess()로 MIDI 악기·컨트롤러와 메시지를 주고받을 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 웹 기반 음악 도구에서 사용됩니다.paymentpayment 지시어는 Payment Request API(new PaymentRequest(...).show())로 브라우저 결제 UI를 띄울 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 결제 프레임을 임베드하는 상거래 사이트에서 위임이 중요합니다.picture-in-picturepicture-in-picture 지시어는 HTMLVideoElement.requestPictureInPicture()로 동영상을 화면 위에 떠 있는 작은 창으로 분리할 수 있는지를 제어합니다. 다른 대다수 지시어와 달리 기본 허용 목록이 *(모든 오리진)이라, 명시하지 않으면 어디서나 허용됩니다.publickey-credentials-getpublickey-credentials-get 지시어는 Web Authentication(WebAuthn)의 navigator.credentials.get({ publicKey })로 공개키 자격 증명(패스키·보안 키)을 사용해 인증할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 임베드된 로그인 프레임의 인증에 중요합니다.screen-wake-lockscreen-wake-lock 지시어는 Screen Wake Lock API의 navigator.wakeLock.request('screen')으로 화면이 자동으로 어두워지거나 잠기지 않게 유지하는 기능을 제어합니다. 기본 허용 목록은 self이며, 레시피·내비게이션·프레젠테이션 화면 등에 쓰입니다.serialserial 지시어는 Web Serial API(navigator.serial)로 시리얼 포트를 통해 마이크로컨트롤러·산업 장비 등과 저수준 통신할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 매우 강력한 저수준 기기 접근 권한입니다.usbusb 지시어는 WebUSB API(navigator.usb)로 USB 기기와 직접 통신할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 표준 드라이버 밖의 주변기기까지 다루는 강력한 저수준 권한입니다.web-shareweb-share 지시어는 Web Share API의 navigator.share()로 OS 네이티브 공유 시트를 띄워 링크·텍스트·파일을 공유할 수 있는지를 제어합니다. 기본 허용 목록은 self이며, 모바일에서 흔히 쓰는 공유 버튼의 기반입니다.xr-spatial-trackingxr-spatial-tracking 지시어는 WebXR Device API의 공간 추적(위치·방향, 6DoF) 기능 사용 여부를 제어합니다. navigator.xr.requestSession()으로 AR/VR 세션을 시작하고 사용자·환경의 공간 정보를 추적하는 것을 다루며, 기본 허용 목록은 self입니다.