認証とは
IT分野における認証とは、システムやデータへのアクセスを管理するためのプロセス。ユーザーは自分がだれかを示し、システムがそれを確認します。確認が成功すればシステムやデータへのアクセスを許可します。
認証方法の種類
1. Basic認証
ユーザー名とパスワードを組み合わせて身元を確認する認証方法。
リクエストヘッダーにBase64でエンコードされたユーザー名とパスワードを記載してサーバーに送信する。サーバーはヘッダーからユーザー名とパスワードを取り出し検証する。検証が通れば、サーバーはリクエストを処理し、通らなければ拒否する。
Base64でのエンコードは簡単にデコードが可能なためBasic認証にはセキュリティ上の脆弱性がある。最近はほかのよりセキュアな認証メカニズムが推奨されている。
2. Digest認証
先述のBasic認証をセキュリティの面で強化したような認証方法です。Digest認証ではユーザー名やパスワードなどをハッシュ化して扱うことでセキュリティ性を高めています。
より具体的には、
- クライアントが認証の必要な領域へのリクエストをサーバーへ送信すると、401エラーを返して認証要求をします。またnonceと呼ばれるランダムな文字列を生成して、送信します。
- クライアントはユーザー名、パスワード、nonce、クライアントで生成したランダム文字列cnonceを含む情報をハッシュ関数を使用してハッシュ化します。
- クライアントがサーバーへハッシュ化した情報を送信する。
- サーバーは受け取った情報をハッシュ関数を適用して、検証する。
ランダムな値であるnonce、cnonceを追加することで、クライアントに成りすますことを困難にしている。
また、ハッシュ化にはMD5方式やSHA-256が使用される。
3. Session based Authentication
Webアプリケーションやウェブサイトにおいて、ユーザーがログイン状態を管理するための手法の一つ。サーバー上にユーザーのリクエストを追跡できるように、ID、ログイン時間、有効期限などを生成及び保存する。ユーザーはこれらの情報の一部をリクエストごとにCookieとして受信する。サーバーはリクエストごとにCookieを確認して認証する。
より具体的には、
- ユーザーからサーバーにログインを要求する
- サーバーは認証情報を検証し、成功したらセッションIDを生成、データベースへ保存する。
- サーバーはユーザーにセッションIDをCookieとして送信する。Cookieはブラウザに保存される。
- ユーザーが次のリクエストを送信すると、ブラウザはCookieとして保存されたセッションIDを含めてサーバーに送信する。
- サーバーはCookieから受け取ったセッションIDを用いてユーザーのセッションを特定して認証情報を検証する。
セッションベースの認証では、セッションに関する情報がサーバー側に保存されるためセキュリティチームが特定のユーザーを即座にログアウト状態にすることができます。ただしセッション情報をサーバー側で保存するためにスケーラビリティに問題が発生する可能性があります。
セキュリティ上の懸念としてはCookieを使用することによりクロスサイトリクエストフォージェリにさらされる可能性があります。
4. Token based Authentication
認証情報をトークンと呼ばれる特定の文字列で表現し、これを使用してユーザーの認証を行う。
より具体的には、
- ユーザーが認証譲歩をサーバーに送信する。
- サーバーは認証情報を検証し、成功した場合トークンを生成し、クライアントに送信する。
- クライアントはトークンをCookieやlocal storageに保存する
- ユーザーが次のリクエストを送信するときにリクエストヘッダーやCookieとしてトークンを記載する。
- サーバーはトークンが有効か検証する。
トークンベースの認証では、セッションの詳細をサーバーが保持しておく必要がないためパフォーマンスを向上することができます。
セキュリティ上の懸念点として、認証に関する情報がクライアント側に保存されるため、サーバー側から操作を行うことが困難になることが挙げられます。
5. OAuth
OAuth(Open Authorization)は、サードパーティーのアプリケーションがユーザーのリソースにアクセスするために必要な権限を取得するためのオープンスタンダードな認可プロトコル。Facebook 、Googleなどのアプリケーションから名前、生年月日、電子メールその他の必要なデータなどのユーザー関連情報にアクセスできる。
WebアプリケーションなどのログインページにあるGoogleアカウントでログイン/サインアップするボタンはOAuthを用いて行われている。
OAuthは以下の主な役割とフローがあります:
- リソースオーナー(Resource Owner):
- ユーザーを指し、自身のリソースに対するアクセス権を管理します。
- クライアント(Client):
- ユーザーのリソースへのアクセスを必要とするアプリケーションやサービスを指します。
- リソースサーバー(Resource Server):
- リソースオーナーのデータ(例: ユーザーの写真、プロファイル情報)を保持し、クライアントがアクセス権を得るためのサーバーです。
- 認可サーバー(Authorization Server):
- ユーザーの同意を得て、クライアントに対してアクセストークンなどの認証情報を発行するサーバーです。
OAuthの基本的なフローは次の通りです:
- 認可フロー(Authorization Code Flow):
- クライアントがリソースサーバーに対してリソースへのアクセスを要求し、リソースサーバーが認可サーバーにリダイレクトします。
- ユーザーは認可サーバーでログインし、クライアントが求める権限を確認し同意します。
- 認可サーバーは認可コードを発行し、クライアントに送信します。
- クライアントは認可コードを使用して認可サーバーにアクセスし、アクセストークンを取得します。
- クライアントはアクセストークンを使用してリソースサーバーにアクセスし、リソースに対する操作を行います
## まとめ
認証方法はいろいろな実装方法が存在する。最も基本的は認証方法はBasic認証だがセキュリティに問題がある。その他Digest認証やSession based認証 Token based認証, OAuthなどがある。