はじめに
Web開発において最も基本的な知識のひとつが「HTTPリクエストメソッド」です。
中でもGETとPOSTは非常によく使われるため、違いをしっかり理解しておくことが大切です。
また、GETとPOSTの使い分けが甘いと、
・セッションハイジャック
・CSRF(クロスサイトリクエストフォージェリ)
・情報漏洩
といったセキュリティ問題に直結します。
こういった問題を防ぐためにも正しい知識が必要になります。
この記事では、GETとPOSTの違いをわかりやすく整理して解説します!
HTTPリクエストメソッドとは
※https://vld-bc.com/blog/http-send-request より
HTTPリクエストメソッドは、「サーバーに対して何をしてほしいか」を伝えるための指示です。
目的によってメソッドを使い分けます。
・GET: データを取得したい
・POST: データを送信したい
・PATCH: データを更新したい
その中でも特に基本となるのがGETとPOSTです。
GETメソッドとは
サーバーからデータを取得するためのリクエストメソッドです。
※https://uteee.com/system/program-tech/10622/ より
GETメソッドには以下のような特徴があります。
① リクエストの内容(パラメータ)はURLに含まれる
GETメソッドでは、サーバーに送りたいデータ(検索ワードなど)をURLの末尾に付けて送信します。
これを「クエリパラメータ(Query Parameters)」と呼びます。
(例)https://example.com/search?keyword=php
?
以降の「keyword=php」がパラメータです。
このパラメータは「キー = 値」の形式で記述され、クエリパラメータと呼ばれます。
パラメータが複数ある場合は&
で区切られます。
なお、URLにデータを含める際には、特殊文字やスペースなどをURLエンコードする必要があります。
② ブラウザのアドレスバーにパラメータが見える
URLにパラメータがつくことによって、
・アドレスバーに表示される
・ブックマークできる
・リンクを共有できる
などのメリットもありますが、同時にデータが丸見えになるリスクもあります。
パスワードやクレジットカード番号をGETで送るのは絶対にダメである理由はここにあります。
③ キャッシュされやすい
GETリクエストは「ただデータを取りに行く」ので、ブラウザやプロキシサーバーにキャッシュされやすいです。
つまり、同じリクエストならわざわざサーバーに再リクエストせず、手元に保存してあるデータをすぐ表示してくれることもあります。
これがページ表示の高速化にもつながります。
④ データ量に制限がある
GETはURLに情報を詰め込むため、長すぎるURLだとエラーになります。
これはURLに含めることができる情報量に上限(一般的には2,000文字程度)があるためです。
実際の制限値はブラウザやサーバーによって異なりますが、一般的に数KB〜数十KB程度とされています。
つまり、大量のデータ(ファイル、長文など)を送るのには不向きです。
⑤ 安全性が低い(パラメータが丸見えなのでパスワード送信には不向き)
②と関連しており、データが丸見えになるため、パスワードやクレジットカード番号のような重要情報を含めることは絶対に避ける必要があります。
GETリクエストの基本的な流れ
① 【リクエスト】ブラウザがサーバーにURL付きリクエストを送る
② 【データ取得】サーバーはURLからパラメータを読み取る
③ 【レスポンス】要求されたデータを返す(ページ、JSONデータなど)
主な使いどころ
・検索フォーム(検索ワードを送る)
・ニュースサイトのページ遷移
・商品一覧の絞り込み条件送信 など
GETでやってはいけないこと
・個人情報やパスワードを送ること
・データベース更新(登録・削除・変更)をすること
・大量データをURLに載せること
GETはあくまで取得専用であり、サーバーの状態を変える操作には絶対使わないのがルールです。
これを守らないと、CSRF攻撃や情報漏洩リスクが高まってしまいます。
POSTメソッドとは
POSTメソッドは「サーバーにデータを送信するため」のリクエストメソッドです。
サーバーに「新しいデータを送信する・登録する」ために使用されます。
例えば、ユーザー登録やログイン、商品購入などのような「何かを登録・作成・更新する操作」で使用されます。
つまり、サーバーにおいて「何かを登録・作成・更新する操作」で必ず使用されます。
POSTメソッドには以下のような特徴があります。
① リクエストの内容(データ)は本文(body)に含まれる
POSTでは、サーバーに送りたいデータをメッセージボディ(本文部分)に埋め込んで送信します。
つまり、URLには載らないため、目に見えません。
HTTPリクエストの構造
※https://programmer-life.work/html_css/html-request より
② ブラウザのアドレスバーには表示されない
POSTはデータがURLに出ないため、アドレスバーには表示されません。
GETメソッドと違い、ブックマーク・リンク共有ができません。
これにより、パスワードや個人情報を安全に送信するのに適します。
※ただし通信自体はHTTPSを使うことが前提です。
③ キャッシュされにくい
POSTリクエストは、「データ送信=サーバーの状態が変わる」ので、ブラウザやプロキシサーバーでキャッシュされません。
毎回、サーバーにちゃんと送られて、リアルタイムで処理されます。
④ データ量が多くてもOK
データ量に制限がほぼありません。
GETはURLに制限がありましたが、POSTはリクエストボディにデータを積むため、画像ファイルやドキュメントファイル、長文データなど、大きなデータも送信可能です。
※ただし、サーバー設定で「最大アップロードサイズ」が決まっていることはあります。
⑤ 比較的セキュリティが高い
②と関連しています。暗号化されるわけではないので、HTTPSと併用が基本にはなります・
POSTリクエストの基本的な流れ
① 【リクエスト】ブラウザがサーバーにデータ(ボディ)付きリクエストを送る
② 【データ送信】サーバーはボディからデータを取り出す
③ 【データ処理】データベースに登録したり、処理を行ったりする
④ 【レスポンス】レスポンスを返す(成功メッセージ、リダイレクトなど)
主な使いどころ
・ログインフォーム(ID・パスワードを送信)
・会員登録フォーム
・問い合わせフォーム など
POSTで気をつけるべきこと
・通信はHTTPSで行ない、ボディも暗号化すること
・サーバー側で適切なバリデーションを行ない、不正なデータを防止すること
・同じリクエストが何回も送られると困る場合は、二重送信防止が必要であること
まとめ
GETはサーバーからデータ取得、POSTはサーバーにデータを送信するために使用されます。
この2つのメソッドは使い分けが非常に重要で、間違えてしまうとパスワードがURLに丸見えとなってしまい、重大なセキュリティ事故につながってしまいます。重要な機密情報は必ずPOSTで送信するようにし、パラメータの送信方法やセキュリティ意識に注意して使い分けるようにしましょう!
最後までお読みいただき、ありがとうございました。
参考・引用元URL
https://vld-bc.com/blog/http-send-request
https://programmer-life.work/html_css/html-request
https://xtech.nikkei.com/atcl/nxt/column/18/02948/091200006/
https://uteee.com/system/program-tech/10622/
https://blog.senseshare.jp/get-post-method.html
https://satoriku.com/request-method/
https://codeaid.jp/blog/get-post/
https://www.carol.co.jp/cms/column_20200213.jsp?company=carol&number=5