こんにちは。ディマージシェアの技術担当です。インターネットで提供されているサービスの多くはログイン認証を経て利用できます。普段当たり前のように利用しているログインの仕組みは意外と単純です。今回はwebシステムの多くで採用されているログインの仕組みを簡単に解説したいと思います。
ログインの仕組みはホテルのチェックインに似ている
例えば、ホテルに宿泊する際、フロントで予約した旨を伝えて身分証明書を見せればルームキーを受け取ることができます。ルームキーを持っていればホテル内の各種サービスを利用できます。予約した本人かどうかをチェックするのはチェックインのときだけで、「ルームキーの所持」はチェックインした証拠として一定期間機能します。
webシステムのログインも同様です。ログイン画面でIDとパスワードを入力します。この行為が本人であることを確認する手続きに該当します。IDとパスワードを正しく入力することができると、webシステムから秘密の合言葉を受け取れます。合言葉を覚えている(持っている)間はログイン後の機能を使える、という仕組みになっています。
ここで、合言葉なんて普段意識したことないよ!という人がほとんどだと思います。ログインに成功した際にwebシステムから受け取れる合言葉はたとえばこんな文字列です。
eyJpdiI6IlwvT21QWmRvWEF1RStKRk5ERUpweEdBPT0iLCJ2YWx1ZSI6InJKVTNOeGlKcmVFQUFkMXNNMUhCNkw3cXUxUFd5TkRLaWJOXC91WktjWkJOS0dRS1JUTTRmc2VGaWdGK25RZStsIiwibWFjIjoiZDY2ZjYyYjlmNTZiODdlNzAzOTE5OWJkZjcyYjViMjYxMTE1YTdmODkyMjJjY2Y3Mzc3N2ZlYTNhODVkNDc0MyJ9
覚えておくには長すぎます。これをブラウザが代わりに覚えてくれているのです。ブラウザには、私が覚えている合言葉はこれです!と毎回webサーバに情報を送信しています。webサーバは、合言葉が正しければログインしているとみなします。この仕組みを技術的にはログインセッションと呼んでいます。
サービスの利用を終えるときは、ホテルならばチェックアウトして鍵を返却します。webサービスではログアウトです。ログアウトすると、サーバ上で合言葉が無効と判断されるようになります。ほかにも、ブラウザで「キャッシュクリア」のような操作をすると、ブラウザが覚えている合言葉が消えてしまいます。すると、ログイン状態が解除され、再度ログインして新しい合言葉を受け取るまで、ログイン後の機能は使えなくなります。
安全性は?
webシステムのログインがどのように行われているかを簡単に解説しました。おそらく、想像していたものより単純だと感じた人が多いのではないでしょうか。セキュリティ的に大丈夫なの?と感じた人もいると思います。その感覚はおおむね正しく、実際にトラブルになってしまったことが過去に何度もあります。
盗難に遭う可能性
先ほど、ホテルのチェックインの仕組みで例えました。例えば、ルームキーを誰かに盗られてしまった、となるとマズいわけです。第三者がチェックイン(本人確認)せずに各種サービスを利用できてしまいます。
webサービスでも同様の事件が起こったことがあります。webサービスから受け取った合言葉を悪意のある第三者に知られてしまったことにより、ログイン後の機能を悪用されてしまった事件が過去に起きています。このように合言葉を強奪する手法は、セッションハイジャックと呼ばれる名前が付いています。
セッションハイジャックのリスクを低減する手段として、例えば合言葉を何度も変える方法が採用されることがあります。人気のあるweb開発フレームワークを使用すると、大抵はこの方式のログインセッション管理が用意されています。
合言葉を推測されてしまう可能性
webサービス上でログインしているかどうかをチェックしているのは合言葉です。ただの文字列なのです。ホテルならば物理的な鍵なので偽造は難しいですが、ただの文字列では偽造されてしまうかもしれません。例えば、webサービスから受け取った合言葉が
id=123
のような極めて単純な文字列だったらどうでしょう。id=124としたら違う誰かになりすましができてしまうかもしれません。
このような実装がきっかけでトラブルが発生してしまう可能性も少なくありません。プログラミングを覚えて3日で作ったログイン機能などは実装が脆弱な可能性があります。
このような実装をしないためには、使用者の多いwebフレームワークを使うのがおすすめです。たいていのwebフレームワークにはログインの仕組みがデフォルトで備わっており、セキュリティ面はかなり洗練されています。少しカスタマイズするだけで実用に耐えうるログインの仕組みを提供できます。
ブラウザを信じてよいか
先に書いた通り、webシステムのログイン認証は、webサーバから受け取る秘密の合言葉をブラウザに覚えておいてもらうことで成立しています。つまり、ブラウザに悪意のある仕掛けがしてあるとセキュリティは破綻してしまうのです。普段当たり前のように利用しているブラウザソフトウェアには悪意のある仕掛けが無いと信じて利用していることになります。
ここでも過去に事件がありました。具体的なソフトウェア名は伏せますが、あるアプリにはアプリ本来の動作とは別に、簡易的なブラウジング機能を実装してありました。このブラウジング機能によくない仕掛けがあることが発覚したのです。通常、適当なアプリからブラウジング機能を動かす場合は、別途ブラウザを起動する動作で実装されます。シェアの大きなブラウザは安全であることがある程度担保されているからです。
このように、ブラウザを使ってwebアプリを使うには、ブラウザを信じるという前提が必要になります。製造元がわからないブラウザ(のような動作をするソフトウェア)を利用するときは十分に注意するようにしましょう。
まとめ
普段なんとなく利用しているwebサービスのログインの仕組みは実はシンプルです。計算機が誕生する前から行われていたであろうホテルのチェックインと大差ありません。一時的に使える鍵を受け取るという物理的な手続きが計算機上で模倣されているだけです。更に、鍵(合言葉)をブラウザに預けなければいけません。
利用者はどのブラウザを信じるかを決めた上で十分に気を付けて利用することを心がけ、技術者は安全性に十分配慮した実装を心がけるようにしましょう。