クライアント側Webツールの構造:プライバシーと高速処理

Web Workers、Web Crypto API、Canvasを駆使し、外部サーバーへデータを送信せずブラウザ内で完結するWebツールの仕組みを詳細に解説します。

従来のオンライン便利ツールは、サーバーにファイルをアップロードして処理結果を受け取る「リクエスト・レスポンス方式」が主流でした。しかしこの仕組みは、機密PDFや社内JSONデータの漏洩リスク、外部サーバーでの保存リスク、ネットワーク遅延などの課題を伴います。

現代のWebブラウザは非常に優れた実行環境へと進化しました。Web Crypto API、HTML5 Canvas 2D contextWebAssembly (WASM)、そして pdf-lib などの純粋なJavaScriptライブラリの登場により、文書編集、ハッシュ計算、コード圧縮、画像変換のすべてが100%ブラウザ内部だけで完結します。

主な利点

  • サーバー保存ゼロ: 演算と変換がすべて端末内で処理されるため、データが外部へ送信されることはありません。
  • ハードウェアアクセラレーション: Canvasの画像描画や暗号化APIが端末のGPU・CPUを活用し高速に動作します。
  • オフライン完全対応: 一度読み込まれたアセットは、インターネット回線が切断された状態でも正常に機能します。
  • 待ち時間なし: ネットワーク通信の往復が発生しないため、ボタン操作と同時に結果が得られます。

なぜクライアント処理がプライバシーの最高基準なのか

機密情報(JWTトークン、個人情報、データベースのダンプデータなど)を無作為な外部サーバー型ツールに入力することは、情報漏洩の危険を伴います。

クライアントサイドツールはこのリスクを根本から解消します。JavaScript Minifier などでコードを整形・圧縮する際、ブラウザ標準のJavaScriptエンジンが端末内で構文解析を実行するため、外部へのHTTP POST送信は一切発生しません。

// Pure client-side parsing and formatting
function formatJsonSafely(rawInput, spaces = 2) {
  try {
    const parsed = JSON.parse(rawInput);
    return {
      formatted: JSON.stringify(parsed, null, spaces),
      isValid: true,
      error: null
    };
  } catch (err) {
    return {
      formatted: null,
      isValid: false,
      error: err.message
    };
  }
}

メモリ上でのバイナリ操作:PDF編集の技術

複数PDFの結合やページの回転には、バックエンドのGhostscriptなどが不可欠だと思われがちです。

現代のWeb技術では pdf-lib などのライブラリを用い、ブラウザの FileReader API でファイルを ArrayBuffer としてメモリに直接読み込みます。PDF構造の解析から再構築、Blob化までをWeb Worker内で完結させます。

import { PDFDocument, degrees } from 'pdf-lib';

async function mergePdfFiles(arrayBuffers) {
  const mergedPdf = await PDFDocument.create();
  
  for (const buffer of arrayBuffers) {
    const donorDoc = await PDFDocument.load(buffer);
    const copiedPages = await mergedPdf.copyPages(
      donorDoc,
      donorDoc.getPageIndices()
    );
    copiedPages.forEach((page) => mergedPdf.addPage(page));
  }
  
  const mergedBytes = await mergedPdf.save();
  return new Blob([mergedBytes], { type: 'application/pdf' });
}

当サイトの PDF Editor & Merger はまさにこの技術を採用しています。外部に一切送信されることなく安全に文書を結合できます。

HTML5 Canvas による超高速な画像圧縮

ブラウザでの画像リサイズ処理は、GPUアクセラレーションを活かして高速に行われます:

  1. 選択された画像ファイルを URL.createObjectURL(file) で読み込みます。
  2. 画面に表示されないオフスクリーン <canvas> を生成しリサイズ先サイズを設定します。
  3. 2D描画コンテキストの drawImage() を呼び出しバイキュービック補間を実行します。
  4. canvas.toBlob() によりブラウザネイティブのC++エンコーダーがJPEGやWebPへ変換します。
async function compressImageClientSide(file, maxWidth, quality = 0.8) {
  const img = new Image();
  const objectUrl = URL.createObjectURL(file);
  img.src = objectUrl;
  await img.decode();
  URL.revokeObjectURL(objectUrl);

  const scale = Math.min(1, maxWidth / img.naturalWidth);
  const canvas = document.createElement('canvas');
  canvas.width = Math.round(img.naturalWidth * scale);
  canvas.height = Math.round(img.naturalHeight * scale);

  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

  return new Promise((resolve) => {
    canvas.toBlob((blob) => resolve(blob), 'image/jpeg', quality);
  });
}

通信量を消費しないこの処理は Image CompressorImage Editor で体感できます。

最新ブラウザの暗号化基盤:Web Crypto API

かつては巨大な外部ライブラリが必要でしたが、現在の主要ブラウザは SubtleCrypto インターフェース(crypto.subtle)を標準搭載しており、高速なネイティブコードでハッシュ生成を実行できます:

async function computeSha256(plainText) {
  const encoder = new TextEncoder();
  const data = encoder.encode(plainText);
  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
  
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}

利点:

  1. 高セキュリティ: インタプリタ実行されるJSコードよりもタイミング攻撃耐性に優れます。
  2. 圧倒的処理速度: 大容量テキストでもわずか数ミリ秒でハッシュを計算します。

ぜひ UUID GeneratorBase64 Encoder & Decoder をご利用ください。

よくある質問

データは本当に外部サーバーへ送信されていませんか? はい。開発者ツール(F12)の ネットワーク(Network) タブを開いた状態で操作しても、POST通信などの外部送信は一切記録されません。

オフラインでも利用できますか? はい。キャッシュ機能により、ネット接続がない環境でも端末のCPUとメモリだけで全機能が稼働します。

PDFファイルの容量に制限はありますか? 端末の空きメモリ(RAM)容量に依存します。1〜100ページ程度の一般的な文書であれば快適に処理できます。