# Web の仕組み 2

このセクションでは、実践編で扱う PHP を学ぶ上で不可欠な、インターネットの仕組みについて、前セクションの内容をより詳しく学んでいきます。

# 仕組みを学ぶ理由

Web 開発には、プログラミング言語以外にも知っておくべき知識が存在します。

Web アプリケーションは PHP だけでできているのではなく、サーバーやデータベースなどが連携しあって動いています。そのため、それらの動きや、それらがどのように連携しているかがわかって初めて Web サービスの開発が可能になります。バックエンドの実装には Java, Ruby, PHP など様々な言語が用いられていますが、こちらのセクションで紹介する HTTP 通信の流れや、セッションやクッキーの仕組みは、プログラミング言語によって変わる内容ではございません。

# リクエストとレスポンス

Web の仕組み 1の「 Web サイトが表示されるまでの流れ」ですでに学んだ内容をもとに Web 情報をやりとりする流れをみていきます。

リクエスト

ユーザーが Web ページを閲覧するとき、 URL を指定して「 http://example.com/ を見せてください」と頼みます。

これをリクエストといいます。

サーバーはリクエストを受けると、内部で処理をして画像や HTML ファイルなどを返送します。

これをレスポンスといいます。

上の図ではわかりやすいように省略していますが、実際には「Web サイトが表示されるまでの流れ」で学んだように DNS サーバが間にクライアントと Web サーバの間に入ってドメイン名と IP アドレスを紐づける処理を行います。

情報のやり取りは常に、クライアント(Web ブラウザなど)が要求を出し、サーバが応答を返します。1 つの要求(リクエスト)には 1 つの応答(レスポンス)を返すルールになっています。

ここではさらに、リクエストがサーバーのコンピュータ内で、どのように処理されているのかを見てみましょう。

# サーバー内でのリクエストの処理

image

① ユーザ(クライアント)からリクエストが送られる

リクエストを Web サーバが受け取ります。このとき、リクエストを受け取る窓口のことをポートといいます。

http://〜 でアクセスしていたら、80 番ポートで受け取ることが多いです。

②PHP を実行

Web サーバが PHP を実行します。

③DB 接続

プログラム内容によっては DB からデータを取得してきます。PHP から DB へ接続し、クエリという命令文を実行します。

④ 結果取得

クエリを実行した結果を PHP へ返します。

⑤ レスポンス作成

PHP は DB から結果を受け取り、プログラムの実行を進めます。最終的に HTML ファイルを生成します。

⑥ ユーザ(クライアント)へレスポンスを返す

作成した HTML をユーザ(クライアント)に返送します。

# HTTP 通信について学ぼう

HTTP ( Hyper Text Transfer Protocol ) とは、Web サーバと Web ブラウザの間で、Web 情報をやりとりするためのステートレスなプロトコル(約束事)です。私たちが普段、ホームページで情報収集したり、ブログを読んだりする時、この HTTP を使ってサーバとクライアント(ユーザ)間でやり取りが行われます。

ステートレスとは?

リクエストの前後で状態を保持しないということ

# HTTP リクエストメソッドとは

Web ブラウザから Web サーバに対しての命令(リクエスト)を行う際には、HTTP リクエスト送信されます。そのときにサーバーに要求する処理の種類が HTTP メソッド です。 主なリクエストメソッドは以下の通りです。 本セクションでは、よく用いられる GET, POST, PUT, DELETE の 4 つを紹介します。

リクエストメソッド 説明 よく使われる場面
GET リソースの要求 Web ページの取得、画像データの取得
POST リソースの送信 Web ページ上のフォームからデータを送る、SNS 等でアカウントを新しく作成する
PUT リソースの更新(置き換え) 既存アカウントに追加の情報を送る、既存のブログ記事の更新
DELETE リソースの削除 既存アカウントの削除、Twitter での既存ツイートの削除

実際に「 PHP ひとこと掲示板アプリ」では GETPOST メソッドを用いています。2 つのメソッドの違いをもう少し詳しくみていきましょう。

# GET,POST の違い

# GET メソッドの特徴

  • リソースの取得に用いられる。
  • パラメータは URL の一部としてサーバーに送信される。 GET/login.html?name=test&pass=123
  • ブラウザキャッシュは有効(設定可能)。
  • 最大文字数は 2048 文字

キャッシュとは?

過去に取得したリソースを再使用することで、ウェブサイトやアプリケーションのパフォーマンスが大きく向上させる仕組みです。Web ブラウザが毎回サーバから取ってくるのが面倒なので、キャッシュという箱に入れておいて、そこから持ってくるというイメージです。

