본문으로 건너뛰기
AZ Tools

Permissions-Policy 헤더 빌더

Permissions-Policy 응답 헤더 빌드 — camera·microphone·geolocation·payment·fullscreen 등 20+ 브라우저 기능을 오리진 허용 리스트로 토글.

프리셋
센서
  • accelerometer
    가속도계 읽기
  • gyroscope
    자이로스코프 읽기
  • magnetometer
    자기계 읽기
  • ambient-light-sensor
    주변광 읽기
미디어 캡처
  • camera
    사용자 카메라 사용
  • microphone
    사용자 마이크 사용
  • autoplay
    미디어 자동재생
  • display-capture
    getDisplayMedia로 스크린쉐어
  • speaker-selection
    출력 오디오 장치 선택
결제 & 인증
  • payment
    Payment Request API 사용
  • publickey-credentials-get
    WebAuthn 사용
디스플레이
  • fullscreen
    프로그램으로 전체화면 진입
  • picture-in-picture
    PIP 비디오 열기
  • screen-wake-lock
    화면 깨어 있게 유지
  • xr-spatial-tracking
    WebXR 공간 추적 사용
기타
  • geolocation
    사용자 위치 읽기
  • clipboard-read
    클립보드 내용 읽기
  • clipboard-write
    클립보드에 쓰기
  • usb
    Web USB 사용
  • serial
    Web Serial 사용
  • bluetooth
    Web Bluetooth 사용
  • idle-detection
    사용자 유휴 감지
  • midi
    Web MIDI 사용
  • web-share
    Web 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 헤더를 추가하세요(여기서는 생성하지 않습니다).

사용법

  1. strict 프리셋(전부 끔)부터 시작해 페이지가 실제 필요한 것만 켜기.
  2. 대부분 페이지 레벨 기능엔 self가 정답. *는 거의 정답 아님 — 모든 iframe에 기능 허용.
  3. 커스텀 모드는 오리진 허용 리스트(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 속성이 있어야 한다. 둘 중 하나만 빠져도 상위 페이지는 되는데 프레임만 거부된다.

여기서 기능을 막으면 사용자에게 묻는 절차를 대신하나?

물음이 아니라 가능성 자체를 없앤다. 막힌 기능은 사용할 수 없음으로 보고되므로 브라우저는 아예 묻지 않고, 페이지는 거절을 처리해야 한다. 그게 쓸모 있는 성질이다. 페이지에 삽입된 서드파티 코드가 카메라에 절대 닿지 못하도록 보장할 수 있다. 다만 이건 능력에 관한 정책이지 동의 절차가 아니므로, 권한 대화상자가 뜬다고 전제한 코드에는 뜨지 않는 경우의 경로가 필요하다.

관련 도구