なぜフロントとバックで２重のバリデーションをかけなければいけないのか



# <font color="Chocolate">この記事の目的</font>
本記事では、フロントエンドとバックエンドでのバリデーションの意義や重要性について解説する
バリデーションは、システムのセキュリティやユーザーエクスペリエンスに大きな影響を与える重要な要素である
これを理解することで、モダンなウェブアプリケーションの構築において、より堅牢でユーザーフレンドリーなシステムを実現することができる


# <font color="Chocolate">結論</font>
以下のようなメリットがあるためである

| メリット           | 説明                                                                                                                                                                    |
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **UXの向上**      | フロントエンドでリアルタイムのフィードバックを行うことで、ユーザーの操作感を改善し、エラー修正の手間を省くことができる                                                                             |
| **サーバー負荷軽減** | フロントエンドで無効なリクエストを排除することで、サーバーに送信されるリクエストの数を減らし、パフォーマンスを向上させる                                                                           |
| **セキュリティ強化** | バックエンドでのバリデーションは、悪意のある攻撃からシステムを守り、データの一貫性と整合性を保つことに貢献する                                                                           |
| **システムの堅牢性** | 二重バリデーションにより、システム全体のセキュリティと信頼性が向上し、ユーザーにとっても開発者にとっても安心して利用・運用できるシステムを構築できる                                               |
| **異なる要件への対応** | フロントエンドではユーザー体験、バックエンドではビジネスロジックに応じた異なるバリデーションを行うことで、より柔軟かつ適切なデータ検証を実現できる                                         |



# <font color="Chocolate">フロントエンドでのバリデーションの目的</font>

| 項目                   | 説明                                                                                                                                                             |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **UXの向上**          | リアルタイムでユーザーにフィードバックを提供し、フォーム入力の手間を軽減する<br>ユーザーが誤った入力をした際に即座に修正を促し、ユーザー体験を向上させる                      |
| **リアルタイムフィードバック** | バックエンドのみのバリデーションでは、すべての入力を完了してからエラーが通知されるため、ユーザーの負担が増える<br>フロントエンドでのバリデーションにより、即時にエラーメッセージを表示できる |
| **サーバーの負荷軽減**  | 無効なリクエストをサーバーに送信する前にフロントエンドで排除することで、サーバーに送信されるリクエストの数を減らし、サーバーの負荷を軽減する<br>パフォーマンスの向上にも寄与する  |

# <font color="Chocolate">バックエンド側でのバリデーションの目的</font>


| 項目               | 説明                                                                                                                                                        |
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **セキュリティの強化** | 悪意のあるユーザーがフロントエンドのバリデーションを回避してサーバーに不正なリクエストを送信する可能性があるため、バックエンドでのバリデーションが不可欠である<br>データの一貫性を保証する |
| **最終チェックの役割**  | サーバーに送信されるデータが全て正しいかを確認する「最後の砦」として機能する<br>フロントエンドでのチェックをすり抜けた不正データやエラーを防ぎ、データの正確性を確保する           |
| **ビジネスロジックの適用** | バックエンドでは、フロントエンドではカバーしきれない複雑なビジネスルールやデータ整合性のチェックを行う<br>これにより、システム全体の信頼性を高め、セキュリティを強化する        |

### 補足
例えば、フロントエンドのJavaScriptを無効化することで、フロントエンドのバリデーションを回避することが可能な場合がある
この場合でも、バックエンドでバリデーションを行うことで不正なデータの登録や悪意のある攻撃からシステムを守ることができる


# <font color="Chocolate">フロントエンドとバックエンドの二重バリデーションのメリット</font>

| 項目                   | 説明                                                                                                                                                        |
|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **エラー検出の強化**      | フロントエンドとバックエンドの両方でバリデーションを行うことで、万が一どちらかのチェックが漏れても、もう一方でエラーを検出できるため、システム全体の信頼性が向上する                                    |
| **異なるバリデーション要件の対応** | フロントエンドではユーザー体験を重視した簡易なチェック、バックエンドではビジネスロジックやデータ整合性に基づいた厳密なチェックを行うことで、それぞれの役割に応じたバリデーションを実現できる                |
| **システムの堅牢性の向上**     | それぞれの層で適切なバリデーションを行うことで、システム全体のセキュリティとデータの正確性を保ち、攻撃や不正な操作に対して強固な防御を構築できる                                             |

### 二重バリデーションの実施による効果

二重バリデーションを行うことで、エラーの見逃しを最小限に抑え、データの正確性を保つことができる
フロントエンドとバックエンドで異なるバリデーション要件を持つことで、例えば、ユーザーが入力したデータがリアルタイムで適切にフォーマットされているかをフロントエンドで確認し、バックエンドではデータベースに保存する際の複雑なビジネスロジックを適用することができる

# <font color="Chocolate">バリデーション実装における注意点</font>

### バリデーション仕様の整備
- フロントエンドとバックエンドでのバリデーション要件を統一し、バリデーション仕様書を作成することが重要
- フロントエンドエンジニアとバックエンドエンジニアの間で仕様の齟齬がないように、事前にしっかりとコミュニケーションを取る必要がある