Permissions-Policy

Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。

HTTP の Permissions-Policy レスポンスヘッダーは、文書または文書内の <iframe> 要素で、ブラウザーの機能を使用することを許可または拒否する仕組みを提供します。

詳しくは、権限ポリシーの記事を参照してください。

ヘッダー種別 レスポンスヘッダー
禁止リクエストヘッダー はい

構文

http
Permissions-Policy: <directive>=<allowlist>
<directive>

allowlist に適用される権限ポリシーディレクティブです。許可されているディレクティブ名の一覧は、以下のディレクティブを参照してください。

<allowlist>

許可リストとは、括弧内に次の値が空白で区切られて 1 つ以上含まれているオリジンのリストです。

* (ワイルドカード)

この機能は、この文書と、含まれるすべての閲覧コンテキスト (<iframe>) でオリジンに関係なく許可されます。

() (空の許可リスト)

この機能は最上位および含まれる閲覧コンテキストで無効になります。<iframe>allow 属性の同等機能は 'none' です。

self

この機能は、この文書と、含まれるすべての閲覧コンテキスト (<iframe>) のうち、同じオリジンのもののみで許可されます。オリジンをまたいだ文書内の組み込まれた閲覧コンテキストでは、この機能は許可されていません。 selfhttps://your-site.example.com の省略形と考えることができます。 <iframe>allow 属性の同等機能は self です。

src

この機能は、この <iframe> では許可されます。ただし、その src 属性に指定された URL と同じオリジンから読み込まれた文書であることが条件となります。この値は、 <iframe>allow 属性でのみ使用され、 <iframe> の既定の allowlist 値となります。

"<origin>"

この機能は特定のオリジン(例えば、 "https://a.example.com")で許可されます。オリジンは空白で区切ってください。ただし、 <iframe>allow 属性には引き継がれないことに注意してください。

* の値 (すべてのオリジンで有効) または () (すべてのオリジンで無効) は単独でのみ使用できますが、 selfsrc は一つ以上のオリジンと一緒に使用することができます。

メモ: ディレクティブには既定の許可リストがあり、 Permissions-Policy HTTP ヘッダーでは常に *selfnone のいずれかになります。これらは個々のディレクティブのリファレンスページで指定されています。 <iframe>allow 属性では、既定の動作は常に src です。

対応している場合、その権限ポリシーのオリジンにワイルドカードを含めることができます。 これには、許可リストに複数の異なるサブドメインを明示的に指定する代わりに、ワイルドカードを使用して単一のオリジンですべてのサブドメインを指定するという意味があります。

そのため以下のような指定は

http
("https://example.com" "https://a.example.com" "https://b.example.com" "https://c.example.com")

このように書き換えることができます。

http
("https://example.com" "https://*.example.com")

メモ: "https://*.example.com""https://example.com" とは一致しません。

ディレクティブ

accelerometer Experimental

現在の文書が、端末の加速度に関する情報を、 Accelerometer インターフェイスを通じて収集することを許可するかどうかを制御します。

ambient-light-sensor Experimental

現在の文書が、端末の周囲の環境における光量についての情報を、 AmbientLightSensor インターフェイスを通じて収集することを許可するかどうかを制御します。

attribution-reporting Experimental

現在の文書が帰属レポート API を使用することを許可するかどうかを制御します。

autoplay Experimental

現在の文書で HTMLMediaElement インターフェイスがメディアの自動再生をリクエストすることを無効にするかどうかを制御します。このポリシーが無効であり、ユーザーによる操作がなかった場合、 HTMLMediaElement.play() が返すプロミス (Promise) が DOMException で拒否されます。 <audio> および <video> 要素の autoplay 属性は無視されます。

bluetooth Experimental

Web Bluetooth API の使用を許可するかどうかを制御します。このポリシーが無効になっている場合、 Navigator.bluetooth が返す Bluetooth オブジェクトのメソッドは false を返すか、または返されたプロミス (Promise) を SecurityErrorDOMException で拒否します。

browsing-topics Experimental 非標準

トピック API へのアクセスを制御します。ポリシーでトピック API の使用が明確に禁止されている場合、 Document.browsingTopics() メソッドを呼び出そうとしたり、 Sec-Browsing-Topics ヘッダー付きのリクエストを送信しようとしても、 NotAllowedErrorDOMException で失敗します。

camera Experimental

現在の文書が動画入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、 getUserMedia() が返すプロミス (Promise) は NotAllowedErrorDOMException で拒否されます。

compute-pressure Experimental

圧力計算 API へのアクセスを制御します。

cross-origin-isolated Experimental

現在の文書がオリジン間分離として扱うことができるかどうかを制御します。

deferred-fetch Experimental

最上位ドメインの fetchLater() クオータの割り当てを制御します。

deferred-fetch-minimal Experimental

オリジン間で共有されるサブフレームの fetchLater() クオータの割り当てを制御します。

display-capture Experimental

