Permissions-Policy 헤더 빌더
Permissions-Policy 응답 헤더 빌드 — camera·microphone·geolocation·payment·fullscreen 등 20+ 브라우저 기능을 오리진 허용 리스트로 토글.
- accelerometer가속도계 읽기
- gyroscope자이로스코프 읽기
- magnetometer자기계 읽기
- ambient-light-sensor주변광 읽기
- camera사용자 카메라 사용
- microphone사용자 마이크 사용
- autoplay미디어 자동재생
- display-capturegetDisplayMedia로 스크린쉐어
- speaker-selection출력 오디오 장치 선택
- paymentPayment Request API 사용
- publickey-credentials-getWebAuthn 사용
- fullscreen프로그램으로 전체화면 진입
- picture-in-picturePIP 비디오 열기
- screen-wake-lock화면 깨어 있게 유지
- xr-spatial-trackingWebXR 공간 추적 사용
- geolocation사용자 위치 읽기
- clipboard-read클립보드 내용 읽기
- clipboard-write클립보드에 쓰기
- usbWeb USB 사용
- serialWeb Serial 사용
- bluetoothWeb Bluetooth 사용
- idle-detection사용자 유휴 감지
- midiWeb MIDI 사용
- web-shareWeb Share API 사용
Permissions-Policy: accelerometer=(), gyroscope=(), magnetometer=(), ambient-light-sensor=(), camera=(), microphone=(), autoplay=(self), display-capture=(), speaker-selection=(), payment=(), publickey-credentials-get=(), fullscreen=(self), picture-in-picture=(self), screen-wake-lock=(), xr-spatial-tracking=(), geolocation=(), clipboard-read=(), clipboard-write=(self), usb=(), serial=(), bluetooth=(), idle-detection=(), midi=(), web-share=(self)모든 HTML 응답에 적용하세요. 브라우저가 위반 사항을 수집 서버로 보고하게 하려면 디렉티브에 report-to 매개변수를 붙이고 Reporting-Endpoints 헤더를 추가하세요(여기서는 생성하지 않습니다).
사용법
- strict 프리셋(전부 끔)부터 시작해 페이지가 실제 필요한 것만 켜기.
- 대부분 페이지 레벨 기능엔
self가 정답.*는 거의 정답 아님 — 모든 iframe에 기능 허용. - 커스텀 모드는 오리진 허용 리스트(
https://embed.example.com https://other.com).self·*는 토큰, 나머진 전체 오리진 필요.
자세한 설명
펼치기접기
Permissions-Policy는 브라우저에게 이 페이지와 그 안의 프레임이 어떤 강력한 기능을 쓸 수 있는지 알려 줍니다. 기능을 고르고 완전히 차단할지, 자기 출처에만 허용할지, 어디서든 허용할지, 직접 적은 목록으로 제한할지 선택합니다. 기능은 범주별로 묶여 있어서 잠그려던 것을 찾기 쉽고, 임베드된 모든 출처에 권한을 넘겨주는 형태나 허용 목록 항목에서 스킴이 빠진 경우에는 경고가 표시됩니다.
문법은 보기보다 간결하고, 미묘하게 틀리기도 쉽습니다. 빈 목록은 자기 페이지를 포함해 어디에서든 기능을 끕니다. camera=()는 "기본값"이 아니라 "아무도 안 됨"입니다. (self)는 최상위 문서와 동일 출처 프레임을 허용하고, *는 아무 출처나 허용하며, 지정 출처는 괄호 안에 따옴표로 감싸 스킴까지 포함해 적습니다 — geolocation=(self "https://maps.example.com"). 따옴표나 https://를 빠뜨려도 오류가 나지 않습니다. 그 항목이 그냥 이해되지 않을 뿐이고, 결과적으로 기능은 의도한 것보다 더 막히게 됩니다.
사람들이 걸려 넘어지는 지점은 이 헤더가 유일한 관문이 아니라는 사실입니다. 교차 출처 iframe에는 <iframe> 요소 자체에 붙는 allow 속성도 필요하고, 둘은 교집합으로 작동합니다. 헤더가 무엇을 허용하든, 임베드하는 태그가 요청하지 않으면 그 프레임은 아무것도 얻지 못합니다. 그래서 응답에 camera=(self "https://widget.example")이 있고 태그에 allow="camera"가 없으면, 카메라가 안 되는 위젯과 그 이유를 알 수 없는 상황이 만들어집니다. 양쪽이 모두 동의해야 합니다.
알아 둘 것이 둘 더 있습니다. 철자가 틀린 기능 이름은 거부되지 않고 조용히 무시되므로, 오타가 있는 정책은 아무것도 보호하지 않으면서 아무것도 알려 주지 않습니다. 작성한 헤더를 믿지 말고 브라우저 개발자 도구에서 실제로 적용된 정책을 확인하세요. 그리고 이 헤더는 공백으로 구분하는 다른 문법을 쓰던 Feature-Policy를 대체한 것입니다. 블로그 글에서 복사해 온 옛 예제는 요즘 브라우저에서 아무것도 아닌 것으로 파싱되는데, 이 역시 조용히 실패합니다.
자주 묻는 질문
Permissions-Policy vs Feature-Policy?
동일 아이디어, 새 문법. Feature-Policy는 디렉티브당 공백 구분 오리진 리스트 사용; Permissions-Policy는 구조화 헤더 feature=(origin1 origin2) 사용. 브라우저는 이제 Permissions-Policy 존중; 구식 브라우저 지원 시 전환 윈도우에 둘 다 제공.
와일드카드 * 위험?
와일드카드는 모든 중첩 iframe에 기능 넘김 — 완전 신뢰 안 하는 외부 임베드 포함. 멀버타이징·공급망 침해가 iframe 주입 시, *는 '카메라로 스파이 가능' vs '못 함'의 차이.
내 페이지에서는 되는 기능이 iframe 안에서는 안 되는 이유는?
정책은 문서 트리 전체에 적용되고, 삽입된 프레임은 감싼 페이지가 그 기능을 위임하지 않는 한 아무것도 갖지 못한 채 시작하기 때문이다. 위임에는 양쪽이 다 필요하다. 헤더가 그 프레임의 출처를 허용해야 하고, iframe 태그에도 대응하는 allow 속성이 있어야 한다. 둘 중 하나만 빠져도 상위 페이지는 되는데 프레임만 거부된다.
여기서 기능을 막으면 사용자에게 묻는 절차를 대신하나?
물음이 아니라 가능성 자체를 없앤다. 막힌 기능은 사용할 수 없음으로 보고되므로 브라우저는 아예 묻지 않고, 페이지는 거절을 처리해야 한다. 그게 쓸모 있는 성질이다. 페이지에 삽입된 서드파티 코드가 카메라에 절대 닿지 못하도록 보장할 수 있다. 다만 이건 능력에 관한 정책이지 동의 절차가 아니므로, 권한 대화상자가 뜬다고 전제한 코드에는 뜨지 않는 경우의 경로가 필요하다.
관련 도구
Referrer-Policy 헤더 빌더
Referrer-Policy 값 선택 → 송출 요청이 보낼 Referer 헤더 정확히 확인 — 동일 오리진, 크로스 오리진 HTTPS, HTTPS→HTTP 다운그레이드.
네트워크
Content-Security-Policy 빌더
디렉티브별 소스 리스트로 CSP 헤더 빌드, 3개 시작 프리셋·위험한 와일드카드 실시간 경고.
네트워크
SPF 레코드 빌더
메커니즘·IP·include로 SPF TXT 레코드 작성, 실시간 DNS 조회 카운트와 경고.
네트워크
CSP 해시 생성기
Content-Security-Policy로 화이트리스트하려는 인라인 <script>·<style>의 sha256/384/512 base64 해시 계산.
네트워크
Cache-Control 헤더 빌더
체크리스트로 HTTP Cache-Control 헤더 생성 — 프레시니스·재검증·immutable·자주 쓰는 프리셋.
네트워크
HSTS 헤더 빌더
Strict-Transport-Security 헤더 구성 — max-age·includeSubDomains·preload, preload 리스트 자격 실시간 체크.
네트워크