先日、nginxでダイジェスト認証を行いました。そもそもダイジェスト認証って何!?から始め、参考記事を見ながらなんとか実装できました。
今回は、その過程で学んだ「ダイジェスト認証」について解説していきます。なお、ダイジェスト認証の具体的な実装方法は説明していません。この記事は、ダイジェスト認証について説明できることを目標としています。
キーワード
・ベーシック認証
・ダイジェスト認証
ダイジェスト認証とは?
ダイジェスト認証(Digest Authentication)は、ベーシック認証の弱点1を補う形で設計された認証方式です。特に、認証情報の安全性を高めることを目的としています。
ダイジェスト認証はどのように認証情報を高めているのでしょうか。
それは、パスワードを平文ではなく暗号化して送信することで実現しています。暗号化と送信の流れを見ていきましょう。
以下は認証が必要なリソースにアクセスするときの流れです。
- ベーシック認証とは、HTTPプロトコルに組み込まれた簡易的な認証方式である ↩︎
1. クライアントがリソースにアクセス
欲しいリソースのあるサーバーにアクセスをします。この段階では、まだ認証はしていません。
2. 401 Unauthorizedレスポンスを返す
リソースにアクセスされたら、401 Unauthorizedステータスコードを返します。
401 Unauthorizedとは、リソースにアクセスするためには認証が必要または、アクセス権限がないことを示すレスポンスです。
もっと簡単に言うと、誰だか分からない人が家に訪問しようとしているから、「何者なのか名乗れ!」と言われてしまっている状態です。
その際、Authenticateヘッダーにnonce(ナンス)と呼ばれるランダムな文字列など、いくつかの認証に必要な情報を含めて送信します。
3. ユーザー名とパスワードを入力・送信する
ユーザーがユーザー名とパスワードを入力し、それをクライアントで処理をします。
具体的には、先ほどのnonceとユーザー名・パスワードを組み合わせてハッシュ値を計算します。それを認証ヘッダーとしてサーバーへ送信します。
4. 認証成功か判定
サーバーが計算したハッシュ値と、クライアントから送られてきたハッシュ値が一致するかどうか確認します。
一致したら認証成功です!
このプロセスにより、認証情報そのものがネットワーク上に送信されることはありません。
注意点
サーバー側でパスワードを平文で保存するため、サーバーが攻撃されるとパスワードの流出する危険度が高まります。
また、ユーザー側がユーザー名とパスワードを誤って保存せず、ハッシュ値を保存した場合は、認証ができなくなってしまいます。これはハッシュ化の一方向性があるからです。
ハッシュ化について知りたい方は上記記事をご覧ください!
ベーシック認証との違いは?
ベーシック認証について復習しましょう。
ベーシック認証(Basic Authentication)は、最もシンプルな認証方式の1つです。クライアントがサーバーにリクエストを送る際、ユーザー名とパスワードをHTTPヘッダーに含めて送信します。
ベーシック認証の説明を読んで、とある操作をしていないことに気が付きましたか?
ベーシック認証はハッシュ化をしません。ユーザー名とパスワードをBase64エンコードして送信するだけです。そのため、通信を傍受されればユーザー名とパスワードもわかってしまいます。
両者ともに共通するのはHTTPSを使用した方が良いということです。ハッシュ化をしているからといって、そのまま送信するのはセキュリティ的に問題があります。暗号化をしましょう。
まとめ
ベーシック認証とダイジェスト認証は、Webシステムにおける基本的な認証方式です。それぞれの特徴を理解し、適切なシチュエーションで使い分けることで、効率的かつ安全なシステム運用が可能になります。
また、これらの認証方式を採用する際には、必ずHTTPSで通信を保護することを忘れないようにしましょう。
最後までご覧いただき、ありがとうございます。お疲れ様でした。
コメント