現在の文書が getDisplayMedia() メソッドを使用して画面の内容をキャプチャすることを許可するかどうかを制御します。このポリシーが無効であれば、表示内容をキャプチャする許可がない場合、 getDisplayMedia() から返却されるプロミスが NotAllowedError で拒否されます。

document-domain Experimental

現在の文書が document.domain を設定することを許可するかどうかを制御します。このポリシーが無効な場合、 document.domain を設定しようとすると失敗し、 SecurityErrorDOMException が発生します。

encrypted-media Experimental

現在の文書が Encrypted Media Extensions API (EME) を使用することを許可するかどうかを制御します。このポリシーが無効であれば、 Navigator.requestMediaKeySystemAccess() から返却されたプロミス (Promise) が DOMException で拒否されます。

fullscreen Experimental

現在の文書が Element.requestFullscreen() を使用することを許可するかどうかを制御します。このポリシーが無効であれば、返却されたプロミス (Promise) が TypeError で拒否されます。

gamepad Experimental

現在の文書が Gamepad API を使用することを許可するかどうかを制御します。 このポリシーが無効であれば、 Navigator.getGamepads() の呼び出しで SecurityErrorDOMException が発生するようになり、 gamepadconnected および gamepaddisconnected イベントは発生しなくなります。

geolocation Experimental

現在の文書が Geolocation インターフェイスを使用することを許可するかどうかを制御します。このポリシーが無効であれば、 getCurrentPosition() および watchPosition() を呼び出すと、関数のコールバックが呼び出され、 PositionError コードが PERMISSION_DENIED になります。

gyroscope Experimental

現在の文書が Gyroscope インターフェイスを通じて、端末の方向に関する情報を収集することを許可するかどうかを制御します。

hid Experimental

現在の文書が WebHID API を使用して、代替キーボードやゲームパッドなどの一般的ではない、または特殊なヒューマンインターフェイス端末に接続することを許可するかどうかを制御します。

identity-credentials-get Experimental

現在の文書が連合資格情報管理 API (FedCM) の使用を許可されているかどうか、より具体的には identity オプション付きの navigator.credentials.get() メソッドの使用を許可されているかどうかを制御します。このポリシーで API の使用が禁止されている場合、 get() 呼び出しによって返されるプロミス (Promise) が NotAllowedErrorDOMException で拒否されます。

idle-detection Experimental

現在の文書が、ユーザーが端末と通信していることを検出するアイドル検出 API が利用可能かどうかを制御します。例えば、チャットアプリケーションで「在席中」/「離席中」の状態を報告する場合などです。

local-fonts Experimental

現在の文書が、 Window.queryLocalFonts() メソッド(ローカルフォントアクセス API も参照)を介して、ユーザーのローカルにインストールされたフォントに関するデータを収集することを許可するかどうかを制御します。

magnetometer Experimental

現在の文書が Magnetometer インターフェイスを通じて、端末の方向に関する情報を収集することを許可するかどうかを制御します。

microphone Experimental

現在の文書がオーディオ入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、 MediaDevices.getUserMedia() で返却されたプロミス (Promise) が NotAllowedErrorDOMException で拒否されます。

midi Experimental

現在の文書が Web MIDI API を使用することを許可するかどうかを制御します。このポリシーが無効であれば、 Navigator.requestMIDIAccess() から返却されたプロミス (Promise) が DOMException で拒否されます。

otp-credentials Experimental

現在の文書が、 WebOTP API を使用して、アプリのサーバーから送信された特別に書式化された SMS メッセージからワンタイムパスワード (OTP) をリクエストすること、すなわち navigator.credentials.get({otp: ..., ...}) を許可するかどうかを制御します。

payment Experimental

現在の文書が決済リクエスト API を使用することを許可するかどうかを制御します。このポリシーが有効であれば、 PaymentRequest() コンストラクターで SecurityErrorDOMException が発生します。

picture-in-picture Experimental

現在の文書が、該当する API を使用してピクチャインピクチャモードで動画を再生することを許可するかどうかを制御します。

publickey-credentials-create Experimental

現在の文書がウェブ認証 API を使用して、新しい非対称キー資格情報を作成すること、すなわち navigator.credentials.create({publicKey: ..., ...}) を許可するかどうかを制御します。

publickey-credentials-get Experimental

現在の文書がウェブ認証 API を使用して、すでに保存されている公開鍵資格情報を再取得すること、すなわち navigator.credentials.get({publicKey: ..., ...}) を許可するかどうかを制御します 。

screen-wake-lock Experimental

現在の文書が画面起動ロック API を使用して、端末が画面をオフにしたり暗くしたりしてはいけないことを示すことを許可するかどうかを制御します。

serial Experimental

現在の文書が、ウェブシリアル API を使用して、シリアルポートに直接接続されたシリアル機器、またはシリアルポートをエミュレートする USB または Bluetooth 機器と通信することを許可するかどうかを制御します。

speaker-selection Experimental

