1. IT用語のミドルウェアと、Djangoのミドルウェアの違い
前回の記事では、IT用語のミドルウェアについてまとめました。
ミドルウェアとは、「OSほど汎用的ではないが、多くのアプリケーションで必須となる機能を担うソフトウェア」を指す言葉で、アプリケーションサーバ、WEBサーバ、DBサーバなどが、代表的な例でした。
今回調べるのは、Djangoの機能として備わっている「ミドルウェア」です。
公式ドキュメントによると、Djangoのミドルウェアは「Django のリクエスト/レスポンス処理にフックを加えるためのフレームワーク」だそう。フックとは、プログラムの特定の処理の間に別の処理を追加することですので、この場合は、「Django のリクエスト/レスポンス処理に、別の処理を加えるためのフレームワーク」と解釈して良いと思います。
ミドルウェアは自作することもできるそうですが、今回は、私が関わっているプロジェクトに出てくるミドルウェアについて、いくつか調べてみようと思います。
2. 各ミドルウェアについて
django.middleware.security.SecurityMiddleware
SecurityMiddlewareは、Djangoアプリケーションのセキュリティを高めるために作用します。例えば、
- HTTPリクエストをHTTPSにリダイレクトさせる
- クライアントに、HTTPS通信を使うべきであることを通知する
- XSS(クロスサイトスクリプティング)防止
などの機能を備えています。
django.contrib.sessions.middleware.SessionMiddleware
SessionMiddlewareは、ユーザーの情報を匿名のセッションとして管理するためのミドルウェアです。デフォルトでは、DBを使ったセッション管理を行いますが、キャッシュやファイル、Cookieを使った管理も可能です。なお、Cookieを使ったセッションデータは、署名されているため、データの改竄や喪失があった場合無効にすることができますが、暗号化はされていないため、クライアントは自由に読むことができます。
django.middleware.common.CommonMiddleware
CommonMiddlewareは、その名の通り、多くの一般的なWebアプリケーションで役立つ機能を提供しています。
- DISALLOWED_USER_AGENTS:悪意のあるbotなど、リクエストを受け付けたくないユーザーのリストを作成することができます。
- APPEND_SLASH:URL末尾のスラッシュがない場合、末尾にスラッシュのある有効なURLに書き換えて、リダイレクトを行います。
- PREPEND_WWW:先頭にwwwがないURLを、wwwで始まる同じURLに書き換えてリダイレクトします。
django.middleware.csrf.CsrfViewMiddleware
CsrfViewMiddlewareは、CSRF(クロスサイトリクエストフォージェリ)対策を行うためのミドルウェアです。CSRFとは、ユーザーのログイン情報を悪用し、webアプリケーション上で意図しないアクションを行うように仕向けたり、意図しない権限でユーザーをログインさせたりする攻撃です。
公式ドキュメントによると、これらの攻撃を防御するための方法は、Getリクエストから副作用を取り除くこと、そして、POST、PUT、DELETEメソッドを使う時には、formでCSRFトークンを利用することが挙げられます。CsrfViewMiddlewareでは、これらを可能にするために、CSRFトークンを生成したり、検証を行ったりする機能が提供されています。
3. まとめ
settings.pyには、まだいくつか未知のミドルウェアがありますが…今月はここまでにして、そのうち続編を書こうと思います。メリークリスマス!