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-Policy
HTTP ヘッダーでは常に*
、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"
とは一致しません。
ディレクティブ
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
) をSecurityError
のDOMException
で拒否します。 browsing-topics
Experimental 非標準-
トピック API へのアクセスを制御します。ポリシーでトピック API の使用が明確に禁止されている場合、
Document.browsingTopics()
メソッドを呼び出そうとしたり、Sec-Browsing-Topics
ヘッダー付きのリクエストを送信しようとしても、NotAllowedError
のDOMException
で失敗します。 camera
Experimental-
現在の文書が動画入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
getUserMedia()
が返すプロミス (Promise
) はNotAllowedError
のDOMException
で拒否されます。 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
を設定しようとすると失敗し、SecurityError
のDOMException
が発生します。 encrypted-media
Experimental-
現在の文書が Encrypted Media Extensions API (EME) を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
Navigator.requestMediaKeySystemAccess()
から返却されたプロミス (Promise
) がDOMException
で拒否されます。 fullscreen
Experimental-
現在の文書が
Element.requestFullscreen()
を使用することを許可するかどうかを制御します。このポリシーが無効であれば、返却されたプロミス (Promise
) がTypeError
で拒否されます。 gamepad
Experimental-
現在の文書が Gamepad API を使用することを許可するかどうかを制御します。 このポリシーが無効であれば、
Navigator.getGamepads()
の呼び出しでSecurityError
のDOMException
が発生するようになり、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
) がNotAllowedError
のDOMException
で拒否されます。 idle-detection
Experimental-
現在の文書が、ユーザーが端末と通信していることを検出するアイドル検出 API が利用可能かどうかを制御します。例えば、チャットアプリケーションで「在席中」/「離席中」の状態を報告する場合などです。
local-fonts
Experimental-
現在の文書が、
Window.queryLocalFonts()
メソッド(ローカルフォントアクセス API も参照)を介して、ユーザーのローカルにインストールされたフォントに関するデータを収集することを許可するかどうかを制御します。 magnetometer
Experimental-
現在の文書が
Magnetometer
インターフェイスを通じて、端末の方向に関する情報を収集することを許可するかどうかを制御します。 microphone
Experimental-
現在の文書がオーディオ入力機器を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
MediaDevices.getUserMedia()
で返却されたプロミス (Promise
) がNotAllowedError
のDOMException
で拒否されます。 midi
Experimental-
現在の文書が Web MIDI API を使用することを許可するかどうかを制御します。このポリシーが無効であれば、
Navigator.requestMIDIAccess()
から返却されたプロミス (Promise
) がDOMException
で拒否されます。 otp-credentials
Experimental-
現在の文書が、 WebOTP API を使用して、アプリのサーバーから送信された特別に書式化された SMS メッセージからワンタイムパスワード (OTP) をリクエストすること、すなわち
navigator.credentials.get({otp: ..., ...})
を許可するかどうかを制御します。 payment
Experimental-
現在の文書が決済リクエスト API を使用することを許可するかどうかを制御します。このポリシーが有効であれば、
PaymentRequest()
コンストラクターでSecurityError
のDOMException
が発生します。 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 API の
Navigator.share()
を使用して、テキスト、リンク、画像、その他のコンテンツをモバイルアプリなどのユーザーが任意に選択した任意の場所に共有することを許可するかどうかを制御します。 window-management
Experimental-
現在の文書が、ウィンドウ管理 API を使用して複数のディスプレイ上のウィンドウを管理することを許可するかどうかを制御します。
xr-spatial-tracking
Experimental-
現在の文書が 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 |