そもそも、ログインって何だろう
ログインシステムを作る前に、ログインの仕組みや、パスワードの必要性について考えてみましょう。
ログインとは何か
ログインとは、ユーザと、サーバの持つユーザ情報とを結びつけるために行う認証作業です。
一般的にはアカウント名とパスワードを使ってログインするという仕組みになっています。
アカウント名は重複のないユニークな値にする必要があります。重複するとログイン相手の特定が不可能になるからです。
アカウント名には自由な文字列のほか、Emailなども利用されます。現実世界で例えるならマイナンバーのようなものです。氏名だと、同姓同名ならなりすますことができてしまいます。
一方、パスワードは非公開にしてユーザとサーバ間だけでしか取り扱わないので、重複していても構いません。
つまり、ログインはアカウント名で誰なのかを特定し、パスワードで本物かどうかを確認するシステムといえます。
次のように、ログインのような認証システムは身近でも利用されています。
サービス | 相手の特定方法 | 相手の認証方法 |
---|---|---|
ウェブ | アカウント名 | パスワード |
電話 | 名前 | 声の感じや話の内容 |
ATM | キャッシュカード | 暗証番号 |
ボトルキープ | 名札など | 顔 |
家宅 | 不特定 | 顔、鍵の保持 |
遊園地 | 不特定 | 入場券 |
この表を見ると、サービスが個別サービスなら相手を特定する必要がありますが、共同サービスなら認証だけで良いことがわかります。
また、電話の認証方法の甘さから、なぜオレオレ詐欺が多いのかが読み取れます。
パスワードとは何か
そもそもパスワードとは何でしょうか。
言葉自体の意味は「パス(通す)」と「ワード(言葉)」になり、日本語では「合言葉」です。
パスワードがパスワードとして機能する条件は、当人しか知らず他人が真似できないということです。このことによって本物と見なすことが、現代の一般的なログインの原理になっています。
パスワードのように機能するものには言葉以外に、本人しか持てないものや本人しかできないことなどがあり、指紋や声紋、虹彩などによる生体認証として利用されています。また、身近な例では顔パスや鍵などが認証に用いられています。
インターネットにおいては、サーバと利用者の物理的な距離が離れている点や、サービス提供者がコンピュータである点などを考えると、顔パスや鍵のような物質による認証は現実的ではありません。生体認証もデータ通信のためにデジタル化する必要があり、セキュリティ面でその性能を発揮しきれません。
そのため、現代においてもウェブ上の認証にはパスワードの仕組みを利用したログインシステムが一般的です。
webサービスと認証
ところで、アカウント名とパスワードはどちらかだけではダメでしょうか?例えば重複のない非公開の値だけでログインは可能でしょうか?
よく考えると不可能ではありませんが、桁の多い英数字の羅列のような、推測困難な値にしなければログインシステムとしては機能しないでしょう。短い値だと重複が発生してなりすましも簡単になるからです。
アカウントとパスワードを当てるよりも難しいくらいの桁の文字列であれば、なりすまし対策としては問題なさそうです。
ログインにそのような長い値が必要になると、ユーザは記憶というよりはファイルに記録する必要が出てきます。
アプリの特性によってはひとつの長い値を使う方が簡便な認証になるケースもあるでしょう。例えばその長い値ごとURLに付けてブックマークしても問題ないようなサービスなどです。
当サイトの英単語ウェブアプリでは、実習ということもあり一応アカウント名とパスワードでログインしています。このアプリではユーザごとに英単語帳を提供するのでログインが必要になります。
PHPでのログイン機能
PHPでのログイン機能は、まずユーザ登録時にアカウント名とパスワードをサーバに送信して、データベースなどに記録しておきます。
ユーザがログイン時にそれらの値をサーバに送信し、サーバ側で登録時の値と比較し、同じであれば認証します。認証したという状態はセッションに記録するので、同じセッションであれば異なるページでも認証扱いとして対応できます。