クライアントサーバーシステムとは?ブラウザーとサーバーが役割を分けて動く仕組み

Webサイトを開くとき、手元のブラウザーとインターネットの向こうにあるサーバーは、役割を分けてやりとりしています。この形の名前が、クライアントサーバーシステムです。
本記事では、頼む側と応える側の役割や、サーバーの中でプログラムが動く仕組みを解説します。サーバーの脆弱性がなぜ多くのサイトに影響するのかも、この仕組みを知れば見えてくるはずです。
クライアントサーバーシステムとは
クライアントサーバーシステムは、処理を頼む「クライアント」と、頼まれた処理を引き受ける「サーバー」に役割を分けて動く仕組みです。
Webでいえば、ブラウザーやスマートフォンのアプリがクライアントです。利用者の操作を受け付けてサーバーに頼みごとを送り、返ってきた結果を画面に表示します。
サーバーの役目は、記事や会員の情報などのデータを持ち、頼まれた処理を引き受けることです。データを1か所にまとめておけるため、誰がどの端末から開いても、同じ記事や自分のアカウントの情報を見られます。
クライアントとサーバーは、機械の種類ではなく、そのやりとりで果たす「役割」の名前です。同じプログラムでも、ある接続ではサーバーとして応え、別の接続ではクライアントとしてほかのサーバーに頼むことがあります。たとえば、ブラウザーから頼まれたWebサーバーが、データベースのサーバーに問い合わせる場合です。
リクエストとレスポンス
クライアントからサーバーへの頼みごとを「リクエスト」、サーバーからの返事を「レスポンス」と呼び、Webではこのやりとりの決まりをHTTPが定めています。
リクエストには、どのページが欲しいかを示すURLと、何をしたいかを示すメソッドが入ります。ページを見るときは GET、フォームの入力を送るときは POST を使うのが一般的です。
レスポンスの先頭には、結果を表す3けたの状態コードが付きます。ページを返せたときは 200、ページが見つからないときは 404、一時的な過負荷や保守で応えられないときは 503 です。サイトのメンテナンス中に表示される画面の多くは、この 503 と一緒に返されています。
やりとりを始めるのは、常にクライアントの側です。サーバーは、届いたリクエストに応えるだけで、自分から話しかけることはしません。
もう1つ大事なのは、HTTPのリクエストが1回ずつ独立していることです。同じサーバーに続けてリクエストを送っても、HTTPの決まりの上では前のリクエストとのつながりはありません。ログインしたままの状態を保つには、Cookieという小さなデータをリクエストのたびに一緒に送る方法が使われます。
クライアントとサーバーで動くプログラム
Webでは、クライアントとサーバーの両方でプログラムが動いています。ブラウザーの中で動くプログラムの言語がクライアントサイド言語、サーバーの中で動くプログラムの言語がサーバーサイド言語です。
書いたプログラムと、それを実行するプログラム
書いたプログラムが、何によって実行されるのかを、両方の側について図に描きました。
どちらの側でも、書いたプログラムのファイルだけでは動きません。それを読み込んで実行するプログラムと組になって、はじめて動きます。2つの側で違うのは、プログラムがどこで動き、ブラウザーに何が届くかです。
クライアントの中で動くプログラム
クライアントの側では、ブラウザーがプログラムを実行します。Webで使われる言語は、主にJavaScriptです。
ページを開くと、サーバーからHTMLやCSSと一緒にJavaScriptのファイルが届き、ブラウザーがそれを実行します。メニューの開け閉めや、入力した内容の形式をその場で確かめる処理のように、届いたページの見た目と動きをよくするのが主な役目です。
プログラムのファイルが利用者のパソコンに届くので、利用者はその中身を見られます。一方で、ブラウザーの中のプログラムは、パソコンのファイルなどにはほとんど触れられません。
詳しくはクライアントサイド言語とは?で解説しています。
サーバーの中で動くプログラム
サーバーの側では、言語を実行するプログラムをサーバーの機械にインストールしておき、それが書いたプログラムを実行します。使う言語はPHP、Python、Ruby、C#などから選べるのが特徴です。たとえばPHPなら、PHP本体と呼ばれるプログラムが .php のファイルを読み込んで実行します。
サーバーがレスポンスを用意する方法は、置いてあるファイルをそのまま返す方法と、プログラムを動かしてその場で中身を作る方法の2つです。前者で作るページを静的なページ、後者を動的なページと呼びます。どちらの場合も、リクエストを受け付けるのは、サーバーの機械の中で動く「Webサーバー」というソフトです。
静的なページでは、あらかじめ作ったHTMLファイルをサーバーの機械の中に置いておき、Webサーバーがそれを読み出して返すだけです。誰がいつ開いても、届く中身は変わりません。
動的なページの場合、Webサーバーから処理を任された実行するプログラムが、書かれた手順に沿ってデータベースに問い合わせ、HTMLを組み立てる仕組みです。ブログの新着一覧や、ログインした人ごとに違う画面は、この方法で作られています。
ブラウザーへ届くのは作られたHTMLだけで、元のプログラムは利用者から見えません。どの記事を見せるか、誰に見せてよいかを決めるのも、サーバーの側の役目です。
詳しくはサーバーサイド言語とは?で解説しています。PHPを例にした、言語、プログラムのファイル、PHP本体の関係も、この記事で扱いました。
1つのサーバーが大勢のクライアントを受け持つ
1つのサーバーには、大勢のクライアントから次々にリクエストが届き、サーバーはそれぞれに順に応えてレスポンスを返します。
PHPの場合、リクエストのたびに起動し直すのではなく、動き続けている1つのPHP本体が何件ものリクエストを順番に受け持ちます。前のリクエストの処理で使ったメモリを片付けてから、次のリクエストに取りかかる流れです。
「サーバー」という言葉は、機械を指すことも、その中で動くソフトを指すこともあります。サーバーの役割を受け持つのは、1台の機械とは限りません。利用者が多いサービスでは、同じ役割のサーバーを何台も並べてリクエストを振り分けます。反対に、1台の機械の上でWebサーバーとデータベースのサーバーを一緒に動かす例も珍しくありません。
安全面の注意
インターネットに公開したサーバーには、誰でもリクエストを送れます。図のように、普通の利用者のブラウザーと攻撃者のプログラムは、サーバーから見れば同じリクエストの送り手です。
そのため、サーバー側のプログラムは、届いたリクエストの中身を信用せずに扱わなければなりません。ブラウザーの画面で入力の形式を確かめていても、攻撃者は画面を通さずに、好きな中身のリクエストを直接送れるからです。
サーバーで動くソフトウェアに脆弱性が見つかると、そのソフトウェアを使っているサーバーはすべて、外部からのリクエストで攻撃を受けるおそれがあります。データを1か所に集められる点は利点ですが、サーバーを乗っ取られると、多くの利用者のデータが一度に危うくなりかねません。
サーバーのソフトウェアを更新できるのは、サーバーの管理者だけです。利用者がブラウザーやアプリを最新にしても、サーバー側の不具合は直せません。
製品での使われ方
WebサイトやWebメール、スマートフォンのアプリ、オンラインゲームの多くは、クライアントサーバーシステムで動いています。WordPressもPHPのスクリプトの集まりで、WordPressで作ったブログは、サーバーの上のPHP本体がそれを実行してページを組み立てる動的なサイトです。
サーバーの管理を誰が受け持つかは、サーバーの借り方で変わります。レンタルサーバーではサーバー会社がPHP本体などのソフトウェアを更新し、VPSやクラウドの仮想サーバーでは借りた人が自分で更新しなければなりません。2026年10月に公表されたPHP本体の脆弱性では、この違いによって、サイトの運営者がやることが分かれました。詳しくはPHP2Shellとは?PHPの重大な脆弱性とサイト運営者がやることで解説しています。
ブラウザーがサーバーを見つける仕組みはドメイン名とは?、アプリどうしがサーバーの機能を使う窓口はAPIとは?が参考になるでしょう。
参考にした一次情報
本記事は、次の資料をもとに書きました。RFCは、インターネットの技術の決まりを定めた公開文書で、RFC 9110はWebのやりとりの決まり(HTTP)を定めたものです。MDN Web Docsは、ブラウザーのFirefoxを作っているMozillaが公開している、Webの技術の解説資料にあたります。