Web サイト上で、Ctrl+r をすると、キャッシュにある情報から取ってきますが、 Ctrl+Shift+R を行うと、Web サーバから情報を取ってくることができます。

# POST メソッドの特徴

  • リソースの送信に用いられる。(会員登録で使われることが多い)
  • パラメータは、URL ではなく、メッセージボディに設定されるため、パスワードやユーザ情報などの機密性の高いデータを送信するのに用いられる。
  • ブラウザキャッシュは無効。
  • 文字数制限が無い

HTTP はリクエストの前後で状態を保持しないステートレスなプロトコルであることを説明しました。しかし、実際に Web 開発を行なっていると、前後のやり取りでどのような値を保持していたのかを知りたい場合が多々あります。

例えば、ログインを要する Web サービスを利用するとき、2度目以降の訪問では、パスワードやメールアドレスを入力せずともログイン状態が保持されていることがありますよね。

そのような際に、リクエストをまたぐ値の保持の方法として Cookie(クッキー)と、Session(セッション)があります。

# クッキーとは

ブラウザにある小さな保存領域で、テキストデータを保存しておくことができます。クッキーの内容はサーバーからも読み取ることができます。

実際に自分のブラウザに付与されている Cookie は、chrome の場合「chrome://settings/siteData」で確認することができます。

なお、私たちが Web サービスを利用するとき、よく「ログインフォームにあらかじめパスワードやメールアドレスが入力されている」という状況に出くわします。これは、Cookie とは関係がありません。この機能は、ブラウザの「オートコンプリート」という機能です。Cookie の働きは、あくまでも「ログイン不要でアクセスできる」ことです。

ちなにみ、シークレットモードでは、ブラウザを閉じたときに閲覧履歴、Cookie、サイトデータ、フォームに入力した情報は保存されません。そのため、ログインしない限り、ウェブサイトでは新しいユーザーとして認識され、誰がアクセスしているかはわからなくなります。

# セッションとは

英語で Session とは、期間を指します。コンピュータの世界においても、ユーザーが Web サイトを表示して、離脱するまでの一連の流れを意味します。

例えば、ショッピングサイトにログインしたときからセッションが開始し、ログアウトしたらセッションが終了します。

# セッションで値が保持される仕組み

図1

① セッションが開始すると、サーバーはセッション IDというユニークな ID とセッションファイルを作成します。

② サーバーはセッション ID をユーザのクッキーに保存するように呼びかけます。

③ ページの移動でリクエストを行う際に、クッキー情報も一緒に送信することで、ユーザの持つセッション ID とサーバのセッションファイルが紐づきます。

④ セッションデータはセッションファイルに保存されます。 PHP でセッションを使うときは、セッションという変数を用いてデータの出し入れをします。

このように、クッキーとセッションファイルを紐付けたことにより、どのページに遷移してもセッションデータを保持することができます。

Cookie(クッキー)・・・データをブラウザに保存する仕組み
Session(セッション)・・・ユーザーが Web サイトを表示して、離脱するまでの一連の流れ

クッキーだけの場合、実データがクライアントとサーバー間を行き来するため、セキュリティ上あまり好ましくありません。また、クッキーの場合はデータがクライアント上に保存される点でも、セキュリティ的に良くありません。

そこで登場するのが、セッションです。セッションは実データをそのまま使うかわりに、セッション ID と呼ばれるものを発行します。これにより、実データの代わりにセッション ID が行き来することになるので、セキュリティ的に危険性が下がります。

セッション ID はブラウザを閉じると破棄される一時的なものであるため、セッション ID がばれたとしても、その ID と実データが紐づいている期間は、高々ユーザーがブラウザを閉じるまでです。

しかし、仮にセッションだけでは、ブラウザを閉じた後でもデータを保持しておくことができないため、ブラウザを閉じるたびに、ログイン時にユーザー名から入れなおさなければなりません。

したがって、使い分けとしては、ブラウザを閉じるまでの間だけデータを保持する目的であればセッション、ブラウザを閉じた後でもデータを保存する目的だったらクッキーを使用するということになります。

このように、クッキーを利用した セッション管理を行うことで、HTTP のステートレス性を克服して、状態を保持することができます。

# まとめ

  • サーバサイドのプログラミングをする際には、これらの機能についての知識が必要。
  • クッキーを利用した セッション管理を行うことで、HTTP のステートレス性を克服して、状態を保持することができる。