安全なコンテキスト (Secure Context) とは、(HTTPS / TLS を介して) コンテンツが安全に配信され、安全ではないコンテキストとの通信の可能性が限られているという合理的な確信がある Window
、または Worker
のことです。多くのウェブ API が安全なコンテキストでのみ利用可能です。安全なコンテキストの主目的は、中間者攻撃者が被害者に更なる危険にさらす可能性がある強力な API にアクセスするのを防ぐことにあります。
機能をアクセス制限すべき理由
ウェブの API には強力なものもあり、攻撃者に対して以下のような (それよりも多くの) 能力を与えてしまう可能性があります。
- ユーザーのプライバシーを侵害する
- ユーザーのコンピューターに対して低水準のアクセス権限を得る
- ユーザーの認証情報のようなデータへのアクセス権限を得る
コンテキストが安全とみなされる条件
コンテキストは、安全に (またはローカルに) 配信されたとき、およびセキュリティで保護されていないコンテキストにセキュアな API へのアクセスを提供していないときに、安全とみなされます。 実際には、ページが安全なコンテキストを持つためには、ページとその親、オープナーチェーンに沿ったすべてのページが安全に配信されていなければならないことを意味します。
たとえば、親や祖先のドキュメントが安全に提供されていない場合、TLS で提供されているページであったとしても安全とはみなされません。そうでなければ、ページは postMessage メッセージを介して先祖に安全ではない API を先祖に公開することになるからです。同様に、TLS で提供されたドキュメントが、noopener が指定せずに安全でないコンテキストによって新しいウィンドウに開かれた場合も、安全なコンテキストとみなされません (オープナーと開かれたウィンドウが postMessage で通信できるからです)。
http://localhost や file:// のようなパスを持つローカルファイルは安全とみなされます。
ローカルに存在しないコンテキストが安全であるためには、 https:// や wss:// のスキームで、かつ廃止されていないプロトコルで送信されなければなりません。
機能の判別
グローバルスコープで利用できる isSecureContext
の真偽値を用いることで、そのページ自身が安全なコンテキストの中にいるかどうか確かめることができます。
if (window.isSecureContext) { // Service Worker が実行されているので、このページは安全なコンテキストです navigator.serviceWorker.register("/offline-worker.js").then(function () { ... }); }
仕様書
仕様書 | 状態 | 備考 |
---|---|---|
Secure Contexts | 勧告候補 | 編集者による草稿 |
関連情報
- 安全なコンテキストに制限されたプラットフォーム機能 — 安全なコンテキストでのみ使用できる機能のリスト
Window.isSecureContext
- https://permission.site — HTTP と HTTPS を使用して、ブラウザが使用している API のアクセス許可チェックを確認できるサイト。