Permissions-Policy
사용법
Permissions-Policy 응답 헤더는 현재 프레임에서 허용되는 브라우저 기능을 제한합니다. 각 정책은 기능 디렉티브와, 어떤 오리진이 해당 기능에 접근할 수 있는지 정의하는 허용 목록을 짝지웁니다.
Permissions-Policy: <directive>=<allowlist>
참고
권장되는 출발점 정책은 사이트가 사용하지 않는 기능을 비활성화하는 것입니다. Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=() 처럼 설정합니다. 보안 스캐너는 Permissions-Policy 헤더가 없으면 이를 지적합니다. 최소한의 정책을 설정하면 사이트 기능에 영향을 주지 않으면서 그 지적을 해소할 수 있습니다.
참고
Permissions-Policy 메커니즘은 이전에 Feature Policy로 알려져 있었습니다.
지시어
디렉티브 이름은 제어할 브라우저 기능을 식별합니다. 표준화된 디렉티브의 일부 목록은 다음과 같습니다.
참고
interest-cohort 디렉티브는 FLoC(Federated Learning of Cohorts)를 차단하는 데 쓰였습니다. Google은 2022년에 FLoC를 포기하고 해당 API를 Topics API로 대체했습니다. interest-cohort 디렉티브는 브라우저 구현에서 제거되었습니다.
허용 목록 값
참고
unload 디렉티브는 해당 오리진에서 unload 이벤트 핸들러를 차단합니다. Permissions-Policy: unload=()를 설정하면 퍼스트파티 코드, 서드파티 스크립트, 브라우저 확장 프로그램이 unload 핸들러를 등록하지 못합니다. 이는 뒤로-앞으로 캐시(bfcache) 성능에 중요한데, unload 핸들러가 있으면 브라우저가 즉각적인 뒤로·앞으로 이동을 위해 페이지를 캐시하지 못하기 때문입니다. Chrome은 트래픽이 많은 사이트부터 시작해 모든 사이트로 확대하며 unload 이벤트를 점진적으로 완전히 폐지하고 있습니다. unload=()를 설정하면 이 폐지에 즉시 동참하게 되고, 롤아웃 일정과 무관하게 bfcache 적격성이 보장됩니다.
예시
다음 예시에서 서버는 geolocation 기능을 모든 컨텍스트에서 비활성화한다고 알립니다.
Permissions-Policy: geolocation=()
다음 예시에서 서버는 report.example.re를 제외한 모든 오리진에서 encrypted-media 기능을 비활성화한다고 알립니다.
Permissions-Policy: encrypted-media=("https://report.example.re")
다음 예시에서 서버는 자기 자신과 오리진이 example.re인 곳을 제외한 모든 오리진에서 microphone 기능을 비활성화한다고 알립니다.
Permissions-Policy: microphone=(self "https://example.re")
bfcache 적격성을 높이기 위해 unload 핸들러를 차단합니다. 이는 서드파티 스크립트와 확장 프로그램이 뒤로·앞으로 이동 성능을 떨어뜨리는 unload 이벤트를 등록하지 못하게 막습니다.
Permissions-Policy: unload=()
문제 해결
Permissions-Policy 위반은 대부분 조용히 나타나며, 차단된 기능은 눈에 보이는 브라우저 프롬프트 없이 거부 상태를 반환하거나 오류를 던집니다.
allow 속성이 없어 iframe에서 기능이 차단됩니다. 부모 페이지가 기능을 허용하더라도, 임베드된 iframe이 그 기능에 접근하려면 명시적인 allow 속성이 필요합니다. iframe 태그에 속성을 추가하십시오.
정책을 설정한 뒤 geolocation, 카메라, 마이크가 동작하지 않습니다. Permissions-Policy: geolocation=() 같은 정책은 페이지 자신을 포함한 모든 오리진에서 해당 기능을 비활성화합니다. 동일 출처에서만 기능을 허용하려면 geolocation=(self)를 사용하십시오. 특정 임베드 오리진까지 허용하려면 geolocation=(self “https://maps.example.re”)를 사용하십시오. 정책이 이미 거부한 기능에 대해 브라우저는 결코 사용자에게 묻지 않습니다.
와일드카드 *가 모든 기능에서 동작하지는 않습니다. 일부 기능은 * 허용 목록 값을 지원하지 않고 명시적인 오리진 목록으로 제한됩니다. *가 효과가 없을 때는 허용할 각 오리진을 개별적으로 지정하십시오. 인식되지 않거나 지원되지 않는 허용 목록 값에 대한 경고가 있는지 브라우저 콘솔을 확인하십시오.
Feature-Policy에서 Permissions-Policy로 마이그레이션하기. 레거시 Feature-Policy 헤더는 다른 구문을 씁니다. Feature-Policy: geolocation ‘self’ 대 Permissions-Policy: geolocation=(self) 처럼 다릅니다. 두 헤더가 모두 있으면 Permissions-Policy를 지원하는 브라우저는 Feature-Policy를 무시합니다. 헤더 이름을 바꾸고 구문을 변환하십시오. 공백을 =로 바꾸고, 오리진 목록을 괄호로 감싸고, self와 none을 둘러싼 작은따옴표를 없애십시오(‘none’ 대신 ()를 사용합니다).
document.featurePolicy.allowsFeature()로 디버깅하기. Chromium 기반 브라우저에서 DevTools 콘솔을 열고 document.featurePolicy.allowsFeature(‘camera’)를 실행하면 현재 컨텍스트에서 해당 기능이 허용되는지 확인할 수 있습니다. true 또는 false를 반환합니다. iframe 컨텍스트에서는 오리진을 두 번째 인수로 전달하십시오. document.featurePolicy.allowsFeature(‘camera’, ‘https://embed.example.re’) 처럼 씁니다. Firefox는 document.featurePolicy 대신 document.permissionsPolicy를 사용합니다.