Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、他の仕様がブラウザー権限と連携するために利用できる共通インフラストラクチャを定義します。これらの権限は、ユーザーがプラットフォームの「強力な機能」へのアクセスを許可または拒否する選択を表します。開発者向けに、本仕様は強力な機能の権限状態を照会し、その権限状態が変更された場合に通知を受け取るためのAPIを標準化します。
このセクションは、本書が公開された時点での文書のステータスを示します。現在のW3C 公開物と、この技術レポートの最新リビジョンは W3C 標準・草案一覧で確認できます。
本仕様は進行中の作業です。
この文書はWebアプリケーションセキュリティ作業グループによって 勧告トラックで作業草案として公開されました。
作業草案としての公開は W3Cおよびそのメンバーによる支持を意味するものではありません。
この文書はドラフトであり、随時更新・置換・廃止される可能性があります。他の文書の引用には適切ではありません。
本書は W3C 特許ポリシーの下で活動するグループによって作成されました。 W3Cは グループ成果物に関連する特許開示の公開リスト を管理しています。このページには特許開示の方法も記載されています。ある個人が「必須クレーム」を含むと考える特許について実際の知識がある場合、その情報は W3C特許ポリシー第6章に従って開示しなければなりません。
この文書は 2025年8月18日 W3Cプロセス文書に従います。
このセクションは規範的ではありません。
仕様は、強力な機能として明示的に識別される機能を定義できます。これらの機能は、プライバシー、セキュリティ、およびパフォーマンスに大きな影響を与える可能性があることから「強力」とされます。そのため、ユーザーはユーザーエージェントがサイトによるこれらの機能の利用を明示的な許可があるまで拒否することを頼りにしており、通常はこの能力が一定期間のみ付与されます。サイトに強力な機能の利用を許可する明示的な許可は、主にブラウザーUIを通じて与えられ、管理されます(下図参照)。
この意味で、権限は特定の機能、特に「強力な機能」に対するユーザー同意の現在の状態を表します。最終的にはユーザーがこれらの権限を管理する権利を持ち、手動で権限を付与・拒否できます。さらに、ユーザーエージェントは、煩わしい権限プロンプトを非表示にしたり自動的に拒否したり、一定期間サイトを訪問しない場合に付与済みの権限を自動で失効させるなど、権限管理を支援します。
このセクションは規範的ではありません。
この例では、Permissions API を使い、ローカルニュースをGeolocation APIで表示するか、機能追加ボタンを表示するかを決定します。
const { state } = await navigator.permissions.query({
name: "geolocation"
});
switch (state) {
case "granted":
showLocalNewsWithGeolocation();
break;
case "prompt":
showButtonToEnableLocalNews();
break;
case "denied":
showNationalNews();
break;
}
この例では"geolocation"
および"notifications"
強力な機能の状態を同時に確認しています:
const queryPromises = ["geolocation", "notifications"].map(
name => navigator.permissions.query({ name })
);
for await (const status of queryPromises) {
console.log(`${status.name}: ${status.state}`);
}
この例は利用可能なカメラの権限状態を確認しています。
const devices = await navigator.mediaDevices.enumerateDevices();
// ビデオ入力のみ抽出し、クエリオブジェクトに変換
const queries = devices
.filter(({ kind }) => kind === "videoinput")
.map(({ deviceId }) => ({ name: "camera", deviceId }));
const promises = queries.map((queryObj) =>
navigator.permissions.query(queryObj)
);
try {
const results = await Promise.all(promises);
// 各カメラの状態をログ出力
results.forEach(({ state }, i) => console.log("Camera", i, state));
} catch (error) {
console.error(error);
}
このセクションでは、Webプラットフォーム上で権限を使って強力な機能を利用するためのモデルを規定します。
権限は、ユーザーがウェブアプリケーションに強力な機能の利用を許可するかどうかの意思決定を表します。この決定は権限の状態として表現されます。
明示的な許可は、ユーザーがウェブアプリケーションに許可を与え、強力な機能を利用できるようにすることを指します。
概念的には、permission の powerful feature は、次のいずれかの 状態 になり得ます:
ユーザー意図に関する新情報を特定するために、ユーザーエージェントはユーザーの意図に関する情報を収集・解釈する場合があります。この情報は、明示的なユーザー操作、当該ユーザーや他のユーザーの集約的行動、またはこの仕様が予期しない暗黙的シグナルから得られます。
すべての権限には存続期間があり、特定の権限が"granted"であり続ける期間を示します。期間が終了するとデフォルト状態に戻ります。存続期間は、特定のRealmが破棄されるまで、トップレベルのブラウジングコンテキストが破棄されるまで、一定期間、または無限など、さまざまです。期間はエンドユーザーとユーザーエージェント間で、強力な機能の明示的な許可(通常は権限UIやユーザーエージェントのポリシー)付与時に交渉されます。
すべての権限にはデフォルト状態(通常は"prompt")があり、ユーザーがまだ機能の明示的な許可を与えていないか、存続期間が切れてリセットされた場合の状態です。
ユーザーエージェントは単一のパーミッションストアを保持します。これはリストであり、パーミッションストアエントリの集まりです。各エントリは、そのディスクリプタとキーによって識別され、このリストに最大1回のみ現れます。
ユーザーエージェントは、任意で、各エントリをパーミッションストアから削除することができます。これは、それぞれのパーミッションの有効期間が満了した場合に限ります。
パーミッションストアエントリとは、タプルであり、PermissionDescriptor
ディスクリプタ、パーミッションキーキー、そして状態状態の組み合わせです。
パーミッションストアエントリを取得するためには、
PermissionDescriptor
descriptor と パーミッションキー
key を与えられた場合、以下を実行します:
パーミッションストアエントリを設定するためには、
PermissionDescriptor
descriptor、パーミッションキー
key、
そして状態 stateが与えられた場合、次の手順を実行します:
パーミッションストアエントリを削除するためには、
PermissionDescriptor
descriptor と パーミッションキー
key が与えられた場合、次の手順を実行します:
パーミッションキーは、各機能のパーミッションキー型によって型が定義されます。
パーミッションキー key1が、等しいかどうかを判断するには、パーミッションキー key2、および
PermissionDescriptor
descriptor が与えられた場合、次の手順を実行します:
name
で指定された機能名に対して、key1とkey2を渡して実行した結果を返します。
強力な機能は、ユーザーが明示的な許可を与えなければ利用できないWebプラットフォーム機能(通常はAPI)です。通知API現行標準など一部例外を除き、ほとんどの強力な機能はポリシー制御機能でもあります。ポリシー制御機能でもある強力な機能については、[Permissions-Policy]が、文書が特定の機能を利用できるかどうかを制御します。つまり、強力な機能は、対応するポリシー制御機能によって権限が委譲された場合にのみ、ユーザーから明示的な許可の要求が可能となります(下記例参照)。以降は、ユーザーが"granted"権限を持つか、権限付与と同等の条件を満たすことで機能利用が可能となります。
強力な機能は文字列リテラル(例: "geolocation")で表される名前によって識別されます。
ユーザーエージェントは、ユーザーがどの強力な機能の権限を持つかを環境設定オブジェクトで追跡します。
各強力な機能は、追加の側面を0個以上定義できます。側面はWebIDL辞書として定義され、PermissionDescriptorの継承を利用し、その機能の権限ディスクリプタ型となります。
適合する仕様が強力な機能を仕様化する場合、次を行う:
PermissionDescriptor
を継承)を定義する。
新たに仕様化された強力な機能をPermissions Registryに登録することで、本作業グループがフィードバックを提供し、仕様との統合が適切に行われているか確認できます。
PermissionDescriptor
またはそのサブタイプ。未指定の場合は
PermissionDescriptor
となります。
機能はディスクリプタインスタンスに部分順序を定義できます。descriptorAがstronger
than(より強い)descriptorBの場合、descriptorAの
権限状態が"granted
"なら、descriptorBの権限状態も"granted
"とし、descriptorBの権限状態が"denied
"なら、descriptorAの権限状態も
"denied
"でなければなりません。
一部の強力な機能には、PermissionState
以外に追加情報が関連付けられています。各機能は追加権限データ型を定義します。
例えば、getUserMedia
()
は、ユーザーがどのカメラの利用を許可したか判定する必要があります。
DOMString
nameがこれらの機能の一つの場合、nameの
追加権限データ(任意の環境設定オブジェクト
settings)は次のアルゴリズムで得られる:
指定されていれば、この機能の追加権限データアルゴリズムが利用可能です。
PermissionStatus
またはそのサブタイプ。未指定の場合は
PermissionStatus
となります。
権限ディスクリプタ型インスタンスと、新規または既存の権限結果型インスタンスを受け取り、クエリ結果で権限結果型インスタンスを更新する。Permissions
のquery
(permissionDesc)
メソッドや
PermissionStatus
更新手順で利用。未指定の場合はデフォルト権限クエリアルゴリズムとなる。
デフォルト権限クエリアルゴリズムは、
PermissionDescriptor
permissionDescとPermissionStatus
statusを受け取り、次の手順を実行:
機能が使用する権限キーの型。デフォルトはorigin。独自の権限キー型を指定する場合は、 権限キー生成アルゴリズムも必須です。
オリジン origin と オリジン embedded origin を受け取り、新しい 許可キー を返します。指定されていない場合、これは デフォルト許可キー生成アルゴリズム になります。カスタムの 許可キー生成アルゴリズム を指定する機能は、必ず 許可キー比較アルゴリズム も指定しなければなりません。
2つの権限キーを受け取り、両者が等価かどうかの真偽値を返します。未指定の場合、デフォルト権限キー比較アルゴリズムとなります。
引数なし。権限状態や追加権限データの変更結果と同期すべき実装の他部分を更新します。
未指定の場合、権限取り消しへの反応を実行します。
複数の強力な機能を定義する仕様は、各機能に最適な権限の存続期間の提案が望ましいです(推奨)。期間決定の指針は下記注記参照(ユーザープライバシー重視)。未指定の場合はユーザーエージェントが期間を提供します。
オリジンの権限存続期間が切れた場合:
デフォルト強力な機能は、上記すべての型・アルゴリズムがデフォルト値である強力な機能である。
現在の権限状態を取得するには、name nameと任意の
環境設定オブジェクト
settingsを受け取り、以下の手順を実行する。このアルゴリズムはPermissionState
列挙値を返す。
PermissionDescriptor
のname
をnameで初期化する。
descriptorの権限状態は、任意の
環境設定オブジェクト
settingsを受け取り、以下のアルゴリズムを実行する。PermissionState
列挙値を返す:
denied
"を返す。
name
とする。
Document
を持つ場合、以下を実行:
Document
とする。
denied
"を返す。
PermissionState
列挙値を返す。
PermissionState
列挙値を、descriptorのname
の権限状態制約も考慮して返す。
簡易表現として、DOMString
nameの権限状態は、PermissionDescriptor
のname
にnameを設定したものの権限状態である。
descriptorに対して利用権限を要求するには、UAは以下の手順を実行する。このアルゴリズムは"granted
"または"denied
"を返す。
prompt
"でなければ、
current stateを返し、以降の手順を中止する。
granted
"に、そうでなければ"denied
"にする。ユーザー操作によってユーザー意図の新情報が得られる場合がある。
権限UIやUAがユーザー意図をどう推定するかの詳細はあえて曖昧にしている。この枠組みの中で様々なUIをUAが試せるようにしている。
簡略表記として、利用許可をリクエストする際に、DOMString
nameを指定することは、
利用許可をリクエストするために、PermissionDescriptor
の
name
メンバーにnameを設定したものと同じ意味となります。
ユーザーへの選択プロンプトは、options(descriptorに関連付け)と、任意のboolean
allowMultiple(デフォルトfalse)を受け、UAは以下の手順を実行する。このアルゴリズムは"denied
"またはユーザーの選択を返す。
denied
"なら、
"denied
"を返し、以降の手順を中止する。
granted
"なら、
UAはoptionsの中からユーザーが選択した1つ(allowMultipleがtrueなら複数)の値を返し、以降の手順を中止できる。プロンプトせずに返した場合、同じ選択肢・同じdescriptorで再度プロンプトした場合も同じ選択肢を返さなければならない(ただしユーザー意図の新情報取得時を除く)。
denied
"を返す。
権限UIやUAがユーザー意図をどう推定するかの詳細はあえて曖昧にしている。この枠組みの中で様々なUI(例:プロンプトがタイムアウトして自動的に"denied"を返すなど)をUAが試せるようにしている。
簡易表現として、ユーザーへの選択プロンプトをDOMString
nameの選択肢で行う場合は、
PermissionDescriptor
のname
にnameを設定したものの選択肢で行うことと同じ。
UAが、ユーザーがdescriptor(PermissionDescriptor
)で記述された機能の権限付与をもはや望まなくなったことを知った場合、権限取り消しへの反応として以下を実行する:
name
に対応する権限取り消しアルゴリズムを実行する。
WebIDL[Exposed=(Window,Worker)]
interface Permissions
{
Promise<PermissionStatus
> query
(object permissionDesc);
};
dictionary PermissionDescriptor
{
required DOMString name
;
};
query()
メソッドが呼び出された場合、ユーザーエージェントは次の権限クエリアルゴリズムをpermissionDesc引数で実行する:
Window
オブジェクトなら:
Document
が
完全にアクティブでなければ、Promiseをrejectし、
"InvalidStateError
"
DOMException
を返す。
PermissionDescriptor
とする。
name
"]がサポートされていなければ、Promiseをrejectし、TypeError
を返す。
name
の権限ディスクリプタ型に変換したものとする。
[[query]]
内部スロットとする。
name
の権限クエリアルゴリズムをqueryとstatusで実行する。
WebIDL[Exposed=(Window,Worker)]
interface PermissionStatus
: EventTarget {
readonly attribute PermissionState
state
;
readonly attribute DOMString name
;
attribute EventHandler onchange
;
};
enum PermissionState
{
"granted
",
"denied
",
"prompt
",
};
PermissionStatus
インスタンスは、機能ごとの権限ディスクリプタ型インスタンスを保持する[[query]]内部スロットとともに生成される。
"granted
"、"denied
"、"prompt
"列挙値は、それぞれ"granted"、"denied"、"prompt"の概念を表す。
PermissionDescriptor
permissionDescに対してPermissionStatus
生成する手順:
name
を name とする。
name
属性は初期化時の値を返す。
state
属性は、現在のインスタンスにセットされた最新値を返す。
onchange
属性は、対応するイベントハンドラであり、対応イベントタイプはchange
。
PermissionStatus
インスタンスstatusの状態が変更されたことをUAが認識した場合、非同期でPermissionStatus
更新手順を実行する:
Window
オブジェクトの場合:
[[query]]
内部スロットとする。
name
の パーミッションクエリアルゴリズムを実行し、query
と status を渡す。
change
で、対象は status である。
PermissionStatus
オブジェクトは、change
型のイベントリスナーを持つ場合、ガベージコレクションされてはならない。
非規範的と明記されているセクションに加え、本仕様書のすべての著作ガイドライン、図、例、および注記は非規範的です。それ以外はすべて規範的です。
この文書において、MAY、MUST、MUST NOT、OPTIONAL、SHOULDのキーワードは、 BCP 14 [RFC2119] [RFC8174] に記載されている通り、すべて大文字で示されている場合にのみ、ここで示す意味で解釈されます。
本仕様に適合を主張できる製品は2種類あります:ユーザーエージェントおよび その他の仕様(すなわち、本仕様の要件に準拠した方法で強力な機能を仕様化する技術報告)。
このセクションは非規範的です。
本仕様とPermissions Policy仕様はともに「権限」を扱いますが、各仕様はプラットフォーム上で異なる目的を持ちます。ただし、両者には明確な重複があります。
一方で、本仕様は強力な機能のみを対象とし、そのアクセスはユーザーエージェントを介した権限UIによって管理されます(すなわち、ユーザーの明示的な同意がなければ利用できず、ユーザーはいつでも理由を問わず権限を拒否可能)。これらの強力な機能はPermissions Registryに登録されています。
他方、Permissions Policy仕様は、開発者が「permissions
policy」(HTTPヘッダーやallow
属性)を使って、ポリシー制御機能の有効・無効を選択的に制御できるようにします。この意味で、Permissions
Policyは本仕様を包括し、Permissions Policyが機能の利用可否を独立して管理します。これらのポリシー制御機能もPermissions Registryに登録されています。
Permissions Policy仕様によって無効化された強力な機能は、本仕様ではその権限状態が常に"denied"となります。 これは現在の権限状態の読み取りが、[HTML]の「利用許可」判定に依存しており、これがPermissions Policy仕様に委譲されるためです。両仕様で権限名を共有していることも重要です。どちらも他の仕様が権限の名前やnameを定義することに依存しており、通常同じ名称(例:"geolocation")が使われます。
最後に、強力な機能はPermissions Policy仕様のいかなる手段によっても"granted"状態になることはありません。強力な機能が"granted"となる唯一の方法は、ユーザーの明示的な許可またはUAポリシーによるものです。
ユーザーエージェントの自動化およびアプリケーションテストのために、本書は [WebDriver] および [WebDriver-BiDi] 仕様への拡張を定義します。UAがこれらをサポートするかどうかは任意です。
WebIDLdictionary PermissionSetParameters
{
required object descriptor
;
required PermissionState
state
;
};
パーミッションを設定するには、PermissionDescriptor
descriptor、PermissionState
state、オプションの permission key
key、オプションの user agent を与えられたとき、次の手順を実行する:
本書は[WebDriver]仕様の拡張コマンドを以下の通り定義します。
HTTPメソッド | URIテンプレート |
---|---|
POST | /session/{session id}/permissions |
権限設定
拡張コマンドは、PermissionDescriptor
の
権限状態をユーザーが変更したかのようにシミュレートします。
リモートエンド手順は以下の通りです:
PermissionSetParameters
に変換したものとします。例外が発生した場合、invalid
argument errorを返します。
state
が実装依存で不適切な
権限状態なら、invalid argument errorを返します。
descriptor
とする。
name
")の結果に一致)とする。例外が発生した場合、invalid argument errorを返す。
state
で実行する。
null
でsuccessを返す。
本書は[WebDriver-BiDi]仕様の拡張モジュールを以下の通り定義します。
permissionsモジュールは、リモートエンドブラウザー権限管理用コマンドを含みます。
{^remote end definition^}
PermissionsCommand = (
permissions.setPermission
)
permissions.PermissionDescriptor = {
name: text,
}
permissions.PermissionDescriptor
型はPermissionDescriptor
を表します。
permissions.PermissionState = "granted" / "denied" / "prompt"
permissions.PermissionState
型はPermissionState
を表します。
権限設定 コマンドは、PermissionDescriptor
の権限状態をユーザーが変更したかのようにシミュレートします。
permissions.setPermission = (
method: "permissions.setPermission",
params: permissions.SetPermissionParameters
)
permissions.SetPermissionParameters = {
descriptor: permissions.PermissionDescriptor,
state: permissions.PermissionState,
origin: text,
? embeddedOrigin: text,
? userContext: text,
}
EmptyResult
リモートエンド手順 (session、command parameters)は以下の通り:
descriptor
フィールド値とする。
name
フィールド値(name
を表す)とする。
state
フィールド値とする。
userContext
フィールド値(存在しなければdefault
)とする。
PermissionSetParameters
のpermission
nameの権限ディスクリプタ型に変換したものとする。例外が発生した場合、error(error codeはinvalid
argument)を返す。
origin
フィールドの値とする。
embeddedOrigin
フィールドの値(存在する場合)、存在しない場合は origin とする。
null
とともに返す。
このセクションは非規範的です。
このW3Cレジストリは、Webプラットフォームのポリシー制御機能および強力な機能を一元的に検索する場所を提供します。変更プロセスを通して、プラットフォーム上の権限が様々な仕様間で一貫して定義されていることを保証します。
権限レジストリを標準化権限と暫定権限に分けることで、これらの機能のステータスを追跡する手段も提供します。
このレジストリの追加・更新のための変更プロセスは以下の通りです:
"super-awesome"
)。この文字列がリンク可能になるよう、dfn
要素でラップしてください。
'self'
)。
権限が標準化権限表に掲載され、標準化権限とみなされるには、以下の条件を満たす必要があります:
各権限は一意のリテラル文字列で識別されます。Permissions Policyの場合、その文字列はポリシー制御機能を識別します。同様にPermissions仕様の場合も、その文字列は強力な機能を識別します。
識別文字列 | ポリシー制御機能か? | 強力な機能か? | 仕様 | 実装状況 | ||
---|---|---|---|---|---|---|
Chromium | Gecko | WebKit | ||||
"geolocation" | YES | YES | Geolocation | YES | YES | YES |
"notifications" | NO | YES | Notifications API現行標準 | YES | YES | YES |
"push" | NO | YES | Push API | YES | YES | YES |
"web-share" | YES | NO | Web Share API | YES | YES | YES |
暫定権限とは、まだ標準化権限となっていない権限です(実験的、インキュベーション中、あるいは1つのブラウザーエンジンでしか実装されていないもの)。
識別文字列 | ポリシー制御機能か? | 強力な機能か? | 仕様 | 実装状況 | ||
---|---|---|---|---|---|---|
Chromium | Gecko | WebKit | ||||
"accelerometer" | YES | YES | Device Orientation and Motion | YES | NO | NO |
"window-management" | YES | YES | Window Management | YES | NO | NO |
"local-fonts" | YES | YES | Local Font Access API | YES | NO | NO |
攻撃者は、権限状態をエンドユーザーの「フィンガープリント」作成要素として利用する可能性があります。攻撃者は、APIを実際に利用することで権限の状態を判定できますが、その場合多くはエンドユーザーにUIプロンプトが表示されます(権限が既に"granted"でない場合)。このAPIはウェブサイトに新たなフィンガープリント情報を公開するものではありませんが、攻撃者がこの情報に目立たずアクセスしやすくなる可能性があります。
ユーザーエージェントは、ユーザーが権限の状態(強力な機能とオリジンの関連)を確認・更新・リセットできる手段を提供するべきです。
現時点で文書化されたセキュリティの考慮事項はありません。読者はD. プライバシーの考慮事項セクションも参照してください。
WebIDL[Exposed=(Window)]
partial interface Navigator {
[SameObject] readonly attribute Permissions
permissions
;
};
[Exposed=(Worker)]
partial interface WorkerNavigator {
[SameObject] readonly attribute Permissions
permissions
;
};
[Exposed=(Window,Worker)]
interface Permissions
{
Promise<PermissionStatus
> query
(object permissionDesc);
};
dictionary PermissionDescriptor
{
required DOMString name
;
};
[Exposed=(Window,Worker)]
interface PermissionStatus
: EventTarget {
readonly attribute PermissionState
state
;
readonly attribute DOMString name
;
attribute EventHandler onchange
;
};
enum PermissionState
{
"granted
",
"denied
",
"prompt
",
};
dictionary PermissionSetParameters
{
required object descriptor
;
required PermissionState
state
;
};
このセクションは非規範的です。
編集者は、API設計や編集作業において協力してくれた Adrienne Porter Felt、Anne van Kesteren、Domenic Denicola、Jake Archibald、Wendy Seltzer に感謝します。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: