Webサイトのセキュリティをレベルアップさせる:Feature-Policy: document-domainの活用法
「Feature-Policy: document-domain」は、HTTPヘッダーで用いられるディレクティブの一つであり、Webサイトがdocument.domain
プロパティを設定する権限を制御するために使用されます。このプロパティは、異なるオリジン間でクッキー共有を可能にするために使用されますが、セキュリティ上の問題も孕んでいます。
「Feature-Policy: document-domain」の役割
「Feature-Policy: document-domain」ディレクティブは、以下の2つの役割を担います。
- 許可リストの指定
特定のオリジンに対してのみdocument.domain
プロパティの設定を許可することができます。 - 無効化
全てのオリジンに対してdocument.domain
プロパティの設定を無効化することができます。
構文
Feature-Policy: document-domain <allow-list>;
;
: ディレクティブの区切り文字<allow-list>
: 許可されたオリジンのリスト。カンマ区切りで記述します。
例
以下の例では、https://example.com
とhttps://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 です。localStorage
や sessionStorage
などのストレージを使用することで、オリジン間のデータ共有が可能になります。
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 は、セキュリティ上のリスクが伴う可能性があるため、注意が必要です。