mcpField
F
FSV — website security scanner

FSV — website security scanner

ローカル
github.comセキュリティ5今日更新

FSV — website security scanner について

FSVは、許可を得たセキュリティ評価向けのウェブサイトスキャナーです。コマンドライン、ダッシュボード、CIステップ、MCPサーバーとして利用でき、DNS乗っ取りリスクや露出したシークレット、脆弱な依存関係などを調べ、検出事項を攻撃経路として関連付けて修正案を示します。

主な機能

  1. 01DNS、クラウドストレージ、スクリプト、サイト設定のスキャン
  2. 02検出事項を攻撃経路として関連付け
  3. 03修正案と修正用設定の生成
  4. 04継続的なトリアージとスキャン比較
  5. 05Markdown、JSON、HTML、SARIF、CSV形式のレポート出力
  6. 06CIベースラインと認可確認への対応

活用シーン

  1. 01所有するウェブサイトのセキュリティ評価
  2. 02スキャン結果を確認し、関連する攻撃経路の優先度を判断
  3. 03新たな検出事項を条件にCIビルドを制御
  4. 04MCP経由でAIアシスタントに検出結果と修正案を提供

MCP 対応

FSVは、スキャン、簡易チェック、レポート、トリアージ、比較、所有権確認のツールと、`security_review` プロンプトを備えたMCPサーバーを提供します。MCPクライアントから、許可を得た対象の評価と結果の確認に利用できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"twayst0-fsv": {
"command": "uvx",
"args": [
"fsv"
]
}
}
}
起動コマンドuvx fsv

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypifsv2.3.0

ツール

12

掲載時のツール一覧 · 今日に更新

パラメーター型必須説明
crawlbooleanいいえ
depthintegerいいえ
targetstringはい
cookiesanyいいえ
headersanyいいえ
modulesanyいいえ
profilestringいいえ
max_urlsintegerいいえ
seed_urlsanyいいえ
authorizedbooleanはい
max_minutesintegerいいえ
use_ct_logsbooleanいいえ
exclude_pathsanyいいえ
allow_externalbooleanいいえ

詳細

FSV — チェックリストが見逃すものを見つけます。アニメーションするレーダーが、ぶら下がった CNAME、孤立したバケット、存在しなくなった SPF include、セッション窃取につながる XSS、露出したソースマップを照らし出します。

CI Python 3.11+ 32 modules MCP server detection only tests license: MIT

誰も監視していない問題を見つけるウェブセキュリティスキャナー — DNS の設定不備やサブドメイン乗っ取り、孤立したクラウドバケット、侵害されたスクリプト CDN、期限切れの SPF include、オンのままのデバッグモード、JavaScript 内のシークレット、サポート終了ソフトウェア、そして小さな検出事項を実際の侵害につなげる攻撃経路を検出します。
CLI、ダッシュボード、AI エージェント向けのMCP サーバー、CI ステップとして動作します。

30 秒で MCP に接続 · 動作を見る · 検出できるもの · 攻撃経路 · インストール · 使い方 · CI · FSV と ZAP · 制限事項 · ドキュメント · お問い合わせ

⚠ 許可された利用のみ

FSV はセキュリティ評価ツールです。所有するシステム、またはテストすることを書面で明示的に許可されたシステムに対してのみ使用してください。許可なくシステムをスキャンすることは、ほとんどの法域で違法です。すべてのエントリーポイント(ウェブ、CLI、MCP、CI)で許可の確認が必要です。また、共有環境へのデプロイでは、ペイロードを送信する前に、対象を管理している証明を追加で求めることができます(docs/DEPLOYMENT.md)。


AI アシスタントを30秒で接続

Claude、Cursor、または VS Code を FSV に接続し、あなたのサイトをレビューするよう依頼します。アシスタントが認証を確認し、パッシブチェックを実行してからフルスキャンを行い、攻撃経路を優先して提示し、そのまま貼り付けられる修正方法を示します。

pip install fsv
fsv mcp-config --client claude-code     # prints:  claude mcp add fsv -- /path/to/fsv-mcp
fsv mcp-config --client claude-desktop  # or cursor · vscode — prints the JSON to paste

