技術系

ログイン認証のいろいろ

技術系

こんにちは、なかにしです。

みなさん、認証は何を使用していますか?
ベーシック認証?ダイジェスト認証?

今回は、それらの認証方法と、その仕組みをちらっと紹介します。

それでは、いってみよう!

認証の歴史は長い…

古から、新しい認証方法が出てきては破られ、の繰り返しです。

破り方が確立し、危険だよとなったら IETF がRFCという形で発表してくれます。
(以下はハッシュ関数、MD5の例)
https://datatracker.ietf.org/doc/html/rfc6151

現代において情報は命と同等なので、
面倒ですが暗号についての知識はアップデートし続ける必要があります。

認証方法ちらっとまとめ

すべて紹介をしているとキリがないので、有名どころを紹介します。
※分かりやすく説明する為、簡略化している部分があります。ご了承下さい。

ベーシック認証

言わずもがな。一番シンプルで手軽な認証です。
ID、PWをbase64でエンコードして認証します。

可逆性があるので、盗聴されたら一発アウトです。
よって、 HTTPS通信 での使用が推奨されています。

ダイジェスト認証

さすがにbase64だけじゃ危ないっしょ~ということで、暗号化を取り入れた認証です。
暗号化では、不可逆性のある「ハッシュ関数」を使用します。

Webサイトに訪問時に、サーバーからランダム文字列を受け取ります。
「サーバから受け取ったランダム文字列」と「クライアント側で生成したランダム文字列」と「PW」をハッシュ関数でハッシュ化し、それを「response」としてサーバに送ります。

サーバ側でもクライアント側と同様にハッシュ化して突合し、認証します。

セッションベース認証

ダイジェスト認証だと、ハッシュ化されてるとはいえ、
毎回PWを使用したresponseを生成して認証する必要があります。

それだとリスクあるよねってことで、
PWとは関係の無い「セッションID」を使用するやり方がセッションベース認証です。

まずユーザがログインし、サーバはログイン情報を検証。(①、②)
認証済ユーザであれば、サーバ側でセッションIDを発行し、保存します。(③)
保存場所は、メモリだったりDBだったりします。(メリデメを考慮して適切な場所に保存)

そして、サーバ側からクライアント側にセッションIDを返却し、
クライアント側はセッションIDをCookieに保存します。(④、⑤)

すると、次回以降はCookieに保存されたセッションIDのみで認証が可能になる、という仕組みです。

この認証方法では、初回ログイン時のID、PWと、
セッションIDが漏れるとオワリなので、HTTPS通信で使用することが推奨されます。

トークンベース認証

セッションベース認証はセッションを使用する為、ステートフルになります。
しかし、サーバ側でセッション情報の保存が必要な為、規模が大きくなるとその分サーバの負荷も増えます。

そこで、ステートレスにしてサーバの負荷を減らそうとしたのがトークンベース認証です。

まずユーザがログインし、サーバはログイン情報を検証。(①、②)
認証済ユーザであれば、サーバ側でトークン情報を発行し、返却します。(③、④)
※このとき発行・返却するのは、ユーザと紐付かないトークン情報です。
例えば、「トークン1(ページAとページBにアクセス出来る)」や「トークン2(ページCのみアクセス可能)」のようなものです。

クライアント側はトークン情報をCookieなどに保存します。(⑤)

すると、次回以降はCookieなどに保存されたトークン情報のみで認証が可能になる、という仕組みです。

この認証方法の問題点としては「トークンの破棄」です。

トークンの破棄は、ブラウザに保存されているトークンを削除します。
しかし、そのブラウザからトークンを削除しても、サーバ側で連動して削除はされず、「有効」のままです。

これは、ステートレス故にサーバ側は「誰から送られたかは気にしない」という特徴がある為です。

つまり、トークンが流出している場合、
第三者がそのトークンを使用していつでも認証できてしまいます。

それを防ぐ為に、「トークンの有効時間を短く設定する(30秒程度)」などの緩和策を講じることが多いです。

Oauth

こちらは認証だけでなく認可も含みますが、
よく使われているのでついでに紹介します。

SSOの一種で、特定のアプリケーションで使用している認証・認可情報を、他のアプリケーションでも使い回すような仕組みです。

Googleのアカウントを使用してFacebookやInstagramを利用する、といった例があります。

有名どころだと、GoogleのGoogle Oauth、Facebook OAuthなどがあります。

仕組みについての解説は、以下記事がとても分かりやすいです。
一番分かりやすい OAuth の説明

画像を交えた実際の仕組みについては、以下記事が分かりやすかったです。
OAuthの仕組みを説明してHonoで実装してみる

まとめ

近年だと、Webアプリケーションはセッションベース認証、APIはトークンベース認証がよく使用されているように見受けられます。

どの認証方法も完璧ではなく、メリデメが存在します。
それらをよく理解した上で、適切な認証方法を選ぶことが重要です。

今回はここまで!
Enjoy Hacking!!

タイトルとURLをコピーしました