がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

BASIC認証について

先に書いときます。この文章は「BASIC認証って果たしていかがなものでしょうか」っていうスタンスです(苦笑


まず何はさておき「BASIC認証」について正しく把握しておきましょう。
BASIC認証(Basic Authentication)は、wiki ( http://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC ) によれば

Basic認証(ベーシックにんしょう、Basic Authentication)とは、HTTPで定義される認証方式の一つ。
Basic認証では、ユーザ名とパスワードの組みをコロン ":" で繋ぎ、Base64エンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。
盗聴や改竄を防ぐため、後にDigest認証というユーザ名とパスワードをMD5でハッシュ化して送る方法が考えられた。

という感じになります。
実際のやり取り的には

クライアント側の挙動

サーバ側の挙動

Authorization: ヘッダの付いていないアクセスを行う

Authorization: ヘッダの付いていないアクセスを受け取る

401レスポンスを受け取る

認証したいコンテンツなので401 Authorization Required のレスポンスで返す

IDとパスワードの入力Windowを出して、入力を求める

IDとパスワードをAuthorization: ヘッダに書き込んで再度アクセスを行う

Authorization: ヘッダ付きのアクセスを受け取る

受け取ったコンテンツを表示する

IDとパスワードがOKならコンテンツを返却する

こーゆー感じでしょうか。


色々な意味で非常に簡単な仕組みなので、割合にあちこちで用いられています。
ちなみにPHPの場合、$_SERVERというグローバル変数(ハッシュ配列)のPHP_AUTH_USERというkeyとPHP_AUTH_PWというkeyにデータが格納されます。

'PHP_AUTH_USER'
  PHPApacheのモジュールとして実行している場合に、 HTTP認証しているときにそのユーザー名がセットされる。
'PHP_AUTH_PW'
  PHPApacheのモジュールとして実行している場合に、 HTTP認証しているときにそのユーザーのパスワードがセットされる。

そのために、


if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic realm=\"My Realm\"");
header("HTTP/1.0 401 Unauthorized");
echo "ユーザーがキャンセルボタンを押した時に送信されるテキスト\n";
exit; // …exit? by がる
} else {
echo "<p>こんにちは、{$_SERVER['PHP_AUTH_USER']} さん。</p>";
echo "<p>あなたは、{$_SERVER['PHP_AUTH_PW']} をパスワードとして入力しました。</p>"; // ………いくらサンプルとはいえ(苦笑
}
といったコードで簡単に制御が出来るようです( http://www.php.net/manual/ja/features.http-auth.php )。あちこちで使われている状況を助長しているような感じでしょうか。


さて。便利なBASIC認証ではありますが、問題がまったくないかというとそんなことは全然なくて。
もう一度、BASIC認証の記述を読み直して見ましょう。具体的にはココ。

Basic認証では、ユーザ名とパスワードの組みをコロン ":" で繋ぎ、Base64エンコードして送信する。

なんていうんでしょうか? セキュアとかなんとかって単語はどこにも存在しません。ちなみに

盗聴や改竄を防ぐため、後にDigest認証というユーザ名とパスワードをMD5でハッシュ化して送る方法が考えられた。

なんて文章もありますが。まずMD5がハッシュとしては脆弱なのと、結局は「一式盗めば関係ないよね」ってことで乗っ取りが容易である点から、やはりセキュリティとかいう単語からは限りなく乖離した方式であることがわかります。


ちなみに、純粋にセキュリティ上の問題だけであるならば、一つの方法として「httpsでぶん回す」手があります。SSLであれば、経路上でIDやパスワードが露見する可能性は限りなく下がります。
ただ、それでもなお「じゃぁSSLが破られたら」という話もありますし、そもBASIC認証は「毎回認証をかけるので性能が悪い」などの問題も山積みです。


とりあえず、httpsではないBASIC認証は「個人が趣味でなんとなく認証チックな事をしてみたい」を超える要求の場合には使ってはいけません。業務で用いるなどもってのほかです(ましてや管理画面で用いるなど -以下略- )。
httpsにした場合…とりあえず「最悪の」状況は免れますが、それでもなお「BASIC認証にすべき理由」があるとは到底思えないです。
認証システム、って単語をたとえばgooで調べると

ネットワークを通してコンピューターにアクセスするユーザーの信頼性・正当性を確認するシステム。暗号を用いたプロトコルを使い,ユーザー名やパスワードなどの管理を行う。

って出てくるです。やっぱり認証である以上、信頼性や正当性について言及できる程度に「まっとうな」モノを使いたいと思うのですが、如何なものなんでしょうかねぇ?