インストールは不要です。uv を使って、任意の MCP クライアントを uvx fsv mcp に接続します({ "command": "uvx", "args": ["fsv", "mcp"] })。FSV は 公式 MCP レジストリに io.github.twayst0/fsv として掲載されています。

続いて、アシスタントに次のように指示します:「https://my-shop.example で security_review プロンプトを使ってください。ここは私が所有しています。」

MCP ツールとプロンプト
ツール目的
fsv_scanフルスキャン — プロファイル、スコープ、時間制限、seed_urls。テストアカウントを使った認証済みスキャンでは headers / cookies を指定
fsv_quick_check / fsv_waf_checkパッシブなセキュリティ状況のチェック / WAF-CDN 検出
fsv_fixesそのまま貼り付けられる nginx / apache / caddy / express / DNS の修正方法
fsv_get_reportmd · json · html · sarif · csv · fix-*
fsv_triage誤検知 / 承認済み / 修正済みとしてマーク(ホストごとに保持)
fsv_compare_scans · fsv_target_trend修正前後の比較 · 時間経過に伴うリスク
fsv_verify_ownership共有デプロイメント向けの管理権限の証明(DNS TXT または HTTP ファイル)
fsv_list_scans · fsv_scan_stats · fsv_list_modules履歴 · リクエスト統計 · カタログ

プロンプト security_review(target, server) — 上記の、ガイド付きで認証を最優先するワークフローです。 スキャン結果には attack_paths セクションが含まれるため、エージェントは重要な内容を優先して提示します。サーバーは stdio 経由でエンドツーエンドのテストを受けています(tests/test_mcp_stdio.py)。

動作を確認する

ターミナルのアニメーション再生:デモサイトに対する fsv scan が Risk F 100/100、ハードコードされた Stripe キーや XSS 攻撃経路を含む3件の重大な検出結果、孤立したバケット、公開された actuator エンドポイントを表示し、その後 `fsv fixes` が nginx 設定を出力します。

この出力は実際のものです。このリポジトリに含まれる、意図的に脆弱なデモサイトをスキャンした結果です。1分で再現できます:

python examples/demo_site.py &                 # http://127.0.0.1:8961 — loopback only, fake secrets
fsv scan http://127.0.0.1:8961 --authorize
fsv web                                        # open the same scan in the dashboard

cloud_storage チェックでは、デモ用バケットが存在するか Amazon S3 に問い合わせます。このリクエストは1回だけで、AWS への読み取り専用アクセスです。--no-external を使うとスキップできます。

チェックリストでは見つからない問題

多くのツールは、ヘッダーが欠けていることを教えてくれます。しかし、非常に適切に運営されている組織でさえ、実際に大きな被害をもたらすインシデントは、もっと目立たず、誰も見ていないところで起こります。

6つの検出カード:宙ぶらりんのDNSレコード、スクリプトの配信元として使われる孤立したバケット、すでに存在しないドメインを含むSPF、マスクされたキーが含まれる公開ソースマップ、サポート終了済みのPHPとjQuery、XSSとHttpOnly属性のないCookieによる攻撃経路。

問題FSVが誤検知を避ける方法モジュール
🪝プロジェクト終了後もDNSレコードが残っている — 誰でもその名前を取得し、あなたのドメインからコンテンツを配信できますCNAMEを明示的に確認します(Aレコードの検索では宙ぶらりんのエイリアスが見えません)。チェーンをたどり、リゾルバーのエラーを「宙ぶらりん」と判断することはありませんtakeover
🪣ページがすでに存在しないバケットからスクリプトを読み込んでいる — そのバケットを作成した人がページを制御できますmax-keys=1 のリクエストを1回送信します。オブジェクトは取得せず、何も作成しませんcloud_storage
✉️期限切れドメインのSPF include:、SPFの10回のルックアップ上限超過、512ビットのDKIMキードメイン自体が名前解決できない場合は、説明を添えてDNSチェックをすべてスキップしますdns_security
🗺️すべての訪問者に配信されるソースマップとハードコードされた認証情報認証情報はマスクして報告し、テストすることはありませんjs_analysis
🧱サポート終了後のjQuery 3.3.1 / AngularJS 1.x / Vue 2とPHP 8.1日付に基づくテーブルで、サポート終了日に警告します。バージョンはサードパーティのファイルをダウンロードせず、URLから読み取りますjs_libs · tech
⛓️XSS + HttpOnly属性のないセッションCookie = アカウント乗っ取りすべてのリンクがこのスキャンで見つかったチェーンのみを表示しますcorrelation

