猫の手ツール

Step 2: Browser & Security

11. ブラウザのセキュリティ:
なぜWebサイトは勝手に
ファイルを見られないのか

インフラエンジニアからフロントエンドへ。ブラウザという「隔離環境」がどれほど堅牢に設計されているか、開発を通して改めて痛感しました。私たちが日々、安心して怪しい(?)サイトを閲覧できるのは、ブラウザが命懸けで守ってくれているからです。

1. ブラウザはPCの中の「砂場(サンドボックス)」

Webサイトにアクセスしただけで、デスクトップにある大切な写真や、仕事の機密書類が勝手に読み取られたら大変なことになります。JavaScriptはPC上で動作するプログラムですが、通常のアプリケーション(Excelやゲームなど)とは決定的に異なる点があります。

それが、サンドボックス(Sandbox) という仕組みです。ブラウザは、実行されているOSのファイルシステムやメモリから隔離された「砂場」のような安全なエリアでしか動けません。砂場の外にあるファイルを持ち出すことも、中に入れることも、基本的には禁止されているのです。

2. ユーザーの「明示的な意思」が壁を壊す

では、なぜ「猫の手ツール」のようなWebアプリで画像を加工したり、ファイルを読み込んだりできるのでしょうか? それは、ユーザーが「このファイルなら見せてもいいよ」と許可を与えた時だけ、一時的にセキュリティの壁に穴が開くからです。

具体的には、<input type="file">をクリックしてファイルを選んだり、画面上にファイルをドラッグ&ドロップしたりする操作がこれにあたります。これらは単なるUIの操作ではなく、ブラウザに対して「この特定のファイルへのアクセス権をJSに渡す」という署名をしているようなものなのです。

コードで見る「権限」の付与

以前のセキュリティ概念が希薄だった時代(あるいはネイティブアプリ)と、現代のWebブラウザの制限を比較してみましょう。

【NG例】もし勝手に読み込めてしまったら(脆弱性)

// ⚠️ 実際には動作しません(セキュリティエラーになります)
const secretData = await fetch('file:///C:/Users/Admin/Desktop/secret.txt');
console.log(secretData); // これができたら世界中のPCが丸裸です。

【正解】ユーザーが許可したファイルだけを扱う

// ユーザーがブラウザのダイアログで「選択」した瞬間
fileInput.onchange = (e) => {
  const file = e.target.files[0]; // ここで初めて「Fileオブジェクト」にアクセス可能
  const reader = new FileReader();
  
  reader.onload = () => {
    console.log("ファイル内容を読み取りました:", reader.result);
  };
  reader.readAsText(file);
};

3. 注意点:初心者がハマりやすい「パス」の勘違い

駆け出しのエンジニアがよく「JavaScriptでPC内の C:\images\photo.jpg を直接読み込みたい」と考えますが、これは絶対に不可能です。

  • フルパスは隠蔽される: セキュリティ上、JS側からは選択されたファイルのPC内でのフルパス(どのフォルダにいたか)すら取得できません。取得できるのはファイル名のみです。
  • 一度閉じたら権限消失: ページをリロードしたり閉じたりすると、そのファイルへのアクセス権は消滅します。再度アクセスするには、ユーザーにまた選んでもらう必要があります。
  • ブラウザごとの制限: Chrome、Safari、Firefoxでファイルアクセスの挙動や、対応しているFileSystem APIの範囲が微妙に異なるため、クロスブラウザの検証が必須です。

4. 実務にどう役立っているか

「猫の手ツール」のようなブラウザ完結型のツール開発において、このサンドボックス構造は「究極の安心感」に繋がっています。

「サーバーにファイルをアップロードせずに、ブラウザ内で完結して処理します」という説明ができるのは、この強固なセキュリティモデルがあるからです。ユーザーのプライバシーを守りつつ、リッチな体験を提供する。ブラウザというプラットフォームの進化には、常に感謝しかありません。

まとめ

私たちが当たり前だと思っている「ファイル選択ボタン」や「ドラッグ&ドロップ」。その裏側では、ブラウザがOSと密接に連携し、ユーザーの許可を厳格に管理しながら、悪意のあるスクリプトからPCを守っています。

この仕組みを理解することは、単に「エラーが出ないコードを書く」だけでなく、「ユーザーに信頼される安全なWebアプリ」を作るための第一歩と言えるでしょう。

© 2026 nekonote-tools.com