HTTPリクエストの基本 GETとPOSTの違いを学ぶ

# この記事を書く目的

これまでに、以下の内容を学習してきました。

- プロトコルとは
- TCP/IPモデルの概念
- クライアントサーバーモデル
- URL

今回は、URLのスキームでもよく目にする身近なプロトコル「HTTP」を勉強します。
まずは基本となるGETとPOSTの違いを押さえたいです。

# この記事の内容

1. HTTPが担う役割
2. GETメソッドとPOSTメソッドの違い
3. 各メソッドの違いを理解する意義

# HTTPとは

ネットワーク通信のためのプロトコルの１つです。
**H**yper**T**ext **T**ransfer **P**rotocolの文字をとってHTTPです。

TCP/IPモデルでは、**アプリケーション層**に位置します。
アプリケーション層プロトコルの役割は、通信サービスの実現です。

HTTPはWWWサービスの実現に不可欠なプロトコルで、**クライアントとサーバー間でリソースの送受信を行う**ために用いられます。

初期のWebはシンプルなHTMLファイルのやり取りから始まりましたが、現代のWebが扱うリソースの種類は多岐に渡ります。

Webの発展に伴う大容量のデータや多様なコンテンツに対応するため、HTTPの改良が進み、バージョンは複数あります。

https://developer.mozilla.org/ja/docs/Web/HTTP/Evolution_of_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サービス開発の基本です」とよく目にしますが、なぜこの２つの違いを学ぶことが重要なのでしょうか。

それは、「リクエスト内容の格納場所が、**セキュリティに影響するから**」です。

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へ、冪等性への理解はサーバーレスなどに続いていくようです。

https://aws.amazon.com/jp/builders-flash/202104/serverless-idempotency/

一歩ずつ進んでいきます。

# 参考資料

[マスタリングTCP/IP](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP%E2%80%95%E5%85%A5%E9%96%80%E7%B7%A8%E2%80%95-%E7%AC%AC6%E7%89%88-%E4%BA%95%E4%B8%8A-%E7%9B%B4%E4%B9%9F/dp/4274224473/ref=sr_1_1?adgrpid=48910594010&dib=eyJ2IjoiMSJ9.m0Qr5XQYdcJF4YSHvGNpBi8cqfDLEa-crmYqzN05jX97Pb5g_Xuf4kBBiUDJx3UggPWQmf4ai52w7AXGlmv-krDO-s5aLqDwEO34nQsl-xSfr_nypCjzgnasksICL_6bnA3Lvcwy4yUWYNAQdXllV2VybStKsJHoVbKeAhCkdzV3n1ZPyA5_wxnUztEH3NHvx9CxfehdCcLmlcxe6sgpO5MrFJvQB65ButXlUh9HvPJY2H4gTF4sVQzHp3BMIwDUUEzJeU9XNoCOebMYSTHZutZlcxExdlf8XBaT6aY8LRzSeT08bihNlbYYrgZ2BRfVaH_9bXdA80DeWZ6-1EgZphdLNoN9wr7EhHnTBk3-Htq0h3VrxrnJOkBPZ_4jjsQC9PLdh0yzw3wLmeaLy_fnHhSGsahi7y4E1M-J9AR8p8h_jH6GMo3RCmQ44h-s2J0F.si_jeBkzQ0h6NDaKZfb1hM0IQ5091vR4QlHwPpoWb1U&dib_tag=se&hvadid=679073071879&hvdev=c&hvlocphy=9199201&hvnetw=g&hvqmt=e&hvrand=14987126537714238378&hvtargid=kwd-334746806305&hydadcr=27706_14738821&jp-ad-ap=0&keywords=%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0+tcp%2Fip&mcid=bb7824c775753ca99b362b92017bddde&qid=1738325838&sr=8-1)
[TCP/IPの絵本](https://www.shoeisha.co.jp/book/detail/9784798155159)

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

https://developer.mozilla.org/ja/docs/Web/HTTP/Methods