こんにちは、トレタ VPoEの北川です。
フロントエンドアプリケーションで社内外のAPIを利用する際には、セキュリティやデータ整合性の問題、スキーマの不整合、予期しない変更への対応といった数々の課題がつきものです。 こうした課題に対応し、信頼性の高いフロントエンドを構築するために、弊社では防衛的プログラミングと厳密な型チェックを活用しています。これにより、APIとの連携におけるリスクを最小限に抑え、開発の効率と品質を両立させています。
本記事では、防衛的プログラミングの考え方、型チェックを厳密に行う理由、実際の開発現場の例を交えてご紹介します。
API利用におけるセキュリティの重要性
まず、JavaScriptにおける潜在的なセキュリティリスクとして、プロトタイプ汚染が挙げられます。この攻撃手法では、悪意のあるデータを用いてオブジェクトのプロトタイプが不正に変更され、アプリケーション全体に予期しない影響を与える可能性があります。
JavaScriptのオブジェクトはプロトタイプを通じてプロパティやメソッドを継承します。この仕組みを利用して、攻撃者はAPIレスポンスのJSONオブジェクトに特殊なキー(例: __proto__
)を含め、プロトタイプを改変します。その結果、アプリケーション全体で動作が予期せぬ形に変更される可能性があります。
具体的なリスクとしては、以下が挙げられます:
- リモートコード実行:悪意のあるコードがシステム内で実行される。
- データ改ざん:重要な設定やデータが不正に変更される。
- サービス停止:予期しないプロパティ変更によるエラーでアプリケーションが動作停止する。
このようなリスクを回避する方法の一つとして、APIレスポンスの厳密な型チェックを行う方法があります。詳細については以下の記事をご参照ください:
厳密な型チェックとスキーマ駆動開発
弊社では、フロントエンドとバックエンドの連携において、スキーマ駆動開発を採用しています。この手法では、開発初期にAPIスキーマを定義し、両チームがそのスキーマに基づいて並行して作業を進めます。
しかし、スキーマ通りに実装したつもりでも、繋ぎ込み時に不具合が発生することがあります。例えば、スキーマ変更の共有漏れや実装ミスによる不整合が挙げられます。このような場合、スキーマに「過不足なく」準拠しているかどうかを検証する仕組みが必要です。
そこで、クライアント側では防衛的プログラミングにより厳密な型チェックを行い、不具合発生時の原因特定とスムーズな修正を実現しています。
新しい機能追加の場合
新機能を既存のシステムに追加する際、非破壊的変更であっても注意が必要です。例えば、新しいフィールドやオプションが追加される場合、クライアント側でそれに対応するロジックが正しく実装されていないと、全体の整合性が崩れる可能性があります。
例えば、あるAPIにオプショナルなフィールドを追加したとします。このフィールドは必須ではないため、既存の仕様を大きく損なうことはありません。しかし、特定の機能やユースケースにおいて、このフィールドが適切に設定されない場合、システム全体の整合性が崩れるリスクが発生します。
この場合は互換性の有無に関わらず、サーバーとクライアント間での正確なコミュニケーションと早期の検知体制が重要です。フロントエンド側で厳密な型チェックを行っていると、必須フィールドでなくてもフィールドが追加されたことでエラーが発生します。 これにより、仕様変更や新機能追加時の対応漏れを防ぎ、システム全体の安定性を保つことができます。
外部APIの場合
一方で、外部APIに対しては、内部APIとは異なる柔軟なアプローチが必要です。外部APIは、提供元によって予告なく変更される可能性があり、必ずしも事前に提供されたスキーマ通りのデータが返ってこない場合もあります。
例えば、ある外部APIを利用する際、仕様と異なるデータが返されることが判明した場合、厳密な型チェックを維持することでかえってエラーが頻発し、開発スピードやシステムの安定性に悪影響を及ぼすことがあります。このような場合、柔軟性を優先したロジックを導入することで、APIの変化に適応しやすくしています。
具体的には、レスポンスデータのバリデーションやエラーハンドリングを強化し、予期しない変更にも耐えられる仕組みを構築しています。
型チェックのデメリットと今後の方針
厳密な型チェックは、多くの場面で開発を効率化し、信頼性を向上させる一方で、デメリットも存在します。特に、リソースが限られているプロダクトでは、型チェックの厳密さが負担となる場合があります。
例えば、開発リソースが縮小されたプロダクトでは、型チェックの更新が滞り、APIの後方互換性を保つことが難しくなる場合があります。一方で、活発に開発が行われているプロダクトでは、厳密な型チェックが問題の早期発見や修正を可能にし、信頼性向上に大きく寄与しています。
そのため、弊社ではプロダクトのフェーズや状況に応じて型チェックの適用範囲を調整し、効率と柔軟性のバランスを図っています。
さいごに
弊社の防衛的プログラミングと型チェックのアプローチをご紹介しました。記載した通りプロジェクトの規模やフェーズにおいて合う合わないがありますが、堅牢で安定したサービス提供に向けた開発の参考にしていただければと思います。