Rails 6.1 で追加された permissions_policy.rb とは?
Ruby on Rails 6.1 で、 config/initializers/permissions_policy.rb
が追加されました。
# Define an application-wide HTTP permissions policy. For further # information see https://developers.google.com/web/updates/2018/06/feature-policy # # Rails.application.config.permissions_policy do |f| # f.camera :none # f.gyroscope :none # f.microphone :none # f.usb :none # f.fullscreen :self # f.payment :self, "https://secure.example.com" # end
このファイルには Permissions-Policy (旧称 Feature-Policy) HTTP ヘッダーを設定するためのDSLを記述します。
Permissions-Policy (旧称 Feature-Policy) とは何か?
指定されたオリジンのリストに対して、ブラウザのどのAPIを無効または有効にするかを指定できるものです。
- サイト全体で使用されている特定の機能に対して、ブラウザが実施する一連の「ポリシー」を許可する。
- 「ポリシー」で、サイトがアクセスできるブラウザのAPIを制限したり、特定の機能に対するブラウザのデフォルトの動作を変更したりする。
- 「ポリシー」はブラウザと開発者の間の契約であり、開発者の意図をブラウザに伝えるもの。
旧称 Feature-Policy ってどういうこと?
もともと Feature-Policy という名前だったのですが、 Permissions-Policy という名前に変更されました。
Feature-Policy ヘッダーは仕様書で Permissions-Policy に改名されたので、この記事もそのうち、変更を反映するために更新されます。
Rename all the things by clelland · Pull Request #379 · w3c/webappsec-permissions-policy · GitHub
これに対応して、Railsの実装も feature_policy.rb
から permissions_policy.rb
に変更されました。
Rename HTTP Feature Policy to Permissions Policy · rails/rails@90e710d · GitHub
ですが、実際にはブラウザの対応が追いついていないので、古い Feature-Policy に戻りました。
Permission-Policy headerをFeature-Policyに戻しています。仕様としてはPermission-Policyになったのですが、対応がまだ行われていないブラウザもある為、対応が行われていないブラウザでも使用出来るようにする為、Feature-Policyに戻しています。
設定例
Rails.application.config.permissions_policy do |f| f.camera :none # 映像入力デバイスを無効 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/camera f.gyroscope :none # ジャイロスコープ無効。デバイスの向きに関する情報の収集を不許可。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/gyroscope f.microphone :none # 音声入力デバイスを無効 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/microphone f.usb :none # WebUSB APIを無効 f.fullscreen :self # このドキュメントと、同じオリジンにあるすべてのネストされたブラウジングコンテクスト(iframe)で許可 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/fullscreen f.payment :self, "https://secure.example.com" # self に加えて https://secure.example.com で Payment Request API を許可 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/payment end