Subresource Integrity って何?
ざっくり言うと、JavascriptやStylesheetファイルをCDNからロードする時、あらかじめ用意したチェックサムと突き合わせて、改ざんを検知する仕組み。
Subresource Integrity - GitHub Engineeringで記事を見たので少し調べてみた。
http://www.w3.org/TR/SRI/ によると2015年9月現在、仕様はまだドラフト。ただ、ブラウザによる実装は進んでいるようだ。先のGitHubの記事によると
Browser support at the time of this article's publishing: Google Chrome added support in version 45 Mozilla Firefox plans to add support in version 43 (Nightly. Developer Edition as of next Monday) Microsoft Edge support is "under consideration". Vote for the feature here.
とのこと。
CDNからコンテンツをロードするブラウザ側での対応なので、CDN側の対応は不要。
どうやって設定する?
これもGitHubの記事からの受け売りだが、Railsの場合、javascript_include_tagやstylesheet_link_tagにintegrity: true を設定するだけでいけるらしい。
ただ、sprockets-railsを見てみたところ、まだexperimental supportだった。version3から入るようだが、現在リリースされている2.x系では未サポート。
ただし、integrity: trueを指定しても無視されるだけなので、今のうちから入れておくのもいいかもしれない。
<%= javascript_include_tag 'application', integrity: true %>
<%= stylesheet_link_tag 'application', integrity: true %>
これだとブラウザ側でintegrity="true"となり、エラーが出ていた。(汗) ということで、対応するまでは入れてはいけない。
もし改ざんされてたらどうなるの?
単にロードされないだけだと思われるが、javascriptについてはfallbackするアイデアを見つけた。
https://frederik-braun.com/using-subresource-integrity.html<script src="https://code.jquery.com/jquery.min.js" integrity="sha256-C6CB9UYIS9UJeqinPHWTHVq…" crossorigin="anonymous"></script> <script>window.jQuery || document.write('<script src="/jquery-.min.js"><\/script>')</script>