`ActionDispatch::PermissionsPolicy` に27の新機能ディレクティブを追加
ActionDispatch::PermissionsPolicy の DIRECTIVES マップに、標準化が進んだ27のブラウザ機能が新たに追加されました。これにより、Client Hints・Bluetooth・XRデバイスなど近年普及した機能に対してもRailsの設定体系から直接ポリシーを宣言できるようになります。
背景
Permissions Policy(旧Feature Policy)は、ウェブアプリケーションが使用できるブラウザ機能をHTTPヘッダーで制御する仕組みです。RailsはこれをDSLで記述できる ActionDispatch::PermissionsPolicy として提供してきましたが、DIRECTIVES の定義が最後に更新されてから仕様側で多くの機能が追加されており、Railsのリストはその分だけ古いままになっていました。
今回の更新対象は、W3Cの webappsec-permissions-policy リポジトリ に列挙されている標準化済み機能のうち、Railsの DIRECTIVES に未収録だったものです。
技術的な変更
actionpack/lib/action_dispatch/http/permissions_policy.rb の DIRECTIVES 定数に、27エントリが追加されました。変更前は22エントリでしたが、変更後は49エントリに拡張されています。
変更前(抜粋):
DIRECTIVES = {
accelerometer: "accelerometer",
ambient_light_sensor: "ambient-light-sensor",
autoplay: "autoplay",
camera: "camera",
display_capture: "display-capture",
# ...(22エントリ)
}
変更後(抜粋):
DIRECTIVES = {
accelerometer: "accelerometer",
ambient_light_sensor: "ambient-light-sensor",
attribution_reporting: "attribution-reporting",
autoplay: "autoplay",
battery: "battery",
bluetooth: "bluetooth",
camera: "camera",
ch_ua: "ch-ua",
ch_ua_arch: "ch-ua-arch",
# ...(49エントリ)
}
追加された27の機能は以下のカテゴリに分類できます:
-
Client Hints関連:
ch_ua、ch_ua_arch、ch_ua_bitness、ch_ua_full_version、ch_ua_full_version_list、ch_ua_high_entropy_values、ch_ua_mobile、ch_ua_model、ch_ua_platform、ch_ua_platform_version、ch_ua_wow64 -
デバイス・ハードウェアアクセス:
battery、bluetooth、compute_pressure、direct_sockets、xr_spatial_tracking -
セキュリティ・アイデンティティ:
attribution_reporting、cross_origin_isolated、identity_credentials_get、otp_credentials、publickey_credentials_get -
ページライフサイクル:
execution_while_not_rendered、execution_while_out_of_viewport -
その他:
mediasession、navigation_override、storage_access、window_management
Rubyシンボルのキーはハイフンをアンダースコアに置換した命名規則(例: ch-ua-arch → ch_ua_arch)を踏襲しており、既存エントリとの一貫性が保たれています。
設計判断
DIRECTIVES 定数への追記のみという最小限の変更が採用されました。
Permissions Policy のDSLは DIRECTIVES のキーをそのままメソッド名として動的に定義する構造になっているため、定数への追記だけで permissions_policy ブロック内での使用が可能になります。たとえば bluetooth :none や ch_ua self: のように記述できるようになります。既存のポリシー設定には一切影響せず、後方互換性は完全に維持されています。
テストの追加がチェックリストで未チェックのまま取り込まれていますが、これはDIRECTIVESの列挙に対するロジック変更がないためと考えられます。ディレクティブの追加は既存のDSL生成ロジックに乗るだけであり、定数値の正確性は仕様文書との照合で担保される性質のものです。
まとめ
本PRは、仕様側の更新に追従してRailsのPermissions Policyサポートを現行水準に引き上げる変更です。DIRECTIVES 定数への追記という最小変更でClient HintsやBluetooth・XRといった近年標準化された機能群を網羅したことで、既存アプリへの影響なしに宣言的なセキュリティポリシー管理の対象範囲が大幅に広がります。