Railsを学んでいるみなさんこんにちは!!!
先日からRailsチュートリアル(第7版)でRuby on Railsを勉強しています。これまではログイン機能をユーザー側として利用してきましたが、作る側になった途端わからない用語がたくさん出てきました。そこで今回はログイン機能におけるユーザ認証がどのような順番で行われているのかについて考えてみたいと思います。今回はRailsチュートリアルで学んだことのアウトプットになってしまうかもしれませんが、私のように、「ダイジェスト」「暗号化」などの用語が出てきたときに、「ワード自体がわからん!」「それぞれのワードを関連付けて考えられん!」となってしまう方向けの記事になります。
1. ユーザー認証とは
一言でまとめるとある特定のシステムにログインするためのプロセスです。システムにアクセスする権限を持つユーザとそうでないユーザを見分けるための仕組み、それがユーザー認証です。
2. 用語の整理
2-1. 暗号化とは
暗号化はデータを保護するためのプロセスで、一定のルールに基づいて暗号化キーを使用して平文のデータを暗号テキストに変換します。これは読み取り困難な形になります。このプロセスにより、ユーザの重要な情報が不正アクセス者から守られます。また、ネットワーク経由でデータを安全に送受信することができます。暗号化されたデータは適切な鍵があれば元の形に復号化(データを元に戻すこと)することができます。
2-2. ダイジェストとは
ダイジェストは一方向の関数で、元のデータから一意の固定長の値を生成します。ダイジェストの生成プロセスは「元のデータから固定長の値を生成する」ことですが、生成されたダイジェストから元のデータを復元することは非常に困難になるため、セキュリティを強化するのに非常に有効です。また、ダイジェストはハッシュとも言われますが、そのハッシュ化に使われる関数にはSHAやMD5等があります。
2-3. Cookiesとは
WebブラウザとWebサーバー間で情報をやり取りする際に使われる、小さなテキストファイルのことをいいます。これは、Webサイトがユーザーのブラウザを通じてユーザーのコンピュータに保存するもので、Webサイトがユーザーを認識し、その状態を保持するために使用されます。
ただし、Cookieはユーザーのプライバシーに関わる情報を含む可能性もあるため、扱いには注意が必要です。今回の場合は、ユーザーに直接関わる情報は暗号化してからCookieに保存することにします。
2-4. トークンとは
ユーザーがシステムにログインしたとき、そのユーザーを一意に識別するための一時的な「証明書」のようなものと考えることができます。このトークンは、一時的に生成され、ユーザーがログアウトするか、一定時間が経過すると無効化されます。ランダムな英数字でできた文字列のようなものだと考えるとわかりやすいかもしれません。
3. どういう順番でユーザー認証を行うのか?
Cookiesをブラウザに保存するフェーズとCookiesを使って認証するフェーズに分けて考えてみることにします。
3-1. Cookiesをブラウザに保存するフェーズ
- ユーザーがログインフォームにメールアドレスとパスワードを入力してログインを試みます。
- アプリケーションは、メールアドレスに基づいてデータベースからユーザーを見つけ、入力されたパスワードをハッシュ関数に通してダイジェストを生成します。
- 生成したダイジェストとデータベースに保存されているダイジェストが一致すれば、アプリケーションはユーザーのログインを認めます。そして、ユーザーを識別するための一時的なトークンを生成します。
- そのトークンをハッシュ関数に通してダイジェストを生成し、そのダイジェストをデータベースに保存します。
- 生成したトークンはユーザーのブラウザのCookiesにも保存します。このときに保存するトークンはハッシュ化せずそのままです。
- ユーザーの識別情報(例えば、ユーザーID)もユーザーのブラウザのCookiesに保存します。こちらは暗号化してから保存します。
3-2. Cookiesを使ってユーザーを認証するフェーズ
- ユーザーが新たにページを開くと、ブラウザはそのリクエストとともにCookiesを送信します。
- アプリケーションは、Cookiesからユーザーの識別情報(3-1の6で保存)とトークン(3-1の5で保存)を取り出します。
- アプリケーションは、取り出した識別情報を復号化してからデータベースに保存されているユーザー識別情報と一致するかを確認します。
- 3で見つかった場合にそのレコードから、3-1の4で作成したダイジェストを取り出します。
- 4で取り出したダイジェストと、Cookiesから取り出したトークンをハッシュ関数に通して生成したダイジェストとを比較します。
- これらのダイジェストが一致すれば、アプリケーションはユーザーを認証します。これにより、ユーザーはログイン状態を維持することができます。
4. まとめ
今回この記事を書きながら感じたのは、Railsチュートリアルではわかった気になって進めていたはずなのに、いざ自力で記事を書こうとするとなかなか覚えたてのワードが出て来ないことでした。ソクラテスの「無知の知」という言葉は知っていましたが、「あっ、このことか!!!」と気付くきっかけになりました。知ったかぶり状態で進めてしまっていたのかもしれませんね。自分の言葉でまとめ直す癖をつけようと思います。
長々と書いてしまいましたが、最後まで読んでいただきありがとうございました。
この記事が、あなたの学習に少しでも役立ちましたら幸いです。