詳細と、すべての誤検知防止策については、**docs/DETECTIONS.md**をご覧ください。

攻撃経路

実際の侵害が単一のバグで起こることはまれです。たいていは、2つか3つの「中程度」の問題が重なって発生します。スキャナーはそれぞれを個別に評価するため、インシデント報告書が書かれるまで、その組み合わせは見えません。FSVは自らの検出結果だけを読み取り、それ以外の情報は送信しません。実際にチェーンが存在する場合は、各リンクに名前を付け、手順を追って経緯を説明し、チェーンを断ち切る最小コストの単一の修正を示す検出結果を追加します。リンクがトリアージで除外されると、チェーンも自動的に表示されなくなります。

アニメーション表示の攻撃チェーン:反射型XSSがHttpOnly属性のないセッションCookieを読み取り、アカウント乗っ取りにつながる。2つ目のリンクに「+HttpOnly」バッジが追加されると、チェーンが緑色になり、攻撃チェーンが断たれたことを示す。

チェーン組み合わさると危険性が高まる理由
XSS + HttpOnly属性のないセッションCookie細工されたリンク1つでアカウントを乗っ取られます
HSTSなし/HTTPSなし + Secure属性のないセッションCookie悪意のあるネットワーク上では、どこからでもセッションを読み取られます
乗っ取り可能なサブドメイン + 親ドメインにスコープされたセッションCookieサブドメインを取得した人が、ユーザーのセッションを受け取ります
宙ぶらりんのSPF include + DMARCが強制されていないあなたのドメインを使った、完全に認証済みのフィッシングが可能になります
SPF/DMARCによる強制が一切ないあなたのドメインになりすまされる可能性があります

ダッシュボード

デモサイトをスキャンした後のFSVダッシュボード:リスク評価F、100/100、深刻度別の件数、2つの攻撃チェーンを手順ごとに説明し、それぞれに「チェーンを断つ」ための推奨事項を表示する攻撃経路パネル。

OWASP Top 10の内訳と、Stripeキーの検出結果を展開した検出結果一覧:説明、マスクされた証拠、修正方法、参考情報。

ライブ進捗表示(ページを再読み込みしても維持)、攻撃経路パネル、OWASPの内訳、ホストごとのリスク傾向、インラインでのトリアージ、モジュール選択、スキャン比較、ワンクリックでのエクスポートを備えたリキッドグラスUI — レポートのほか、貼り付けてすぐ使える修正案も出力できます。

