WAFの仕組み
コードを書く前に WAF(Web Application Framework)について説明します。
フレームワークとは
EC サイトでも SNS でもニュースサイトでも求人サイトでも、Web アプリケーションに共通して必要な処理があります。
例えば…
- リクエスト URL に基づいて特定の処理をよびだす
- ユーザーの認証を行う
- 入力値のバリデーションを行う
- データベースに接続する
- テンプレートにデータを流し込みHTMLを生成する
- レスポンスメッセージを作成する
などです。
これらの共通処理をまとめたプログラム群が Web アプリケーションフレームワークと呼ばれます。フレームワークが提供する共通処理部分を自前で書く必要がなくなるので生産性が高くなります。
WAF のパターン
WAF はプロダクトによってそれぞれ書き方やクラスの呼び名などが少しづつ違いますが、基本となるパターンは似ています。
- アプリケーションが HTTP リクエストを受け取る。
- リクエスト URL ごとの処理が実行される前に認証チェックなどの共通処理が実行される。この処理はたいてい「ミドルウェア」と呼ばれる。
- リクエスト URL およびリクエストメソッドに従って、あらかじめ紐づけしておいたメソッドが実行される。紐づけというのは例えば「GET で /profile がリクエストされた時は ProfileController の show メソッドを呼ぶ」という設定のこと。この紐づけ設定を「ルーティング」と呼ぶ。設定ファイルもしくはアノテーションで定義することが多い。また、ルーティング先のクラスのことを「コントローラー」と呼ぶ。
- 上記で呼ばれたメソッド内の処理は要件次第だが、データベースを操作する際はたいてい「Object-Relational マッパー(後述)」が用いられる。
- レスポンスを返却する際、コンテンツが HTML であれば HTML 生成のために「テンプレート(エンジン)」が用いられる。
このパターンを習得してしまえば今まで使ったことがなかったフレームワークもある程度スムーズに理解することができます。
様々な WAF
言語によっていくつかの WAF が開発されています。
機能は様々で、上記のパターンの機能すべてを装備したフレームワークもあれば、ルーティングの機能だけを備えたミニマルなフレームワークも存在します。
- Java
- Spring
- Play
- PHP
- Laravel
- CakePHP
- Ruby
- Ruby on Rails
- Sinatra
- Python
- Django
- Flask
- C#
- .NET MVC
- JavaScript
- Express
- Hapi