いまさら人には聞けない認証認可とSSOの基礎
OAuthやOpenID Connectの話をしたり実装の話をしたりしているときに認証認可部分が分からなかったというフィードバックをいただくことがありますが、意外とこのレベルの基本がわからないらしいぞ!ということがわかりました。
確かにこのレベルはあんまり解説がないので、わからないままにしちゃうと理解できるようになるきっかけは意外となかったりします。
ここから先の内容はWebアプリケーションを想定した内容になっています。
認証認可 = 認証 + セッション管理 + 認可
「認証認可」の全体像の、実生活での例は以下のようなシナリオです。
例えば抽選式のイベントに当選して、当日それに参加することをイメージしてみます。
「当選ハガキを当日持ってきてください」と当選ハガキに書いてあるとしましょう。
当日受付でハガキを提示すると思います。受付では当選者一覧を持っていたりして、そのリストと付き合わせして想定された当選者かどうかを確認します。
受付では当選者であることを確認して、イベント当日用のパスを渡してくれます。参加者はこのパスを服のどこかに貼り付けて見えるようにします。
イベント会場には会場の通路ごとに警備員さんがいて、パスの種類をチェックしながら、目の前の人を通していいかどうかを判断します。
これらを一口に「認証認可」とまとめがちですが、中身をそれぞれブレークダウンして見ていきます。
認証
セッション管理
認可
認証 = 本人確認
認証とは本人確認です。上記の抽選式のイベントのこの部分が認証です。
抽選式のイベントでは、受付で当選者かどうかを確認して通さないといけないですね。したがっておそらく当選者のリストを手元に持っていてハガキの宛先と付き合わせるか、あるいはそれほど厳密な運用をしない場合は、リストを用意せずにハガキ保持を持って当選者と認識するような確認をするでしょう。
「リストを手元に持っていてハガキの宛先と付き合わせる」あるいは「ハガキ保持を持って当選者と認識」は不正防止対策の確実さのレベルが違うと考えていただけると良いと思います。いわゆる「認証強度」です。
一般的に認証方式は以下3つに分類されます。
知識認証 (Something You Know) … パスワード、PINなど
所有物認証 (Something You Have) … SMS (スマートフォン)、IDカードなど
生体認証 (Something You Are) … 指紋、虹彩など
上記3つのカテゴリのうち2つ以上の認証方式を使うものを多要素認証 (MFA) と呼びます。
セッション管理 = 認証済み状態の保持
セッション管理は認証済み状態の保持のことです。
上記の例では受付後に当日パスを発行していましたね。
このように、警備員さんがいちいちハガキの有効性を確認するのは大変なので、認証が済んだ人には認証済みであることを示す当日パスをわたします。この当日パスは一目でチェックができるような簡単な仕組みであることが望ましいです。
Webの世界ではCookieやトークンが使われます。
Cookieやトークンは有効なものがDBなどに書き込んであり、文字列を比較することでいつでも有効性をチェックできるようになっているものと、Cookieやトークンそのものが意味を持つ文字列でできており、有効性を検証できるようになっているものがあります。
OAuthでは前者をハンドル型、後者をアサーション型と呼びます。
認可 = アクセス可否の判定
抽選式イベントの例では警備員さんのお仕事が認可です。
これができるよう、ハンドル型のトークン (やCookie) を使う場合は有効なトークンが格納されたデータストアには、トークンと一緒に「誰」「どのロール」など、認可に必要な情報が格納されているのが一般的です。
アサーション型の場合には、アサーションに記載されていることが多いです。
SSO = 認証する場所と認可する場所が違うときに使うもの
SSOは、認証ができる場所と認可しなければいけない場所が違うときに使います。
認可を実施するアプリケーションの視点で言えば、認証部分を外部に委託する方法です。
リアルな世界の話で言えば、パスポートを使って他の国に入国するための入国審査をするのはSSOと同じ発想でできています。
日本国籍を持っているAさんが確かにAさんだと本人確認できるのは日本の機関ですよね。したがって認証は日本のパスポートセンターで行われます。
しかし実際に入国審査 (認可) が行われるのは外国で、日本のシステムに国民としての登録があるかどうかにアクセスできない場所です。
したがってパスポート (アサーション型トークン) に日本の国が証明するAさんの所属情報を書き込み、その内容を日本が保証するという形をとっています。
入国審査では日本という国と、日本が保障したその人の所属情報を信じて入国を許可します。
Webの世界でよく使うプロトコルはSAMLやOpenID Connect (OIDC) です。
なぜアサーション型トークンを信頼できるのか
パスポートが信頼できるのは偽造対策がされており、偽造の難易度が高いからだということは有名です。
SSOに使う「アサーション型トークン」も同じように偽造や改ざん対策が施されています。
SAMLのトークンは「アサーション」と呼びます。XMLでできているトークンです。
OpenID Connectは「IDトークン」と呼びます。これはJSONベースのトークンになっており、JWTという仕組みを使っています。
アサーションやIDトークンは暗号化を用いた電子署名を使った改ざん対策が仕様に含まれています。
OpenID Connectで使われるJWTの改ざん対策については以前記事を書いていますので、こちらをご参照ください。