← 一覧に戻る

不動産相場チェッカー Web版 完成

2026年3月8日 15:15 更新

一言でいうと

Colab版をブラウザだけで使えるWebアプリにした(完了)

なぜこれが必要だったのか

不動産相場チェッカーの Colab 版(Googleが提供するプログラム実行環境で動くバージョン)は完成して公開済みだけど、使うには Google アカウントでログインして Colab を開く必要があった。「もっと手軽に、ブラウザだけで使えないか?」という要望が出ていた。

ただし、国交省の不動産データを取得するための API(プログラム同士が会話する窓口)には2つの制約がある:

放置すると、せっかく作った相場分析ツールが「Colabを使える人限定」のままで、スマホやタブレットから気軽に使えない。

何をしたのか

「静的HTML 1ファイル」+「Cloudflare Workers(クラウドフレアが提供する、世界中に分散した小さなサーバー)で中継サーバー」という構成で実装・デプロイが完了した。

全体の流れ

ユーザーのブラウザからの通信ルート

国土地理院のAPIはCORS(異なるサイト間の通信許可)に対応しているので直接呼び出せるが、国交省のAPIは対応していないので中継サーバーを経由する。この中継サーバーがCloudflare Workersの役割。

APIキーの扱い

ユーザーが入力したAPIキーは、ブラウザの localStorage(ブラウザ内にデータを保存する機能。ページを閉じても消えない)に保存される。サーバーには一切保存しない。中継サーバーはキーを「通過させるだけ」で、記録も保管もしない。

BEFORE(現在)

  • Colabを開く必要がある
  • Googleアカウント必須
  • スマホからは使いにくい
  • Python実行環境が必要

AFTER(完成後)

  • ブラウザだけで使える
  • アカウント不要
  • スマホ・タブレット対応
  • URLを開くだけで即使える

やったこと(全4ステップ完了)

1 Cloudflare Workers で中継サーバーを構築・デプロイ ✓
国交省APIにCORS(異なるサイト間の通信許可)非対応のままアクセスするための中継役。Hono(ホノ)という軽量Webフレームワーク(わずか14KBで、Cloudflare Workers公式推奨)を使ってTypeScript(型がついたJavaScript)で構築した。許可するリクエスト先を国交省の2つのエンドポイント(受付窓口)だけに制限している。デプロイ済みで、ヘルスチェック・403拒否・401認証・CORS応答の4つのテストに全て合格。
2 Webアプリ本体(HTML 1ファイル)を作成 ✓
Colab版で動いている分析ロジック(住所→坪単価計算の全工程)をPythonからJavaScriptに移植した。移植した処理は15個以上あり、住所の緯度経度変換・取引データ取得・異常値除外・坪単価集計・建物残価推定などを含む。外部ライブラリは一切使わず、HTML/CSS/JavaScriptの1ファイル(約1,065行)で完結。既存LPのデザインテイスト(テラコッタ系の暖色デザイン)を引き継いでいる。
3 既存LPに「Web版を使う」ボタンを追加 ✓
紹介ページ(GitHub Pages上のLP)に、Colab版と並んで「Webアプリ版を使う」テラコッタ色のボタンを追加した。ユーザーがどちらのバージョンを使うか選べる。
4 Codexセキュリティ監査 ✓
GPT-5.4(Codex)でOWASP Top 10ベースのセキュリティレビューを実施。指摘2件を修正済み:(1) 中継サーバーに30秒タイムアウトを追加(無応答時にいつまでも待ち続ける問題を防止)、(2) CSP(通信先の制限設定)から開発用のlocalhost許可を除去(本番環境に不要な穴を塞いだ)。

セキュリティ対策

対策 具体的な方法
XSS防止(悪意のあるスクリプトの埋め込み防止) textContent(テキストとして安全に表示する方法)のみ使用。innerHTML(HTMLを直接書き込む方法。攻撃に悪用されやすい)は禁止
CSP(通信先の制限) 中継サーバーと国土地理院APIだけに通信を許可。他のサイトへの通信をブロックする
外部スクリプト不使用 外部の読み込みなし。攻撃経路を最小化する
APIキー保護 ブラウザ内のみ保存。URLパラメータには含めない。「キーを削除」ボタンで即消去可能

ファイル構成

ポイント

なぜCloudflare Workersなのか? — APIキーはリクエストヘッダー(通信の付帯情報)に含まれて中継サーバーを通過するが、Cloudflare Workersは X-API-Key などのヘッダーを自動的にログから隠す機能がある。つまりキーが中継サーバーのログに残るリスクが低い。無料枠で1日10万リクエストまで使えるのでコストもかからない。

暗号化しないの? — ブラウザ内でAPIキーを暗号化する方法もあるが、暗号化する鍵もブラウザ内に置くことになるので実質無意味(金庫と鍵を同じ場所に置くようなもの)。それよりもXSS(悪意のあるスクリプト埋め込み)を防ぐことに注力する方が効果的。

なぜHonoなのか? — 最初は「外部ライブラリなしでJavaScript 1ファイル」を検討したが、Cloudflare Workers の公式推奨フレームワークであり、CORS ミドルウェアなど必要な機能が組み込みで用意されている。わずか14KBと超軽量なのでYAGNI/KISSにも反しない。

なぜReactを使わないのか? — 入力フォーム1個とテーブル2個だけの画面にReactは過剰。バニラ(素の)HTML/CSS/JavaScriptで十分に実現でき、ビルド環境も不要。YAGNI(今必要ないなら作らない)とKISS(シンプルに)の原則に従った判断。

見送ったこと — 認証機能やユーザーアカウント機能は作らない。「APIキーを自分で管理する」というシンプルな方式を維持することで、ユーザーデータを預からない=漏洩リスクゼロの設計にしている。

残りのタスク — Colab版と同じ住所で分析して坪単価が一致するかの突き合わせ検証がまだ。GitHub Pagesへのデプロイ完了後にブラウザで実際に動作確認する予定。

📝 質問モード — テキストを選択してね
✓ 質問を送信しました