現在の文書がオーディオ出力機器 API を使用して、スピーカーを列挙したり選択したりすることを許可するかどうかを制御します。

storage-access Experimental

サードパーティのコンテキスト(すなわち、 <iframe> に埋め込まれた)で読み込まれた文書内のストレージアクセス API を使用して、分離されていないクッキーにアクセスすることを許可するかどうかを制御します。

usb Experimental

現在の文書が WebUSB API を使用することを許可するかどうかを制御します。

web-share Experimental

現在の文書が Web Share API の Navigator.share() を使用して、テキスト、リンク、画像、その他のコンテンツをモバイルアプリなどのユーザーが任意に選択した任意の場所に共有することを許可するかどうかを制御します。

window-management Experimental

現在の文書が、ウィンドウ管理 API を使用して複数のディスプレイ上のウィンドウを管理することを許可するかどうかを制御します。

xr-spatial-tracking Experimental

現在の文書が WebXR Device API を使用して WebXR セッションと対話することを許可するかどうかを制御します。

基本的な用途

Permissions-Policy ヘッダー

すべてのオリジンが位置情報にアクセスできるようにするには、次のようにします。

http
Permissions-Policy: geolocation=*

または、一部のオリジンにアクセスできるようにするには、次のようにします。

http
Permissions-Policy: geolocation=(self "https://a.example.com" "https://b.example.com")

ヘッダーにカンマ区切りで掲載されているポリシーのリストを送信するか、または各ポリシーに対して別個のヘッダーを送信することで、同時に複数の機能を制御することができます。

例えば、次のものは同等です。

http
Permissions-Policy: picture-in-picture=(), geolocation=(self https://example.com/), camera=*

Permissions-Policy: picture-in-picture=()
Permissions-Policy: geolocation=(self https://example.com/)
Permissions-Policy: camera=*

iframe

<iframe> が機能を有効にするためには、その許可されたオリジンが親ページのにも含まれていなければなりません。 この継承の動作のため、 HTTP ヘッダーで機能の最も受け入れられるサポートを指定し、その後、それぞれの <iframe> で必要なサポートのサブセットを指定するのが良い考えです。

すべてのオリジンが位置情報にアクセスできるようにするには、次のようにします。

html
<iframe src="https://example.com" allow="geolocation *"></iframe>

現在のオリジンやそれ以外にもポリシーを適用するには、次のようにします。

html
<iframe
  src="https://example.com"
  allow="geolocation 'self' https://a.example.com https://b.example.com"></iframe>

これは重要です。既定では、<iframe> が別のオリジンに移動する場合、その <iframe> の移動先のオリジンにはポリシーが適用されません。 allow 属性に <iframe> の移動先のオリジンが掲載されている場合、元の <iframe> に適用された権限ポリシーが、その <iframe> の移動先のオリジンにも適用されます。

セミコロンで区切られたポリシーディレクティブのリストを allow 属性内に記載することで、同時に複数の機能を制御することができます。

html
<iframe
  src="https://example.com"
  allow="geolocation 'self' https://a.example.com https://b.example.com; fullscreen 'none'"></iframe>

src 値について特に言及する価値があります。上記で述べたように、この許可リスト値を使用すると、 src 属性の URL と同じオリジンから読み込まれた文書である限り、関連付けられた機能がこの <iframe> で許可されることになります。この値は、 allow に列挙された機能の既定の allowlist 値であるため、次のものは同等です。

html
<iframe src="https://example.com" allow="geolocation 'src'">
  <iframe src="https://example.com" allow="geolocation"></iframe
></iframe>

強力な機能へのアクセスを拒否する

SecureCorp Inc. が、アプリケーションでマイクと位置情報 API を無効にしたがっているとします。以下の権限ポリシーを設定する HTTP レスポンスヘッダーを配信することで実現できます。

http
Permissions-Policy: microphone=(), geolocation=()

オリジンのリストに () キーワードを指定すると、指定された機能がオリジンに関係なく、すべての閲覧コンテキスト (すべての <iframe> を含む) で無効になります。

HTTP ヘッダーと <iframe> のポリシーの組み合わせ

例えば、自分自身のオリジンや、信頼できる広告ネットワークから配信される埋め込みコンテンツで、位置情報の利用を可能にしたいとします。 ページ全体に適用される権限ポリシーを次のように設定することができます。

http
Permissions-Policy: geolocation=(self https://trusted-ad-network.com)

広告の <iframe> では、このようにして https://trusted-ad-network.com 元にアクセスするように設定することができます。

html
<iframe src="https://trusted-ad-network.com" allow="geolocation"></iframe>

結果的に異なるオリジンが <iframe> に読み込まれた場合、そのオリジンは位置情報にアクセスすることはできません。

html
<iframe src="https://rogue-origin-example.com" allow="geolocation"></iframe>

仕様書

Specification
Permissions Policy
# permissions-policy-http-header-field

ブラウザーの互換性

関連情報