Webサイトでフォームの二重送信が発生する主な原因とメカニズム

こんにちは。ゆうせいです。

新人研修中に受講者から以下の質問をいただきました。

フォームの二重送信はなぜ起こるのですか?

今回はこの質問に答えたいと思います。

Webサービスを利用している際に、注文ボタンを1回押したつもりでも、同じ内容の注文が2回送られてしまうことがあります。これをフォームの二重送信と呼びます。開発者が意図しないこの現象は、ユーザーの操作やブラウザの仕様、ネットワークの状況が組み合わさることで発生します。

二重送信が発生する主なケース

二重送信は、主にクライアント(利用者のブラウザ)からサーバー(Webサイトの管理システム)へデータが送られる過程で発生します。

送信ボタンの連続クリック

最も多い原因は、利用者が送信ボタンを短時間に2回以上クリックすることです。

これは、飲食店の注文ベルを何度も鳴らしてしまう状況に似ています。一度ベルを鳴らした後、店員が来るまでの間に不安を感じて再度鳴らしてしまうと、店員側には複数の呼び出しが届くことになります。

送信完了後のページ更新(F5キー)

データの送信が完了した後に、ブラウザの更新ボタンを押すと、直前に行った送信操作が再実行されます。

ブラウザは、直前の操作がデータの送信(HTTP POSTリクエスト)であった場合、同じデータをもう一度送る仕組みを持っています。これを知らずに画面をリフレッシュすると、意図せず同じ情報をサーバーに送ることになります。

ブラウザの「戻る」ボタンの利用

送信完了画面から「戻る」ボタンで入力画面に戻り、再度送信ボタンを押すことも二重送信に繋がります。

また、ブラウザの種類や設定によっては、戻る操作自体が直前の送信リクエストを再送するトリガーになる場合もあります。

ネットワーク遅延とシステム負荷の影響

ネットワークの速度が遅い場合、利用者が「ボタンが反応していない」と誤解しやすくなります。

サーバーが処理を開始してから応答を返すまでの時間をt1、利用者が我慢できる限界の時間をtwとしたとき、以下の条件を満たすと二重送信のリスクが高まります。

二重送信対策のメリットとデメリット

二重送信を防ぐための対策は、システムの種類に応じて適切に選択する必要があります。

JavaScriptによるボタンの無効化

送信ボタンが一度押された瞬間に、ボタンを操作不能(グレーアウト)にする方法です。

  • メリット:利用者が視覚的に「送信中である」と認識でき、物理的な連続クリックを確実に防ぐことができます。
  • デメリット:利用者のブラウザでJavaScriptの設定がオフになっている場合、この機能は動作しません。

トークン(合言葉)の発行による制御

送信画面を表示する際に、サーバーが一意の合言葉(トークン)を発行し、送信データと一緒に送り返させる方法です。

  • メリット:サーバー側で一度受け取った合言葉を破棄するため、どのような経路で再送されても2回目以降の処理を確実に拒否できます。
  • デメリット:サーバー側で合言葉を一時的に保存しておく必要があり、システムの設計がやや複雑になります。

PRG(Post-Redirect-Get)パターンの適用

データの送信(POST)が終わった直後に、別の確認ページへ強制的に移動(Redirect)させる設計手法です。

  • メリット:送信完了後にページ更新(F5キー)をしても、再送されるのは「移動後のページ」の取得リクエストであるため、二重送信が発生しません。
  • デメリット:画面遷移の回数が増えるため、システム全体の制御フローを正確に設計する必要があります。

学習のステップ

二重送信の理解を深め、対策を実装するためには、以下の順序で学習を進めてください。

  1. HTTPリクエストの仕組み:ブラウザとサーバーがどのようにデータをやり取りしているか、POSTとGETの違いを理解します。
  2. ブラウザの挙動確認:実際に簡単なフォームを作成し、送信後の「更新」や「戻る」がどのような通信を発生させるかツールで観察します。
  3. クライアント側対策の実装:HTMLやJavaScriptを用いて、ボタンの連続クリックを防止するコードを記述します。
  4. サーバー側対策の導入:セッション管理やトークンの概念を学び、サーバー側で二重送信を検知するプログラムを作成します。

これらの知識を段階的に習得することで、安全で信頼性の高いWebアプリケーションの開発が可能になります。

グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。