機能

  • まずページを見つけます — リンクに加えて、robots.txt、サイトマップ、デバッグページから漏えいしたルート、JavaScript内に記載されたAPIパスも確認します。アクションのようなパスにはリクエストを送信しません。それ以外の対象には --seed を指定します。
  • README用のバッジ — fsv badge <scan_id> で、日付入りのグレードバッジ(FSV security | A · 2026-10-25)を作成します。CIから再生成できます。
  • 修正パック — 検出結果をnginx / Apache / Caddy / Express / DNSの設定に変換します(fsv fixes <scan> nginx)。実際に検出された内容だけを対象にし、CSPはレポート専用モードで出力されます。
  • CI対応 — fsv.toml、ベースライン(新しい検出結果のみをゲート対象にします)、--fail-on、GitHubコードスキャン用SARIF、すぐに使えるGitHub Actionを備えています。
  • 継続的なトリアージ — 誤検出/許容されたリスク/修正済み/確認済みを、安定したフィンガープリントでホストごとに保存し、後続のスキャンに再適用して、スコアから除外します。任意の2つのスキャンを比較でき、ホストごとの傾向も確認できます。
  • 推測ではなく証拠を重視 — 露出チェックでは内容を検証します(.git/HEADはそれらしい内容である必要があり、すべてに200を返すSPAからは何も検出されません)。各検出結果には、信頼度、CWE、OWASP Top 10(2021)のカテゴリ、影響、修正方法が示されます。
  • 失敗を正直に報告 — クラッシュしたモジュールはカウントされ、説明とログが記録されます。応答が一度もなかった対象には、問題なしの評価ではなく、警告が表示されます。
  • 設計段階から安全 — シークレットは取得元でマスクされます。クラウドメタデータ/リンクローカルには到達できず、ループバック/RFC 1918はオプションでブロックできます。すべての名前解決とリダイレクトの各段階で適用されます。ダッシュボードにはCSRF/DNSリバインディング対策とトークン認証を備えています。
  • 拡張可能 — モジュールは1つのクラスで構成されます。ファイルを ~/.fsv/plugins に置くか、エントリーポイントパッケージとして配布できます(docs/WRITING_MODULES.md)。JavaScriptライブラリのアドバイザリとEOL日付は独自のものを使用できます。
  • 高速かつ適切で、停止しにくい — 非同期エンジン、キャッシュ付き共有HTTPクライアント、リクエストの集約、トークンバケット方式のレート制限、リトライ、サイズ上限、部分結果を保持する時間制限を備えています。応答しないエンドポイントによるコストは、モジュールごとではなくスキャンごとにタイムアウト1回分です。すべてのレスポンス正規表現は線形時間で処理されます。敵対的なローカルサーバー(リダイレクトループ、20 MBの本文、応答停止、あらゆるパスに応答するSPA)を使ってテスト済みです。
  • 5種類のレポート形式 — Markdown(OWASPのカテゴリ別)、JSON、単体で動作するHTML、SARIF 2.1、CSV。
  • ローカル優先 — 結果はローカルのSQLiteファイルに保存されます。任意のサードパーティへの呼び出しは、DEPLOYMENT.mdに記載されたものだけです。

インストール

pip install fsv          # Python 3.11+  ·  pipx install fsv  keeps it isolated
fsv doctor               # checks Python, dependencies, DNS, database, plugins

ソースからインストールする場合:git clone https://github.com/twayst0/fsv && cd fsv && ./install.sh(または pip install -e .)。

**Python 3.11+**が必要です。Dockerについてはdocs/DEPLOYMENT.md(docker compose up)を参照してください。

使い方

fsv scan example.com --authorize                       # full scan of a site you own
fsv scan example.com --authorize --profile passive     # read-only: no payloads sent
fsv web                                                # dashboard → http://127.0.0.1:7474
CLIリファレンス
# scope & tuning
fsv scan example.com --authorize --exclude "/admin/*,/logout" --max-urls 100 --max-time 900 --tag prod
fsv scan example.com --authorize --header "Authorization: Bearer X" --cookie "session=abc"    # authenticated
fsv scan example.com --authorize --ct-logs        # also ask Certificate Transparency (crt.sh) for subdomains*
fsv scan example.com --authorize --no-external    # skip modules that contact hosts other than the target
fsv scan example.com --authorize --proxy env      # behind a corporate proxy (HTTPS_PROXY); or --proxy http://host:3128

# reports & fixes
fsv scan example.com --authorize -o report.html   # .md .json .html .sarif .csv
fsv report <scan_id> --format fix-nginx           # or fix-apache fix-caddy fix-express fix-dns
fsv fixes  <scan_id> nginx -o nginx-fixes.md

# triage, history, diff
fsv findings <scan_id>
fsv triage <scan_id> <finding_id> false_positive --note "test endpoint"
fsv list --target example.com   ·   fsv diff <before_id> <after_id>   ·   fsv prune --keep 50

# ownership proof (for shared deployments)           # * sends the domain name to crt.sh
fsv verify example.com   ·   fsv verify example.com --check

fsv modules   ·   fsv doctor
CIでの使用
# fsv.toml  (commit it; ${VAR} is read from the environment — never commit secrets)
[scan]
profile  = "balanced"
max_urls = 100
exclude  = ["/admin/*"]
max_time = 900
fail_on  = "high"
baseline = ".fsv-baseline.json"
[scan.headers]
Authorization = "Bearer ${FSV_API_TOKEN}"
fsv scan staging.example.com --authorize --write-baseline .fsv-baseline.json    # once: accept today's state
fsv scan staging.example.com --authorize                                         # every build: fails only on NEW high+ findings
# .github/workflows/security.yml
- uses: twayst0/[email protected]          # pin a release tag (or a commit SHA)
  with:
    target: https://staging.example.com
    authorized: "true"          # you confirm you may test this target
    profile: balanced
    fail-on: high
    baseline: .fsv-baseline.json

