Tagbangers Blog

Basic認証をJavaで導入する

こんにちは、藤岡です。

今週は前回作ったWebサーバアプリの改良をしていたのですが、Basic認証の機能を追加するところでつまずいてしまったので、あまり進められませんでした。

しかし、考え方として多くを学び得ることができたので、共有していきます。


Basic認証とは?

僕はこのサイトでBasic認証の概要を掴みましたが、大まかに説明すると、その名の通り簡易的な認証機能のことです。

ブラウザでこの機能が実装されたURLにアクセスすると、このような画面が出てきて、UserNameとPasswordが正しければ先に進めるというものです。

今回は、これをJavaで作ったWebサーバアプリに組み込んでみようという課題です。

最初は勘違いしていましたが、通常はこのサイトで紹介されているように「.htaccess」と「.htpasswd」というファイルを作り認証をかけるやり方が一般的です。しかしそれはApacheサーバを使う場合で、今回作りたいのは自作サーバなので、この方法では当然うまくいきません。

自作でBasic認証をかけるため簡易的であり、実際に使うセキュリティとしては脆弱なものですが、ThreadやSocketについての理解が深まるからと、出していただきました。


どのように実装するか?

参照:http://www.as400-net.com/tips/httpsvr/95.html

この図の通りに実装すれば良さそうです。

サーバの役割を果たすプログラムを作っているので、ブラウザからのリクエストが来たら、まず401レスポンスを返して、2度目のリクエストの内容が、サーバ側で設定しておいたものと一致すれば200レスポンスを返すというものです。

また、UserNameとPasswordが異なっていた場合、再び401レスポンスを返さなければいけないので、無限ループを活用しなければいけません。

そういった大枠は捉えられているのですが、型の性質(InputStream、OutputStream)やSocket通信の流れの理解が浅いために、動くものができない状態です。

例えばInput(Output)Streamは流れを表す型なので、一度しか取得できないことや、ブラウザから2度目のリクエストを受け付けるために、一度通信を切断しなければならないということで、つまずいてしまいました。


このようにつまずくことはlsコマンドを作っている時にも何度もありましたが、今の状況を文字に起こした上で整理してみると解決の糸口が見つかることが多かったので、今回もそのようにしてクリアしていきたいです。