はじめに
Basic認証やフォーム認証という言葉を聞きますが、どのようなものなのでしょうか。Webでのセキュリティは重要な分野であり、「認証」は避けては通れない技術になっています。
過去の記事
Basic認証とフォーム認証
最初に、簡単にBasic認証とフォーム認証について説明します。
Basic認証とは
Basic認証は、とても簡単な認証方法です。なぜならブラウザとHTTPサーバのソフトウェアの間だけでほぼ自動的に行われるからです。Webサイトを見ていて、ブラウザからパスワードを求めるダイアログが出てきたことはありませんか? このとき行われているのがBasic認証です。Basic認証は、HTTPサーバのソフトウェアの設定を編集するだけで、ほぼ出来てしまいます。しかし、欠点として次のものがあります。
- ログアウトという概念がない。
- パスワードを求めるダイアログをキャンセルした場合のページが、HTTPサーバのエラーページになってしまう。エラーページの変更するのにはヘッダ出力と組み合わせてHTTP出力を実装しなくてはならない。
このようなことがあり、一般的なユーザーにログインを要求するようなサイトにはあまり使われません。ただ、社内の一部の人が管理しているようなシステムでは、手軽にログイン機能を実装できるため、よく使われています。
フォーム認証とは
フォーム認証とは、HTMLのフォームからのPOSTでログインして認証するようなものを言います。認証の仕組みが手作りなので、認証失敗時の画面なども凝ったものを作ることができるほか、ログオフなどの操作も作れます。ただし、自分でログインフォームなどを作らなくてはいけないため、手間はかかってしまいます。
2つの方法を比べてみて
2つの方法を比べると、どちらも良いところがあります。特に、Basic認証は設定ファイル1つで認証のやりかたを変えられるので、メンテナンスは非常にしやすいです。一方、ユーザーに対してエラーページは見せたくないという場合はフォーム認証が良いです。しかし、やはりWebの開発者の心理としては、この2つの方法を時と場合に応じて都合よく使い分けたいと思うのではないでしょうか?
Basic認証とフォーム認証の動きについて
では、実際に、フォームとBasic認証の相互運用ができるプログラムの作り方について考えるために、2つの認証の動きを考えてみましょう。
認証のステップ
Basci認証とフォーム認証のステップは、どちらも同じです。
- サーバ側でユーザーがログインしているかチェックし、ページのロール(権限)とユーザーのロールをチェックする
- もし、ユーザー情報がなかったり、ロールとマッチしなければ、認証を要求
- ユーザーがユーザーIDとパスワードを入力する
- サーバ側でユーザーIDとパスワードをチェックして、ログイン情報をサーバ側に登録
という流れになります。
1度認証した後のページアクセス
1度、認証に成功し、次にページにアクセスする際には双方で大きな違いがあります。
フォーム認証の場合
フォーム認証の場合は、セッション内にあるユーザーとロールの情報を参照し、それをサーバサイドでアクセスするページのアドレスと照らし合わせるという方法を取ります。このとき、権限のないページに対してアクセスした場合はエラーページに遷移させます。フォーム認証の特徴は、ブラウザ自体は認証が成功したのかエラーが起こっているのかは分からない、ということです。ユーザーIDとパスワードはログイン時にPOSTする際のみ送信され、後はサーバサイドのセッションで処理されます。
Basic認証の場合
Basic認証の場合は、ブラウザの機能に頼った認証になります。手順としては次の用になります。
- "WWW-Authenticate"ヘッダーがついたエラーページをブラウザに送る。
- ブラウザは、ユーザーIDとパスワードを要求するダイアログを表示し、入力を求める(ここでキャンセルすると、"WWW-Authenticate"ヘッダーと共に送られたエラーページをブラウザが表示します)。
- 入力があった場合、サーバ側で認証する。ユーザーIDとパスワードは、リクエストの"Authorization"ヘッダーにBase64形式でエンコードされて送られる。
- 1度認証されると、他のページにアクセスするたびにブラウザが"Authorization"ヘッダーを送り、サーバ側で毎回認証を行う。
ここで、注意しなくてはいけないのは、Basic認証ではユーザーIDとパスワードを毎回送るということです。このような処理をブラウザ側で行うため、「ログアウト」という概念がありません。
Basic認証とフォーム認証の相互運用の際に考えなくてはいけないこと
以上のように、2つの認証方法にはそれぞれの特徴があります。そのため、両者を都合よく使い分けるには何に気をつけたらよいでしょうか?
各ユーザーが利用する認証方法は最初の認証で決まる
2つの認証方法を1つのWebシステムで使うときに、気をつけなくてはいけないのは、「認証方法は最初にログインした方法に決まる」ということです。
例えばBasic認証でログインした場合は、セッションが切れるか、他のロールが必要なページにアクセスして再認証し直すまで、Basic認証による認証がページアクセスのたびに行われます。同様にフォーム認証で認証する場合には、ログアウトするまではフォーム認証で認証することになります。
問題になるのは、ユーザーにログアウトをさせたいようなケースです。この場合、Basic認証にはログアウトの仕組みがないため、Basic認証で認証をさせないようにする必要があります。