POSTとは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


POSTとは

POSTはHTTPプロトコルのリクエストメソッドの一つで、サーバーにデータを送信するために使用されます。クライアントからサーバーにデータを送信し、サーバー上の状態を変更したり、データを追加したりするために使われるメソッドです。

POSTリクエストは、リクエストボディにデータを含めて送信します。送信するデータは、URLエンコードされた形式やJSON、XMLなどの形式で送ることができます。

POSTは、機密性の高いデータや大量のデータを送信する際に適しています。ログイン情報やユーザーの入力データなどを送信するために使われることが多いです。

POSTリクエストは、サーバー上の状態を変更するため、冪等性がありません。同じPOSTリクエストを複数回送信すると、サーバー上の状態が変更される可能性があります。

POSTとGETの大きな違いは、リクエストボディの有無です。GETはパラメータをURLに含めて送信しますが、POSTはリクエストボディにデータを含めて送信します。また、GETはブックマーク可能ですが、POSTはブックマークできません。

POSTリクエストの送信方法

以下3つを簡単に解説していきます。

  • HTMLフォームを使ったPOSTリクエストの送信
  • JavaScriptを使ったPOSTリクエストの送信
  • cURLを使ったPOSTリクエストの送信

HTMLフォームを使ったPOSTリクエストの送信

HTMLフォームを使って、POSTリクエストを送信することができます。フォームのmethod属性にPOSTを指定し、action属性にデータの送信先URLを指定します。

フォームの各入力要素のname属性が、送信されるデータのキーになります。入力された値がそのキーに対応する値として送信されます。

< form method="POST" action="/submit" >
  < input type="text" name="username" >
  < input type="password" name="password" >
  < button type="submit" >Submit< /button >
< /form >

JavaScriptを使ったPOSTリクエストの送信

JavaScriptを使って、POSTリクエストを送信することもできます。XMLHttpRequestやFetch APIを使って、リクエストを送信します。

送信するデータは、URLSearchParamsやJSONを使って構築し、リクエストボディに含めて送信します。レスポンスはJSON形式で受け取ることが多いです。

const data = { username: 'john', password: 'secret' };

fetch('/submit', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
  console.log(data);
});

cURLを使ったPOSTリクエストの送信

cURLは、コマンドラインからHTTPリクエストを送信するツールです。POSTリクエストを送信する際は、--dataオプションを使ってデータを指定します。

送信するデータは、URLエンコードされた形式で指定します。JSONを送信する場合は、Content-Typeヘッダーを設定します。レスポンスはコンソールに出力されます。

curl -X POST -H "Content-Type: application/json" -d '{"username":"john","password":"secret"}' http://example.com/submit

POSTリクエストのセキュリティ対策

以下3つを簡単に解説していきます。

  • CSRF対策とPOSTリクエスト
  • XSS対策とPOSTリクエスト
  • SQLインジェクション対策とPOSTリクエスト

CSRF対策とPOSTリクエスト

CSRFは、クロスサイトリクエストフォージェリの略で、Webアプリケーションの脆弱性の一つです。攻撃者が用意したページを閲覧したユーザーの権限で、意図しないリクエストを送信させる攻撃手法です。

POSTリクエストを使う場合でも、CSRF対策は必要です。トークンを使ったCSRF対策が一般的で、サーバー側で生成したトークンをフォームに埋め込み、リクエスト時にトークンを検証することで、不正なリクエストを防ぐことができます。

< form method="POST" action="/submit" >
  < input type="hidden" name="csrf_token" value="RANDOM_TOKEN" >
  ...
< /form >

XSS対策とPOSTリクエスト

XSSは、クロスサイトスクリプティングの略で、Webアプリケーションの脆弱性の一つです。攻撃者が用意したスクリプトを、脆弱なWebアプリケーションを介して他のユーザーのブラウザで実行させる攻撃手法です。

POSTリクエストで送信されたデータを、サニタイズせずにレスポンスに含める場合、XSSの脆弱性になる可能性があります。HTMLエスケープやJavaScriptエスケープなどを行い、スクリプトが実行されないように対策する必要があります。

const escapeHTML = (str) => {
  return str.replace(/[&<>"']/g, (match) => {
    return {
      '&': '&',
      '<': '< ',
      '>': ' >',
      '"': '"',
      "'": '''
    }[match];
  });
};

SQLインジェクション対策とPOSTリクエスト

SQLインジェクションは、Webアプリケーションの脆弱性の一つで、攻撃者が入力したSQLコマンドがデータベースに直接渡されることで、意図しないSQLクエリが実行される攻撃手法です。POSTリクエストで送信されたデータをSQL文に直接連結する場合、SQLインジェクションの脆弱性になる可能性があります。

対策としては、プレースホルダを使ったパラメータ化クエリを使うことが効果的です。また、エスケープ処理を行うことでSQLインジェクションを防ぐこともできます。フレームワークのORMを使うことも対策の一つです。

// プレースホルダを使ったクエリ
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_POST['id']]);

POSTリクエストのデータ形式

以下3つを簡単に解説していきます。

  • application/x-www-form-urlencoded形式
  • multipart/form-data形式
  • application/json形式

application/x-www-form-urlencoded形式

application/x-www-form-urlencoded形式は、HTMLフォームのデフォルトの形式で、キーと値のペアをURLエンコードして送信します。キーと値は=で連結し、ペアとペアの間は&で区切ります。

この形式は、シンプルなデータを送信する場合に適しています。ただし、バイナリデータを送信することはできません。

username=john&password=secret

multipart/form-data形式

multipart/form-data形式は、バイナリデータを含むデータを送信する際に使用します。主にファイルのアップロードで使用されます。

この形式では、各フィールドがバウンダリと呼ばれる区切り文字列で区切られます。バウンダリは、ランダムな文字列が使用されることが多いです。

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

john
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="profile_picture"; filename="profile.jpg"
Content-Type: image/jpeg

(binary data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

application/json形式

application/json形式は、JSONデータを送信する際に使用します。JSONは、JavaScriptオブジェクトの記法を使ってデータを表現するテキストベースのデータフォーマットです。

この形式は、APIとの通信で使用されることが多いです。構造化されたデータを送信することができ、サーバー側で解析しやすいという利点があります。

{
  "username": "john",
  "password": "secret",
  "email": "john@example.com"
}

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「プログラミング」に関するコラム一覧
「プログラミング」に関するニュース
「プログラミング」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。