タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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を無効または有効にするかを指定できるものです。

developers.google.com

w3c.github.io

  • サイト全体で使用されている特定の機能に対して、ブラウザが実施する一連の「ポリシー」を許可する。
  • 「ポリシー」で、サイトがアクセスできるブラウザのAPIを制限したり、特定の機能に対するブラウザのデフォルトの動作を変更したりする。
    • モバイルおよびサードパーティ製ビデオでの自動再生のデフォルト動作を変更
    • たとえばカメラやマイクといった機密性の高いAPIの利用を制限
    • iframeで fullscreen API の利用を許可
    • 同期型XHRやdocument.write()などの時代遅れのAPIの使用をブロック
    • 画像のサイズが適切であること、ビューポートに対して大きすぎないこと など
  • 「ポリシー」はブラウザと開発者の間の契約であり、開発者の意図をブラウザに伝えるもの。
    • そこから外れるときにブラウザがサポートしてくれる
    • 特定のブラウザ機能やAPIへのアクセスを選択的に無効にすることで、セキュリティやパフォーマンスを向上できる。
    • デフォルトで無効になっている機能やAPIを有効にする

旧称 Feature-Policy ってどういうこと?

もともと Feature-Policy という名前だったのですが、 Permissions-Policy という名前に変更されました。

Feature Policy - HTTP | MDN

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 に戻りました。

y-yagi.hatenablog.com

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