SARIFはGitHubコードスキャンにアップロードされます。HTMLレポートとログはアーティファクトとして添付されます。

FSV と OWASP ZAP

アプリケーションの入力を深くテストするには、ZAP が適したツールです。ぜひ活用してください。FSV はアプリケーションの周辺を調べます。一般的な DAST スキャンでは対象にならない領域を確認できるため、両者は併用するとうまく機能します。

領域一般的な DAST スキャンFSV
プロジェクト終了後も残っている DNS(宙ぶらりんの CNAME、未登録のターゲット)対象外takeover
ページの読み込み元で、すでに存在しないバケット対象外cloud_storage
侵害された CDN(polyfill.io 2024)や期限切れドメインからのスクリプト対象外supply_chain
メールのなりすまし:SPF のルックアップ制限、無効な include、DMARC、DKIM の鍵サイズ対象外dns_security
エラーページでしか表示されないデバッグモード(Django、Werkzeug、Ignition…)一部supply_chain
侵害または放棄された CDN(polyfill.io、bootcdn、staticfile、rawgit)や、登録が解除されたドメインからのスクリプト/スタイルパッシブ · URL · ↗
debug_mode
アカウント乗っ取りにつながる複数の中程度の検出結果個別に列挙correlation の攻撃経路
サーバー設定としての修正、継続的なトリアージ、CI ベースライン、MCP—組み込み
詳細な入力ファジング、認証済みスパイダー、スクリプトによる認証、JS レンダリングされたアプリはい基本

モジュール(32)

FSV には 32 個のモジュール(パッシブ 26 個、アクティブ 6 個)が付属しています。最新の一覧は fsv modules で確認できます。

全カタログ  (または fsv modules を実行)
モジュール検出対象種類
takeover宙ぶらりんの CNAME/未取得の SaaS リソース/未登録のターゲットドメインパッシブ · サイト · ↗
cloud_storageサイトが参照する、孤立状態または一般公開されている S3/GCS/Azure バケットパッシブ · URL · ↗
dns_securitySPF(ルックアップ上限 10 回、無効な include、+all)、DMARC、DKIM の鍵強度、MTA-STS、無効な NS/MX、CAA、DNSSECパッシブ · サイト
js_analysisハードコードされた認証情報、公開されたソースマップ、クライアントコード内の内部/本番環境以外のホストパッシブ · URL
js_libs既知の脆弱性がある JavaScript ライブラリ、およびサポート終了した JavaScript ライブラリパッシブ · URL
supply_chain侵害または放棄された CDN(polyfill.io、bootcdn、staticfile、rawgit)や、登録が解除されたドメインからのスクリプト/スタイルパッシブ · URL · ↗
debug_mode本番環境でのフレームワークのデバッグモード(Django DEBUG=True、Werkzeug コンソール、Rails、Laravel Ignition、Symfony、Express、ASP.NET)。クローラーが訪問しないエラーページで見つかる場合がありますパッシブ · サイト
pathsコンテンツを検証する、約 100 個の公開ファイル/エンドポイント(.git、.env、actuator、pprof、tfstate、バックアップなど)パッシブ · サイト
techスタックのフィンガープリント、および日付付きのテーブルに基づくサポート終了ソフトウェアパッシブ · サイト
headers · csp_analyzerセキュリティヘッダー · 詳細な CSP レビューパッシブ
sslHTTPS、証明書の有効性、脆弱なプロトコル/暗号パッシブ · サイト
cookiesSecure/HttpOnly/SameSite/親ドメインのスコープパッシブ
sri · mixed_content · clickjacking · form_security · csrfページ単位のセキュリティ対策パッシブ
info_disclosure · dir_listing · http_methods · security_txt · waf_detect · graphql_introspection · jwt_analysis · subdomain情報露出と偵察パッシブ
xss · sqli · ssti · open_redirect · cors · host_header_injection反射型/エラーベース/マーカーチェック(無害なペイロード)アクティブ

