フロントサーバ — 画面を組み立てて返す係

概要 — まず全体をつかむ

初級ではフロントを「顔」と捉えました。中級では、静的配信アプリサーバ(SSR)を分けて正確に見ます。

詳細 — 1段階ずつ追う

これは何をする係?

「フロント」と一口に言っても、実体は2種類が組み合わさっています。

  • 静的配信(Nginx・CDNなど)— 変わらないファイルをそのまま返す。速く、負荷が軽い
  • アプリサーバ(SSR)(Next.js など)— リクエストごとにHTMLを生成する

登場人物メモ:

  • ※1 SSR/CSR/SSG — サーバ側生成/クライアント側生成/ビルド時生成
  • ※2 ハイドレーション — サーバ生成のHTMLに、ブラウザでJSを結びつけて操作可能にする工程
この部分をもっと深く(上級

どこで・いつHTMLを作るかが、速さ・鮮度・コストを決めます。

  • CSR/SSR/SSG/ISR — クライアント/サーバ/ビルド時/再生成つき静的
  • ストリーミングSSR — 出来た部分から送る
  • エッジSSR — CDNのエッジで生成し、利用者に近い場所から
  • サーバコンポーネント(RSC) — サーバで描き切り、クライアントのJSを削る
やさしく言うと(初級

レストランのホール係を思い浮かべてください。注文を受け、料理(データ)は厨房(バックエンド)に頼み、盛り付けてテーブルに運ぶ——お客さんが接するのはこの人です。

サーバ機器
フロントサーバの実体もこうしたコンピュータ

フロントサーバは、見た目(HTML・CSS・JS ※1) を組み立てて返します。中身のデータは自分では作らず、バックエンドに頼みます。

登場人物メモ:

  • ※1 HTML・CSS・JS — HTML(骨組み)・CSS(見た目の装飾)・JS(動き)。この3つで画面ができる
  • ※2 静的ファイル — 画像・CSS・JSなど、誰に対しても同じもの

仕事の流れ

  1. 入口(ロードバランサ/リバースプロキシ)経由でリクエストが届く
  2. 静的アセット(画像・CSS・JS)は CDN/静的配信から返す(キャッシュが効く)
  3. 動的ページは SSR でHTMLを生成し、必要なデータは API から取得する
  4. ブラウザで ハイドレーション(HTMLにJSを載せて操作可能にする)
この部分をもっと深く(上級
  1. リクエストがエッジ/オリジンに届く
  2. 必要ならストリーミングで段階的に送出
  3. クライアントで部分/遅延ハイドレーション(見えている所から動かす)
  4. 静的アセットはコード分割・プリロード・不変キャッシュ
やさしく言うと(初級
  1. ブラウザから「このページください」を受け取る
  2. 画面の器(HTML)を用意する
  3. 中身のデータが要るなら、バックエンドに頼む(API)
  4. 受け取ったデータを画面にはめ込み、組み立てて返す
  5. ブラウザがそれを描画 → あなたが見る

描画方式の使い分け

  • CSR(クライアント側描画)— 最初は空のHTML+JSで描く。初期表示は遅めだが操作は軽快
  • SSR(サーバ側描画)— 初期表示が速く、SEOに強い。サーバ負荷は上がる
  • SSG(ビルド時生成)— あらかじめHTMLを作っておく。最速だが更新に弱い
アニメーション『HTMLをどこで組み立てるか』を開く
HTMLは「いつ・どこで」組み立てる?ビルド → サーバ → ブラウザ の3段のうち、★でHTMLが完成する位置がちがうSSGビルド時に生成🏗️ビルドHTMLを前もって生成★ HTML完成🖥️サーバ静的ファイルを配るだけ🌐ブラウザ受け取って表示速い・全員同じSSRリクエストごとに生成🏗️ビルド土台を用意するだけ🖥️サーバ毎回HTMLを組み立て★ HTML完成🌐ブラウザ受け取って表示毎回最新・個別化CSRブラウザ側で生成🏗️ビルドJSをまとめる🖥️サーバ空のHTML+JSを渡す🌐ブラウザJSがHTMLを組み立て★ HTML完成操作の重いUI向き

静的アセットはハッシュ付きファイル名+長期キャッシュにして、変更時だけ新しいファイル名で配るのが定石です。

この部分をもっと深く(上級
  • アイランド/部分ハイドレーション — 動的な島だけをJSで動かし、残りは静的
  • キャッシュ戦略 — ISR/stale-while-revalidateで鮮度と速さを両立
  • アセットパイプライン — 圧縮(brotli)、ハッシュ名+長期キャッシュ、重要リソースの優先読み込み
  • 画像最適化 — 適応配信、遅延読み込み、寸法先行確保
やさしく言うと(初級
  • 静的配信 — 誰に見せても同じもの(画像・CSS・JS)は、そのまま配る。速い
  • 動的(SSR) — 人によって違う画面(ログイン後など)は、その場で組み立てて返す

「トップページの見た目」は静的、「マイページ」は動的、と混ざっているのが普通です。

なぜフロントだけじゃダメ?

フロントとバックを分ける核心は 信頼境界(trust boundary) です。手元(クライアント)は信用できない、という前提から設計します。

  • クライアントは信頼しない — ブラウザから来る値も、そこで走るコードも、すべて改ざん可能。フロントのバリデーションは「親切機能(UX)」であって防御ではない。最終的な検証・認可はバックで必ずやり直す
  • 単一の真実(source of truth) — 在庫・残高などの正はDBが唯一。クライアントの計算結果は信用しない
  • 秘密情報の隔離 — 資格情報・APIキー・署名鍵はサーバ側だけ。ブラウザに配られるコードは全部読まれる前提
  • 関心の分離とスケール — 配信(CDNで剥がせる)と処理(水平スケール)は最適化の方向が違うので、分けたほうが伸ばしやすい

合言葉は「フロントでやったチェックは、サーバでもう一度やる」。二度手間に見えて、これが基本です。

見た目(フロント)と中身(バック)を分け、境界を API(JSON)で薄くつなぐ——この構図が分離の基本形です。

アニメーション『フロントとバックの分離』を開く
フロントとバックの分離 — 見た目と中身を分ける境界(信頼境界)フロント=見た目画面を組み立てて返す・静的配信HTML / CSS / JS を組み立てて返す静的配信(画像・CSS・JS を CDN から)入力の見た目チェック(UX。防御ではない)バック=中身業務ロジック・データを扱う裏方業務ロジック(判断・計算)認可・検証(最終チェックはここ)DB=単一の真実(在庫・残高)秘密情報(鍵・資格情報)はここだけDB(単一の真実)リクエストレスポンス(JSON)見た目はフロント/判断とデータはバック — 境界はAPIで薄くつなぎ、最終チェックはバックでやり直す
やさしく言うと(初級

「フロントだけで全部やればいいのでは?」と思うかもしれません。でも、それだと困ることが3つあります。

  1. 手元は改ざんできる — ブラウザはあなたのPCの中。中身は見えるし、書き換えられます。もし「支払い済みか」をフロントで判断したら、誰でも書き換えて「済み」にできてしまう。だから大事な判断はサーバ(バック)でやる
  2. みんなで同じデータを見たい — 在庫や残高は、全員が同じ正しい値を見る必要がある。各自の手元で持つとバラバラになる。だからDBという「1つの正しい置き場」に集める
  3. 秘密が置けない — DBの鍵やAPIキーは、中身が見えるフロントには置けない。だから秘密に触れるのはサーバ側だけ

つまりフロントは「顔」に徹し、判断とデータは信じられない場所(手元)ではなく、守られた場所(バック)で扱う。これがフロントとバックを分ける理由です。

⚠️ うまくいかないとき

  • TTFB(最初の1バイトまで)が遅い — SSRが重い → キャッシュ/SSGに寄せる
  • ハイドレーションのズレ — サーバ生成とクライアントの状態が食い違い、画面が乱れる
  • CLS(表示中のガタつき) — 画像や広告の高さを先に確保していない
この部分をもっと深く(上級
  • ハイドレーションミスマッチ — サーバとクライアントの出力差で乱れる
  • Core Web Vitals悪化 — LCP/INP/CLS。重いJSやレイアウト未確保
  • バンドル肥大 — 依存の入れすぎで初期JSが重い
  • キャッシュとパーソナライズの衝突 — 個人向けを共有キャッシュに載せる事故
やさしく言うと(初級
  • 見た目は出るが中身が空 — バックエンドやDBが応答していない(顔はあるが料理が来ない)
  • レイアウトが崩れる — CSSやJSが読み込めていない
  • 真っ白 — JSのエラーで描画が止まった

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. SSRで生成したHTMLに、ブラウザ側でJSを載せて操作可能にする工程はどれ?

2. 初期表示が速くSEOに強い代わりにサーバ負荷が上がる、サーバ側でHTMLを生成する描画方式を英字3文字で答えてください。

3. 内容が全員共通で更新も稀な「会社概要」ページに最も向く生成方式はどれ?

4. CSR(クライアント側描画)の特徴として正しいのは?

5. フロント側で行う入力チェック(バリデーション)の位置づけとして正しいのは?

6. 在庫や残高の「唯一の正しい値(単一の真実)」を持つべき場所はどこか?

7. 「最初の1バイトが届くまで(TTFB)が遅い」とき、まず検討する対処は?

8. 静的アセットを「変更したときだけ新しい名前で配る」ために、ファイル名へ付けるのは何付きの名前か(カタカナで)。