安全であるために必要最小限な要件をブラウザが満たしている場合、そのブラウザは 安全なコンテキスト(Secure Context) の中にいると考えます。ブラウザは安全なコンテキストの確認を行うことで、ユーザの通信に安全性が確保されている場合のみ利用を許可するべき API を公開できます。
アクセスを制限するべき機能がある理由
Web の API には強力なものもあり、攻撃者に対して以下のような(それよりも多くの)能力を与えてしまう可能性があります。
- ユーザのプライバシーを侵害する
- ユーザのコンピュータに対して低レイヤーのアクセス権限を得る
- ユーザの機密情報に対するアクセス権限を得る
コンテキストが安全とみなされる条件
コンテキストが安全とみなされるのは、安全な通信路かローカル環境から送信される場合です。そのコンテキストがフレームの内側ではなく、かつトップレベルのブラウザコンテキストでもない場合、安全なコンテキストであるためには、自分の親が安全なコンテキストでなければなりません。
https://localhost や file:// のようなパスを持つローカルファイルは安全とみなされます。
ローカルに存在しないコンテキストが安全であるためには、 https:// や wss:// のスキームで、かつ廃止されることがないようなプロトコルで送信されなければなりません。
機能の判別
グローバルスコープで利用できる isSecureContext
の真偽値を用いることで、そのページ自身が安全なコンテキストの中にいるかどうか確かめることができます。すなわち、アクセスを安全なコンテキストのみに制限している API を利用できるか判別することができます。
if (window.isSecureContext) { // Service Worker が実行されているので、このページは安全なコンテキストです navigator.serviceWorker.register("/offline-worker.js").then(function () { ... }); }
安全なコンテキストを必要とする API
草案として提案されている API
- https://w3c.github.io/sensors/
- https://w3c.github.io/webappsec-credential-management/
- https://w3c.github.io/geofencing-api/
- https://w3c.github.io/web-nfc/releases/20150925/
ブラウザ
ブラウザのなかには Chrome issues deprecation warnings に書かれているように、特定の API を安全なコンテキストのみで利用可能とするかもしれません。このような API には以下が例として挙げられます。
- Device motion / orientation
- EME
- Fullscreen
- Geolocation - Chrome 50 以降では安全でないコンテキストから API を利用できなくなります
- getUserMedia() - Chrome 47 以降では安全でないコンテキストから API を利用できなくなります
- Chrome の Web Cryptography API は HTTPS を通じたアクセスのみに制限されていますが、この制限は Secure Context の確認に先立って行われます。
仕様
仕様書 | 策定状況 | 備考 |
Secure Contexts | 草案 | Editor’s Draft |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
基本サポート | (有) | 49 (49) | ? | ? | ? |
機能 | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
基本サポート | 未サポート | (有) | 49.0 (49) | ? | ? | ? | (有) |