Webサイトのセキュリティをレベルアップさせる:Feature-Policy: document-domainの活用法


「Feature-Policy: document-domain」は、HTTPヘッダーで用いられるディレクティブの一つであり、Webサイトがdocument.domainプロパティを設定する権限を制御するために使用されます。このプロパティは、異なるオリジン間でクッキー共有を可能にするために使用されますが、セキュリティ上の問題も孕んでいます。

「Feature-Policy: document-domain」の役割

「Feature-Policy: document-domain」ディレクティブは、以下の2つの役割を担います。

  1. 許可リストの指定
    特定のオリジンに対してのみdocument.domainプロパティの設定を許可することができます。
  2. 無効化
    全てのオリジンに対してdocument.domainプロパティの設定を無効化することができます。

構文

Feature-Policy: document-domain <allow-list>;
  • ;: ディレクティブの区切り文字
  • <allow-list>: 許可されたオリジンのリスト。カンマ区切りで記述します。

以下の例では、https://example.comhttps://example.orgのみがdocument.domainプロパティを設定することを許可しています。

Feature-Policy: document-domain https://example.com, https://example.org;

全てのオリジンに対してdocument.domainプロパティの設定を無効化するには、以下の記述になります。

Feature-Policy: document-domain;
  • このディレクティブは、まだ実験段階であり、全てのブラウザで完全にサポートされているわけではありません。
  • 「Feature-Policy: document-domain」ディレクティブは、HTTPSでのみ有効です。


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Feature-Policy: document-domain example</title>
</head>
<body>
  </body>
</html>
# web server configuration
# ...

Header always set Feature-Policy "document-domain https://example.com";

例2:全てのオリジンからの document.domain の設定を無効化

この例では、全てのオリジンからの document.domain の設定を無効化する HTTP ヘッダーを設定します。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Feature-Policy: document-domain example</title>
</head>
<body>
  </body>
</html>
# web server configuration
# ...

Header always set Feature-Policy "document-domain";
  • ウェブサーバーの設定例では、Header always set ディレクティブを使用して、全てのレスポンスに Feature-Policy ヘッダーを含めます。
  • document-domain ディレクティブには、許可されたオリジンのリスト (https://example.com) または ; (無効化) を指定します。
  • ヘッダー値には、 ; で区切られたディレクティブのリストが含まれます。
  • 上記の例では、Feature-Policy ヘッダーを <!DOCTYPE html> 宣言の直後に <head> タグ内に記述しています。
  • document.domain プロパティの使用には、セキュリティ上のリスクが伴うことに注意してください。詳細については、MDN Web Docs のドキュメントを参照してください。
  • 実際のコードは、使用しているウェブサーバーやフレームワークによって異なる場合があります。


近年、より安全かつ柔軟な代替手段として、以下の方法が提案されています。

HTTP Strict Origin Security (HSTS) を使用する

HSTS は、Web サイトがブラウザに対して、常に HTTPS で接続するように指示するセキュリティポリシーです。これにより、中間者攻撃のリスクを軽減し、クッキーの盗聴を防ぐことができます。

HSTS の実装は、ウェブサーバーの設定で行うことができます。詳細は、以下のリソースを参照してください。

クロスオリジンリソース共有 (CORS) を使用する

CORS は、Web サイトが別のオリジンにあるリソースにアクセスできるようにするメカニズムです。適切な設定を行うことで、安全かつ制御された方法でクッキー共有を許可することができます。

CORS の実装は、Web サーバーとクライアント側の両方で行う必要があります。詳細は、以下のリソースを参照してください。

Web Storage API を使用する

Web Storage API は、Web サイトがブラウザにデータを保存できるようにする API です。localStoragesessionStorage などのストレージを使用することで、オリジン間のデータ共有が可能になります。

Web Storage API は、クライアント側の JavaScript コードで実装されます。詳細は、以下のリソースを参照してください。

postMessage API を使用する

postMessage API は、異なるオリジン間のウィンドウ間通信を可能にする API です。この API を使用することで、構造化データを安全かつ柔軟に共有することができます。

postMessage API は、クライアント側の JavaScript コードで実装されます。詳細は、以下のリソースを参照してください。

適切な代替方法の選択

上記の代替方法はそれぞれ異なる特性と利点を持っています。どの方法が最適かは、具体的な要件や状況によって異なります。

  • 柔軟性
    CORS、Web Storage API、postMessage API は、HSTS よりも柔軟なデータ共有を可能にします。
  • 使いやすさ
    HSTS と CORS は、比較的簡単に実装できます。Web Storage API と postMessage API は、より複雑な実装が必要となります。
  • セキュリティ
    HSTS は、最も強力なセキュリティを提供しますが、柔軟性に欠けます。CORS は、適切な設定を行うことで、HSTS と同等のセキュリティを実現できます。Web Storage API と postMessage API は、セキュリティ上のリスクが伴う可能性があるため、注意が必要です。