【備忘録】認証と認可/主な認証方式
はじめに
Webシステムにおける基礎的な概念である認証と認可について、それぞれの定義と違い、さらに主な認証方式の種類についてまとめます。
対象読者
認証と認可の違いを知らない人や認証方式にどんな種類があるのかを知らない人。
認証と認可の違い
認証とは
認証(Authentication: AuthN)とは、ユーザーが誰であるかを検証するプロセスのことです。
例えば、ユーザー名とパスワードでログインするということは認証機能の1つです。
認証には、以下の3つの認証要素が存在します。
-
知識情報(知っていること)
ユーザー本人だけが知っている情報。
例:パスワード、暗証番号、秘密の質問の答え -
所持情報(持っているもの)
ユーザー本人だけが物理的に所持しているものに含まれる情報。
例:ICカード、スマートフォン -
生体情報(本人そのもの)
ユーザー本人の生物学的な情報。
例:指紋、顔認証、虹彩認証
認可とは
認可(Authorization: AuthZ)とは、検証されたユーザーが何にアクセスできるかを決めるプロセスのことです。多くのWebシステムでは認証とセットで実装されることが一般的です。
例えば、ログイン後にマイページにアクセスできる権限を付与することは認可の1つです。
主な認証方式の種類と特徴
HTTP認証
Webサーバーが標準で提供する認証方式です。
代表的なものに以下の2つの認証方式があります。
-
Basic認証
ユーザー名とパスワードをBase64(64進法に変換)でエンコードした平文でサーバーに送信する方法。
送信時に暗号化はされない、IDとパスワードを毎回送信するため、盗聴により容易にIDとパスワードが盗まれてしまうといった点でセキュリティレベルが低いです。
-
Digest認証
平文で送信するBasic認証に対し、ユーザー名とパスワードをハッシュ化して送信します。
中間者攻撃(攻撃者の制御下にあるノードに通信を中継させることで、通信内容を盗聴したり改ざんしたりする攻撃)には弱く、用意されているハッシュ関数も解析可能などの脆弱性があります。
フォーム認証
Webアプリケーションで最も一般的な認証方式です。 ユーザーがWebページ上のフォームにユーザー名とパスワードを入力し、サーバー側で認証します。
ユーザー名、パスワードは平文で送信されるので、SSL(HTTPS)を使用するのが一般的。
セッション認証
認証後に、サーバーがセッションIDを発行し、そのIDを使用してユーザーを識別する認証方式。通常はCookieまたはURLパラメーターにセッションIDが保存される。ユーザーはこのセッションIDをブラウザ上でCookieとして保存して、サーバー側へリクエストを送る。
フォーム認証などと組み合わせて使われることが多い。
トークン認証
APIキー認証
利用者ごとに発行された「APIキー」と呼ばれる文字列を、HTTPリクエストのヘッダーやパラメータに含めて送信する認証方式。
APIキーが盗まれるリスクがあるので、HTTPSを使用して通信を暗号化する必要がある。
JWT(JSON Web Token)認証
JWT(JSON Web Token)とは、JSON形式で記述される、トークンの一種です。
JWTには以下の3つの要素が含まれています。
- ヘッダー(Header): トークンのタイプとハッシュアルゴリズムなどのメタデータ
- ペイロード(Payload): トークンに含まれる実際のデータ
- 署名(Signature): ヘッダーとペイロードを下に計算される電子署名
JWT認証の流れはざっくりと以下の図で表せます。
詳しい認証フローは以下の記事を参照してください。
OAuth認証
OAuthは、外部サービスの認証・認可を安全に行うためのプロトコルです。
主に「第三者アプリがユーザーのパスワードを知らずに、ユーザーの代わりにサービスへアクセスする」ために使われます。
その他に学んだ用語
シングルサインオン(SSO)
一度の認証(ログイン)で、複数のサービスやシステムに再度ログインすることなくアクセスできる仕組み。
WebAPI認証
APIへのアクセス時に、利用者やアプリケーションの正当性を確認するための認証方式。これはユーザーではなくプログラムやサービス間の通信で使われます。
代表的な手法として、トークン認証(APIキー認証、JWT認証、OAuth認証)が使用される。
Discussion