この記事を書く目的
これまでに、以下の内容を学習してきました。
- プロトコルとは
- TCP/IPモデルの概念
- クライアントサーバーモデル
- URL
今回は、URLのスキームでもよく目にする身近なプロトコル「HTTP」を勉強します。
まずは基本となるGETとPOSTの違いを押さえたいです。
この記事の内容
- HTTPが担う役割
- GETメソッドとPOSTメソッドの違い
- 各メソッドの違いを理解する意義
HTTPとは
ネットワーク通信のためのプロトコルの1つです。
HyperText Transfer Protocolの文字をとってHTTPです。
TCP/IPモデルでは、アプリケーション層に位置します。
アプリケーション層プロトコルの役割は、通信サービスの実現です。
HTTPはWWWサービスの実現に不可欠なプロトコルで、クライアントとサーバー間でリソースの送受信を行うために用いられます。
初期のWebはシンプルなHTMLファイルのやり取りから始まりましたが、現代のWebが扱うリソースの種類は多岐に渡ります。
Webの発展に伴う大容量のデータや多様なコンテンツに対応するため、HTTPの改良が進み、バージョンは複数あります。
HTTPのステートレスという性質はクッキーやセッションと関連があります。
リクエストメソッドとは
クライアントのサーバーに対する要求には種類があります。
この要求の種類のことをリクエストメソッドと呼び、目的に合わせて適宜使い分けます。
- GET
- POST
- DELETE
- PUT
- PATCH
などがあります。
今回は基本となるGETとPOSTを学びます。
DELETE,PUT,PATCHなど他のメソッドは、今後RESTful APIを学習するときに必要となる知識のようです。まずは存在を認知し、おおまかな役割だけでも押さえておこうと思います。
GETメソッドとPOSTメソッドを整理してみる
GET | POST | |
---|---|---|
目的 | サーバーからのリソースの取得(読み取り専用) | サーバーのリソースへデータを送信 |
リクエスト内容の格納場所 | URL | メッセージのボディ |
冪等性 | 冪等である | 冪等ではない |
具体的な利用シーン | Webページの閲覧、URLによる他者とのリソースのシェア | 新規ユーザー登録のフォームデータの送信 |
ブックマーク | 可 | 不可 |
GETメソッドの特徴
GETメソッドは、サーバーからのリソースの取得に使います。
「リソースの取得」という表現はあまり馴染みがないですが、私たちは頻繁にGETリクエストを使って、サーバーに対してリソースの取得を要求しています。
具体例
具体例は、以下の通りです。
- Webサイトで何かをクリックするとき
- 知人から「このサイト見て」とLINEが届き、スマホからURLリンクをタップするとき
これらは、GETメソッドでサーバーに対してリクエストしていることになります。
GETメソッドのやり取りを会話に例える
ブラウザ:「このURLのWebページを見せてください!」(GET /index.html)
サーバー:「はい、どうぞ!」(200 OK + コンテンツ)
200 OKは、リクエストが成功したことを示すレスポンスステータスコードです。
レスポンスステータスコードとは、3桁の数字で表現されるサーバーからの応答です。
POSTメソッドの特徴
頻繁に対比されるPOSTメソッドです。こちらもメソッドなので、「サーバーに対して要求をする」という点はGETと共通ですが、
POSTメソッドは、指定サーバーのリソースへのデータ送信に使われます。新しいリソースの作成や処理の実行のためのメソッドです。
具体例
具体例は、以下の通りです。
- 使いたいサービスは会員登録が必要だったので、新規会員登録のためにidとpasswordをフォームに入力し、登録ボタンを押した
- お問い合わせフォームに質問内容を記入し、送信ボタンを押した
POSTメソッドのやり取りを会話に例える
ブラウザ:「idにhoge@gmail.com
を、passwordに1234
の情報を送信するので、このデータを元に処理をお願いします!」(POST /signup)
サーバー:「承知しました。新しいユーザーを作成しました!」(201 Created)
201 Createdは、リクエストが成功し、新しいリソースが作成されたことを示すステータスコードです。
なぜGETとPOSTの違いを理解する必要があるのか
「GETとPOSTの違いは、Webサービス開発の基本です」とよく目にしますが、なぜこの2つの違いを学ぶことが重要なのでしょうか。
それは、「リクエスト内容の格納場所が、セキュリティに影響するから」です。
POSTでリクエストを送るべき場面でもGETで送ることができてしまうので、注意が必要です。
GETリクエスト内容の格納場所は
- GETの場合、URL内に含む
- POSTの場合、メッセージのボディに含む
です。
サインアップを例に
新しいサービスを利用する際の会員登録を例に考えます。
このようなケースではPOSTメソッドが使われるべきです。なぜなら、もしGETメソッドで会員登録のフォームデータを送った場合、idとpasswordのような個人情報がURLのパラメーターに記載されることになります。
/signup?id=hoge%40gmail.com&password=1234
このマズさは、URLの本質を押さえることで理解できました。
URLとは、世界中の人と情報を繋げるための技術です。URLにリクエストの内容を含むということは、他者に容易に情報を共有できてしまうということです。シェアするつもりがなくても、ブラウザの履歴やログとして残る可能性があります。
大事な情報はURLに含めるべきでないことがわかります。
大事な情報はボディに入れる
POSTメソッドであれば、メッセージのボディに格納することができます。
メッセージはヘッダとボディに分けられます。ボディとは、HTTPリクエストの中でデータを運ぶ部分のことで、URLには表示されない場所です。
ボディに格納するからと言って、POSTを選択すれば万事OKとは言えないそうです。この辺りはHTTPSなどセキュアな通信の勉強が必要なので、今後の課題とします。
URLはURLでとても便利なものなので、適宜メソッドを使い分ける必要があることがわかりました。
学んだことまとめ
- HTTPは、TCP/IPモデルのアプリケーション層のプロトコルで、ネットワーク上にある多様なリソースの送受信のために必要な技術
- GETのリクエスト内容はURLに含まれるので、目的に合わせてメソッドを選択する必要がある
今回扱わなかった他のメソッドはRESTfulAPIへ、冪等性への理解はサーバーレスなどに続いていくようです。
一歩ずつ進んでいきます。
参考資料