Permissions-Policy
Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。
HTTP の Permissions-Policy レスポンスヘッダーは、文書または文書内の <iframe> 要素で、ブラウザーの機能を使用することを許可または拒否する仕組みを提供します。
詳しくは、権限ポリシーの記事を参照してください。
| ヘッダー種別 | レスポンスヘッダー |
|---|---|
| 禁止リクエストヘッダー | はい |
構文
Permissions-Policy: <directive>=<allowlist>
<directive>-
allowlistに適用される権限ポリシーディレクティブです。許可されているディレクティブ名の一覧は、以下のディレクティブを参照してください。 <allowlist>-
許可リストとは、括弧内に次の値が空白で区切られて 1 つ以上含まれているオリジンのリストです。
*(ワイルドカード)-
この機能は、この文書と、含まれるすべての閲覧コンテキスト (
<iframe>) でオリジンに関係なく許可されます。 ()(空の許可リスト)-
この機能は最上位および含まれる閲覧コンテキストで無効になります。
<iframe>のallow属性の同等機能は'none'です。 self-
この機能は、この文書と、含まれるすべての閲覧コンテキスト (
<iframe>) のうち、同じオリジンのもののみで許可されます。オリジンをまたいだ文書内の組み込まれた閲覧コンテキストでは、この機能は許可されていません。selfはhttps://your-site.example.comの省略形と考えることができます。<iframe>のallow属性の同等機能はselfです。 src-
この機能は、この
<iframe>では許可されます。ただし、その src 属性に指定された URL と同じオリジンから読み込まれた文書であることが条件となります。この値は、<iframe>のallow属性でのみ使用され、<iframe>の既定のallowlist値となります。 "<origin>"-
この機能は特定のオリジン(例えば、
"https://a.example.com")で許可されます。オリジンは空白で区切ってください。ただし、<iframe>のallow属性には引き継がれないことに注意してください。
*の値 (すべてのオリジンで有効) または()(すべてのオリジンで無効) は単独でのみ使用できますが、selfとsrcは一つ以上のオリジンと一緒に使用することができます。メモ: ディレクティブには既定の許可リストがあり、
Permissions-PolicyHTTP ヘッダーでは常に*、self、noneのいずれかになります。これらは個々のディレクティブのリファレンスページで指定されています。<iframe>のallow属性では、既定の動作は常にsrcです。
対応している場合、その権限ポリシーのオリジンにワイルドカードを含めることができます。 これには、許可リストに複数の異なるサブドメインを明示的に指定する代わりに、ワイルドカードを使用して単一のオリジンですべてのサブドメインを指定するという意味があります。
そのため以下のような指定は
("https://example.com" "https://a.example.com" "https://b.example.com" "https://c.example.com")
このように書き換えることができます。
("https://example.com" "https://*.example.com")
メモ:
"https://*.example.com" は "https://example.com" とは一致しません。
ディレクティブ
accelerometerExperimental-
現在の文書が、端末の加速度に関する情報を、
Accelerometerインターフェイスを通じて収集することを許可するかどうかを制御します。 ambient-light-sensorExperimental-
現在の文書が、端末の周囲の環境における光量についての情報を、
AmbientLightSensorインターフェイスを通じて収集することを許可するかどうかを制御します。 attribution-reportingExperimental-
現在の文書が帰属レポート API を使用することを許可するかどうかを制御します。
autoplayExperimental-
現在の文書で
HTMLMediaElementインターフェイスがメディアの自動再生をリクエストすることを無効にするかどうかを制御します。このポリシーが無効であり、ユーザーによる操作がなかった場合、HTMLMediaElement.play()が返すプロミス (Promise) がDOMExceptionで拒否されます。<audio>および<video>要素のautoplay属性は無視されます。 bluetoothExperimental-
Web Bluetooth API の使用を許可するかどうかを制御します。このポリシーが無効になっている場合、
Navigator.bluetoothが返すBluetoothオブジェクトのメソッドはfalseを返すか、または返されたプロミス (Promise) をSecurityErrorのDOMExceptionで拒否します。 browsing-topicsExperimental 非標準-
トピック API へのアクセスを制御します。ポリシーでトピック API の使用が明確に禁止されている場合、
Document.browsingTopics()メソッドを呼び出そうとしたり、Sec-Browsing-Topicsヘッダー付きのリクエストを送信しようとしても、NotAllowedErrorのDOMExceptionで失敗します。 cameraExperimental-
現在の文書が動画入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
getUserMedia()が返すプロミス (Promise) はNotAllowedErrorのDOMExceptionで拒否されます。 compute-pressureExperimental-
圧力計算 API へのアクセスを制御します。
cross-origin-isolatedExperimental-
現在の文書がオリジン間分離として扱うことができるかどうかを制御します。
deferred-fetchExperimental-
最上位ドメインの
fetchLater()クオータの割り当てを制御します。 deferred-fetch-minimalExperimental-
オリジン間で共有されるサブフレームの
fetchLater()クオータの割り当てを制御します。 display-captureExperimental-
現在の文書が
getDisplayMedia()メソッドを使用して画面の内容をキャプチャすることを許可するかどうかを制御します。このポリシーが無効であれば、表示内容をキャプチャする許可がない場合、getDisplayMedia()から返却されるプロミスがNotAllowedErrorで拒否されます。 document-domainExperimental-
現在の文書が
document.domainを設定することを許可するかどうかを制御します。このポリシーが無効な場合、document.domainを設定しようとすると失敗し、SecurityErrorのDOMExceptionが発生します。 encrypted-mediaExperimental-
現在の文書が Encrypted Media Extensions API (EME) を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
Navigator.requestMediaKeySystemAccess()から返却されたプロミス (Promise) がDOMExceptionで拒否されます。 fullscreenExperimental-
現在の文書が
Element.requestFullscreen()を使用することを許可するかどうかを制御します。このポリシーが無効であれば、返却されたプロミス (Promise) がTypeErrorで拒否されます。 gamepadExperimental-
現在の文書が Gamepad API を使用することを許可するかどうかを制御します。 このポリシーが無効であれば、
Navigator.getGamepads()の呼び出しでSecurityErrorのDOMExceptionが発生するようになり、gamepadconnectedおよびgamepaddisconnectedイベントは発生しなくなります。 geolocationExperimental-
現在の文書が
Geolocationインターフェイスを使用することを許可するかどうかを制御します。このポリシーが無効であれば、getCurrentPosition()およびwatchPosition()を呼び出すと、関数のコールバックが呼び出され、PositionErrorコードがPERMISSION_DENIEDになります。 gyroscopeExperimental-
現在の文書が
Gyroscopeインターフェイスを通じて、端末の方向に関する情報を収集することを許可するかどうかを制御します。 hidExperimental-
現在の文書が WebHID API を使用して、代替キーボードやゲームパッドなどの一般的ではない、または特殊なヒューマンインターフェイス端末に接続することを許可するかどうかを制御します。
identity-credentials-getExperimental-
現在の文書が連合資格情報管理 API (FedCM) の使用を許可されているかどうか、より具体的には
identityオプション付きのnavigator.credentials.get()メソッドの使用を許可されているかどうかを制御します。このポリシーで API の使用が禁止されている場合、get()呼び出しによって返されるプロミス (Promise) がNotAllowedErrorのDOMExceptionで拒否されます。 idle-detectionExperimental-
現在の文書が、ユーザーが端末と通信していることを検出するアイドル検出 API が利用可能かどうかを制御します。例えば、チャットアプリケーションで「在席中」/「離席中」の状態を報告する場合などです。
local-fontsExperimental-
現在の文書が、
Window.queryLocalFonts()メソッド(ローカルフォントアクセス API も参照)を介して、ユーザーのローカルにインストールされたフォントに関するデータを収集することを許可するかどうかを制御します。 magnetometerExperimental-
現在の文書が
Magnetometerインターフェイスを通じて、端末の方向に関する情報を収集することを許可するかどうかを制御します。 microphoneExperimental-
現在の文書がオーディオ入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
MediaDevices.getUserMedia()で返却されたプロミス (Promise) がNotAllowedErrorのDOMExceptionで拒否されます。 midiExperimental-
現在の文書が Web MIDI API を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
Navigator.requestMIDIAccess()から返却されたプロミス (Promise) がDOMExceptionで拒否されます。 otp-credentialsExperimental-
現在の文書が、 WebOTP API を使用して、アプリのサーバーから送信された特別に書式化された SMS メッセージからワンタイムパスワード (OTP) をリクエストすること、すなわち
navigator.credentials.get({otp: ..., ...})を許可するかどうかを制御します。 paymentExperimental-
現在の文書が決済リクエスト API を使用することを許可するかどうかを制御します。このポリシーが有効であれば、
PaymentRequest()コンストラクターでSecurityErrorのDOMExceptionが発生します。 picture-in-pictureExperimental-
現在の文書が、該当する API を使用してピクチャインピクチャモードで動画を再生することを許可するかどうかを制御します。
publickey-credentials-createExperimental-
現在の文書がウェブ認証 API を使用して、新しい非対称キー資格情報を作成すること、すなわち
navigator.credentials.create({publicKey: ..., ...})を許可するかどうかを制御します。 publickey-credentials-getExperimental-
現在の文書がウェブ認証 API を使用して、すでに保存されている公開鍵資格情報を再取得すること、すなわち
navigator.credentials.get({publicKey: ..., ...})を許可するかどうかを制御します 。 screen-wake-lockExperimental-
現在の文書が画面起動ロック API を使用して、端末が画面をオフにしたり暗くしたりしてはいけないことを示すことを許可するかどうかを制御します。
serialExperimental-
現在の文書が、ウェブシリアル API を使用して、シリアルポートに直接接続されたシリアル機器、またはシリアルポートをエミュレートする USB または Bluetooth 機器と通信することを許可するかどうかを制御します。
speaker-selectionExperimental-
現在の文書がオーディオ出力機器 API を使用して、スピーカーを列挙したり選択したりすることを許可するかどうかを制御します。
storage-accessExperimental-
サードパーティのコンテキスト(すなわち、
<iframe>に埋め込まれた)で読み込まれた文書内のストレージアクセス API を使用して、分離されていないクッキーにアクセスすることを許可するかどうかを制御します。 usbExperimental-
現在の文書が WebUSB API を使用することを許可するかどうかを制御します。
-
現在の文書が Web Share API の
Navigator.share()を使用して、テキスト、リンク、画像、その他のコンテンツをモバイルアプリなどのユーザーが任意に選択した任意の場所に共有することを許可するかどうかを制御します。 window-managementExperimental-
現在の文書が、ウィンドウ管理 API を使用して複数のディスプレイ上のウィンドウを管理することを許可するかどうかを制御します。
xr-spatial-trackingExperimental-
現在の文書が WebXR Device API を使用して WebXR セッションと対話することを許可するかどうかを制御します。
例
>基本的な用途
Permissions-Policy ヘッダー
すべてのオリジンが位置情報にアクセスできるようにするには、次のようにします。
Permissions-Policy: geolocation=*
または、一部のオリジンにアクセスできるようにするには、次のようにします。
Permissions-Policy: geolocation=(self "https://a.example.com" "https://b.example.com")
ヘッダーにカンマ区切りで掲載されているポリシーのリストを送信するか、または各ポリシーに対して別個のヘッダーを送信することで、同時に複数の機能を制御することができます。
例えば、次のものは同等です。
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> で必要なサポートのサブセットを指定するのが良い考えです。
すべてのオリジンが位置情報にアクセスできるようにするには、次のようにします。
<iframe src="https://example.com" allow="geolocation *"></iframe>
現在のオリジンやそれ以外にもポリシーを適用するには、次のようにします。
<iframe
src="https://example.com"
allow="geolocation 'self' https://a.example.com https://b.example.com"></iframe>
これは重要です。既定では、<iframe> が別のオリジンに移動する場合、その <iframe> の移動先のオリジンにはポリシーが適用されません。 allow 属性に <iframe> の移動先のオリジンが掲載されている場合、元の <iframe> に適用された権限ポリシーが、その <iframe> の移動先のオリジンにも適用されます。
セミコロンで区切られたポリシーディレクティブのリストを allow 属性内に記載することで、同時に複数の機能を制御することができます。
<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 値であるため、次のものは同等です。
<iframe src="https://example.com" allow="geolocation 'src'">
<iframe src="https://example.com" allow="geolocation"></iframe
></iframe>
強力な機能へのアクセスを拒否する
SecureCorp Inc. が、アプリケーションでマイクと位置情報 API を無効にしたがっているとします。以下の権限ポリシーを設定する HTTP レスポンスヘッダーを配信することで実現できます。
Permissions-Policy: microphone=(), geolocation=()
オリジンのリストに () キーワードを指定すると、指定された機能がオリジンに関係なく、すべての閲覧コンテキスト (すべての <iframe> を含む) で無効になります。
HTTP ヘッダーと <iframe> のポリシーの組み合わせ
例えば、自分自身のオリジンや、信頼できる広告ネットワークから配信される埋め込みコンテンツで、位置情報の利用を可能にしたいとします。 ページ全体に適用される権限ポリシーを次のように設定することができます。
Permissions-Policy: geolocation=(self https://trusted-ad-network.com)
広告の <iframe> では、このようにして https://trusted-ad-network.com 元にアクセスするように設定することができます。
<iframe src="https://trusted-ad-network.com" allow="geolocation"></iframe>
結果的に異なるオリジンが <iframe> に読み込まれた場合、そのオリジンは位置情報にアクセスすることはできません。
<iframe src="https://rogue-origin-example.com" allow="geolocation"></iframe>
仕様書
| Specification |
|---|
| Permissions Policy> # permissions-policy-http-header-field> |
ブラウザーの互換性
Loading…