↗ はターゲット以外のホストにも接続します(--no-external でスキップ)。passive は、細工したペイロードを送信しないことを意味します。プロファイル: passive(パッシブモジュールのみ)、balanced(デフォルト)、aggressive(高いレート/並列度)。

## 仕組み

パイプライン:クロール、32 個のモジュール、フィンガープリントによる集約、攻撃経路への関連付け、ホストごとのトリアージ、レポート — CLI、ダッシュボード、MCP エージェント、GitHub Action で共有されます。

1 つのエンジンに、4 つの利用窓口があります。アドレスのポリシーと制御の証明はエンジンにあるため、すべての利用窓口で適用されます。リクエストガードとトークン認証は Web サーバーに属します。docs/ARCHITECTURE.md を参照してください。

設定(環境変数)
変数デフォルト用途
FSV_HOST / FSV_PORT127.0.0.1 / 7474ダッシュボードのバインドアドレス
FSV_DB~/.fsv/scans.dbSQLite データベース
FSV_TOKEN—すべての API / WebSocket 呼び出しで必要な共有シークレット(X-FSV-Token または ?token=)
FSV_ALLOWED_HOSTS—ダッシュボードが応答する追加の Host 名(DNS リバインディング対策)
FSV_BLOCK_PRIVATEoffループバック / RFC 1918 の対象を拒否します(SSRF 対策)。クラウドメタデータの範囲は常に拒否されます
FSV_REQUIRE_VERIFICATIONoff所有者が制御を証明したホストのみを対象に、ペイロードを送信するスキャンを実行します
FSV_MAX_SCANS3同時スキャン数
FSV_DISABLED_MODULES—無効にするモジュール名(カンマ区切り)
FSV_PLUGIN_DIR / FSV_NO_PLUGINS~/.fsv/plugins / offプラグインの検出
FSV_ADVISORY_FILE / FSV_EOL_FILE—独自の JS ライブラリアドバイザリ / サポート終了日(JSON)

制限 — FSV が できないこと

  • HTML を読み込みますが、JavaScript は実行しません。そのため、クライアント側のレンダリング後にのみ存在するコンテンツは検出されません。
  • アクティブチェックは、一般的な反射型クラスを無害なマーカーで確認します。ペネトレーションテスト、SAST、SCA パイプラインの代替にはなりません。
  • JS アドバイザリとサポート終了日のテーブルは、厳選されたスナップショットです。重要な項目については OSV / endoflife.date と照合し、上記のファイルで拡張してください。
  • DNS チェックの精度はリゾルバー次第です(fsv doctor でテストできます)。応答できないリゾルバーでは、誤った DNS 検出結果ではなく、DNS 検出結果が何も出ません。
  • 検出結果には信頼度が付与されます。暫定的な結果はヒントです。トリアージを行い、誤検知についてお知らせください。最も役立つバグ報告になります。

ドキュメント

検出項目 · アーキテクチャ · モジュールの作成 · 安全なデプロイ · セキュリティポリシー · コントリビューション · 変更履歴

上記のアニメーション SVG とスクリーンショットは、実際のスキャンから生成されています:scripts/build_readme_assets.sh --screenshots。

お問い合わせ

twayst0 (tways) — 作成者兼メンテナー

  • メール:[email protected]
  • Discord:.tways
  • セキュリティ上の問題:公開 issue ではなく、非公開でご報告ください(SECURITY.md を参照)。

ご質問、協業、ライセンスに関するお問い合わせは、メールまたは Discord で歓迎します。

ライセンス

MIT — 商用利用を含め、誰でも自由に使用、変更、共有できます。著作権表示とライセンス表示は残してください。Copyright © 2026 twayst0。LICENSE を参照してください。

免責事項

本ソフトウェアは「現状有姿」で提供され、合法かつ許可を得たセキュリティテストに限り使用できます。 作成者は、誤用または損害について一切責任を負いません。所有していないシステムをテストする前に、必ず書面による許可を得てください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。