このサイトについて

みんなのPython Webアプリ編 - BASIC認証

みんなのPython Webアプリ編 - BASIC認証

BASIC認証

BASIC認証はWebアプリケーションで最も手軽に利用できる認証方式の1つです。Webアプリケーションなどを使っているとき、ユーザ名とパスワードを入力するダイアログが現れることがあります。このようなダイアログが現れたときが、サーバ側でBASIC認証を要求している合図です。Webブラウザには、BASIC認証に対応するための機能が組み込まれています。サーバの要求に応じて、Webブラウザがダイアログを自動的に表示しているのです。

図01 BASIC認証を要求するときには、Webブラウザが認証用のダイアログを開く

図01 BASIC認証を要求するときには、Webブラウザが認証用のダイアログを開く

BASIC認証の仕組み

BASIC認証は次のような仕組みで機能します。認証に必要な情報は、クエリではなくヘッダを使ってやりとりされます。また、認証の必要なパスにアクセスするために、少なくとも2回のリクエストを送っているということになります。

1-A)クライアントが認証の必要なパスにリクエストを送る

Webサーバからのリクエストが認証の出発点になります。

1-B)サーバが401というステータスのレスポンスを返す

要求されたリクエストに応答するためには認証が必要であることを、Webブラウザに知らせるために特別なステータス番号を送信します。

2-A)クライアントがダイアログを表示する

その後、ヘッダに認証情報を暗号化して埋め込み、サーバに送信します。実際には、以下のようなヘッダがWebブラウザからサーバに送られます。

:::http
Authorization: Basic(暗号化したユーザ名とパスワード)

2-B)サーバ側で認証情報を解釈し、結果を再送信する

ヘッダの認証情報を復号化(暗号の解除)し、正しい認証情報かどうかを判別します。正しい認証情報であることが分かれば、正しいページを返します。もし正しくない場合は、再度1-Bに戻りステータス401のレスポンスを 返します。

BASIC認証の継続

2-AでWebブラウザが送るヘッダにはAuthorizationというヘッダ名が付いています。一度認証を行うと、Webブラウザは同じホストのリクエストのヘッダに2-Aで送ったものと同じヘッダを送り続けます。このようにして、ユーザ名とパスワードを一度入力しただけで、認証状態を継続できるわけです。

このヘッダは、Webブラウザを終了するまで送り続けられます。このような挙動は一見便利なようですが、別の問題を引き起こすこともあります。Webブラウザが勝手に認証情報を送り続けてしまうため、いわゆるログアウトに相当する処理ができないのです。

ログアウトに相当する処理を実行するためには、Webブラウザ側でステータス401のコードを再度送信し、Webブラウザが再度ダイアログを表示したときにキャンセルボタンを押すなどする必要があります。つまり、ユーザ側で明示的にWebブラウザに入力した認証情報を消去する必要があるわけです。

認証情報の暗号化方式

Webブラウザが送信するリクエストのヘッダ部分には、暗号化したユーザ名とパスワードが記載されます。Webアプリケーションのプログラム側では、この情報を復号化してユーザが入力したユーザ名とパスワードを取り出し、正しい認証情報かどうかを確かめます。

BASIC認証では、「BASE64」と呼ばれる暗号化の仕組みが使われます。BASE64は、入力された文字列などのデータを数値とアルファベットの組み合わせに変換します。この変換方式のことをBASE64エンコードと呼びます。BASE64エンコードされた文字列は、一定のルールを使うことで元のデータを取り出すことができます。BASE64はとても手軽な暗号化方式です。BASIC認証だけでなく、電子メールの添付ファイルの暗号化などにも利用されています。

Pythonの標準モジュールにはbase64というモジュールがあり、このモジュールを使うとBASE64エンコードの暗号化と復号化が行えます。以下の例では、インタラクティブシェルを使ってbase64の暗号化と復号化を試してみています。

base64モジュールの利用例

:::python
>>> import base64
>>> e=base64.encodestring('abcdefg') >>> print e
YWJjZGVmZw==
>>> print base64.decodestring(e) abcdefg
2014-09-03 15:00