LASSIC Media らしくメディア
認証と認可の違い|設計の基本と注意点
LASSIC IT事業部|元請(プライムベンダー)としてシステム開発・検証を受託
システムの発注担当者やPMからよく聞かれる相談に、「認証と認可の違いがよくわからないまま要件定義を進めている」というものがあります。ログイン機能さえ実装すればセキュリティ要件を満たしたと考えてしまいがちですが、実際には「本人であることを確認する仕組み」と「本人に何を許可するかを決める仕組み」は別の設計課題です。この二つを混同したまま設計を進めると、権限管理が複雑になったり、意図しない情報漏えいにつながるリスクが高まります。
本記事では、認証(Authentication)と認可(Authorization)という二つの概念の違いを整理したうえで、システム設計で押さえておきたい考え方を解説します。特定製品の導入手順ではなく、認証要素の考え方、認可モデル(RBAC・ABAC)、トークンとスコープの扱い、設計を分離する意義、発注時に確認しておきたいポイントに焦点を当てます。
なお、特定のIDaaS製品との連携手順や、パスワードレス認証・生体認証といった実装方式そのものは本記事の主題ではありません。あくまで認証と認可という概念の違いと、設計上どう判断すべきかという点を中心に扱います。
この記事のポイント
- 認証(Authentication)は「本人確認」、認可(Authorization)は「権限判定」であり、目的も設計対象も異なります。
- 二つを混同すると、権限管理が複雑化し、想定外のアクセスや情報漏えいのリスクが高まりやすくなります。
- 認可の設計にはRBAC・ABACといったモデルがあり、トークンとスコープの扱いを踏まえて認証と認可を分離して設計することが実務上の勘所です。
目次
認証(Authentication)とは何か
認証とは、システムにアクセスしようとしている相手が「本当に本人であるか」を確認する仕組みです*1。もっとも一般的な方法はID・パスワードの組み合わせですが、それだけでは第三者による不正ログインを防ぎきれない場合があります。近年は、パスワードに加えてスマートフォンアプリやSMSで受け取る確認コードを組み合わせる多要素認証(MFA)を採用する企業が増えています。
認証の3要素
認証の方法は、一般に次の3種類の要素に整理されます。
- 知識要素――パスワードやPINコードなど、本人だけが知っている情報
- 所持要素――スマートフォンやICカードなど、本人だけが持っているもの
- 生体要素――指紋や顔といった、本人の身体的特徴
多要素認証は、この3要素のうち二つ以上を組み合わせる考え方です。一つの要素だけに頼るよりも、なりすましのリスクを下げやすくなります。ただし多要素認証はあくまで「本人確認の精度を高める仕組み」であり、次に説明する認可の話とは切り分けて考える必要があるのです。
認可(Authorization)とは何か
認可とは、認証によって本人であることが確認された相手に対して、「何を許可するか」を判定する仕組みです*1。ログインが成功したからといって、そのユーザーがシステム内のすべての操作やデータにアクセスできるわけではありません。閲覧できる範囲、編集できる項目、実行できる処理は、役割や契約条件に応じて制限されるべきものでしょう。
認可が扱う代表的な判断
認可の設計では、たとえば次のような判断を扱います。
- 一般社員は自部門のデータのみ閲覧でき、他部門のデータは閲覧できない
- 管理者権限を持つユーザーだけが、ユーザー情報の削除や設定変更を実行できる
- 外部パートナー企業のアカウントは、特定のAPIエンドポイントのみ利用できる
認証が「入口の確認」だとすれば、認可は「入った後にどこまで動けるかを決める仕組み」と言えます。両者は連続した処理ではあるものの、目的も判定基準もまったく異なるのです。
認証と認可の違い:対比表で整理する
認証と認可は英語表記が似ていることもあり、要件定義の場でも混同されがちな概念です。次の表で、両者の違いを整理します。
| 認証(Authentication) | 認可(Authorization) | |
|---|---|---|
| 目的 | 相手が本人であることを確認する | 本人に何を許可するかを判定する |
| 問い | 「あなたは誰ですか」 | 「あなたは何をしてよいですか」 |
| 主な手段 | パスワード・多要素認証・証明書 | ロール・権限・スコープ・ポリシー |
| 処理のタイミング | アクセスの入口(ログイン時) | 認証の後、個々の操作・データアクセス時 |
| 失敗時の状態 | 401 Unauthorized(本人と確認できない) | 403 Forbidden(本人だが権限がない) |
表からもわかるとおり、認証は「誰であるか」、認可は「何ができるか」を扱う仕組みです。設計者はこの違いを踏まえ、認証の仕組みを強化すれば認可の設計も自動的に堅牢になる、という誤解を避ける必要があります。
なぜ混同が問題になるのか:セキュリティリスクの視点
認証と認可を明確に区別せずに設計すると、いくつかの典型的な問題が起こりやすくなります。よくあるのが、「ログインさえ通れば、あとは画面側の表示制御だけで十分」という考え方です。画面上でメニューを非表示にしていても、APIを直接呼び出せば本来アクセスできないはずのデータを取得できてしまうケースは珍しくありません*1。これは、認可の判定をサーバー側できちんと実装せず、認証の有無だけで処理を進めてしまった典型例といえるでしょう。
混同が招きやすい代表的なリスク
- 権限昇格――一般ユーザーが、URLやAPIパラメータを操作することで管理者専用の機能を実行できてしまう
- 過剰な権限付与――運用の手間を省くために、必要以上に広い権限を初期設定でユーザーに与えてしまう
- 退職・異動時の権限残存――認証情報(アカウント)は無効化したが、紐づく権限設定の見直しが漏れる
- 監査対応の困難化――誰がどの権限を持っているかが整理されておらず、監査やインシデント対応時に確認の手間が増える
これらのリスクは、認証を強化するだけでは解消しません。認可の設計、つまり「誰に何を許可するか」というルールそのものを、システムの要件定義段階から意識的に設計しておくことが欠かせないのです。
認可モデルの基本:RBACとABAC
認可のルールをどう表現するかについては、いくつかの代表的なモデルが存在します。設計段階でどのモデルを採用するかによって、権限管理の柔軟性や運用の手間が変わってきます。
RBAC(ロールベースアクセス制御)
RBAC(Role-Based Access Control)は、ユーザーに直接権限を割り当てるのではなく、「営業担当」「経理担当」「管理者」といったロール(役割)に権限をまとめ、ユーザーにロールを割り当てる方式です。組織構造に沿った権限管理がしやすく、多くの業務システムで採用されている考え方といえます。ロールの数が増えすぎると管理が煩雑になりやすい点は留意が必要です。
ABAC(属性ベースアクセス制御)
ABAC(Attribute-Based Access Control)は、ユーザーの属性(部署・役職・雇用形態)、リソースの属性(機密区分・作成部門)、環境の属性(アクセス時刻・接続元IPアドレス)などを組み合わせて、動的に認可を判定する方式です。「平日の営業時間内かつ社内ネットワークからのアクセスに限り、機密区分Aのデータを閲覧できる」といった、条件を細かく組み合わせたポリシーを表現できます。RBACより柔軟な反面、ポリシー設計と運用の難易度は上がる傾向にあるでしょう。
どちらを選ぶべきか
小規模なシステムや、権限のパターンがある程度固定的な業務であれば、RBACから設計を始めるのが現実的な選択肢です。一方、取引先や部署をまたぐ複雑な条件でアクセス制御を行いたい場合は、RBACをベースにしながら一部をABAC的な条件判定で補うハイブリッドな設計も選択肢に入ります。いずれのモデルを採用する場合も、権限の棚卸しがしやすい構造にしておくことが、運用フェーズでの負担軽減につながります。
認証と認可を分離する設計とトークンの考え方
現代的なWebシステムやAPI連携では、認証と認可の処理を明確に分離して設計することが一般的です。その代表例が、OAuth 2.0やOpenID Connect(OIDC)といった標準仕様に基づく設計です*1。OAuth 2.0は主に認可の枠組みを定めた仕様であり、OIDCはOAuth 2.0の上に本人確認(認証)の仕組みを追加したものと整理されています。
トークンとスコープ
これらの仕組みでは、認証が成功した後にアクセストークンと呼ばれる情報が発行され、以降の処理ではこのトークンを使って認可の判定が行われます。トークンには「スコープ」と呼ばれる権限の範囲が紐づけられ、たとえば「プロフィール情報の閲覧のみ許可」「注文データの読み取りと書き込みを許可」といった単位で権限を絞り込めるのです。トークンに有効期限を設定し、期限切れ後は再認証や再認可を求める設計も、リスクを抑えるうえで重要な考え方です。
なぜ分離するのか
認証と認可の処理を分離しておくと、認証の仕組み(ID連携先やMFAの方式など)を変更しても、認可のロジックに手を入れずに済む場合が多くなります。逆に、権限体系を見直す際にも、認証基盤に影響を与えずに変更できるはずです。両者を一体的に実装してしまうと、片方の変更がもう片方に予期せぬ影響を及ぼしやすく、システムの保守性が下がる要因になりやすいといえます。
よくある設計ミスと発注時に確認したいポイント
認証と認可の設計では、実務でくり返し見られる失敗パターンがあります。発注担当者やPMが要件定義・レビューの段階で確認しておきたい観点とあわせて整理します。
よくある設計ミス
- 画面側の表示制御だけで満足し、APIやバックエンド側で認可チェックを行っていない
- 初期リリースを急ぐあまり、権限区分を「管理者」「一般」の2種類だけで済ませ、後から細かい権限分けが必要になり大規模な改修が発生する
- 退職・異動・契約終了に伴う権限変更のフローが運用設計に組み込まれておらず、不要な権限が残り続ける
- トークンの有効期限を長く設定しすぎ、漏えい時の被害範囲が広がりやすい状態になっている
発注時に確認したい質問例
- 権限の単位はロール単位か、個別の機能・データ単位か。将来的な権限追加にどこまで対応できる設計か
- APIレベルでの認可チェックは、フロントエンドの表示制御と独立して実装されるか
- アカウント無効化や権限変更の運用フローは、誰がどのタイミングで実施する設計になっているか
- アクセストークンやセッションの有効期限、失効の仕組みはどう設計されているか
これらの観点は、開発の後工程で作り込むほど手戻りが大きくなりやすい部分です。要件定義の段階から認証と認可を分けて整理しておくことで、権限まわりの手戻りを抑えやすくなるでしょう。
まとめ:認証と認可は目的が異なる別の設計課題
本記事では、認証(Authentication)と認可(Authorization)という二つの概念について、その違いや混同によるリスク、RBAC・ABACといった認可モデルの基本、トークンを用いて認証と認可を分離する設計の考え方、発注時に確認しておきたいポイントまでを整理しました。認証は「本人であるか」を確認する仕組みであり、認可は「本人に何を許可するか」を判定する仕組みです。両者は連続した処理でありながら、目的も設計上の判断基準も異なります。
システム開発の要件定義やレビューの場では、「ログイン機能」という言葉だけで済ませず、認証と認可をそれぞれ独立した設計課題として扱うことが、権限まわりのトラブルを未然に防ぐ出発点になります。
よくある質問
認証と認可の違いを、一言で言うとどう説明できますか。
認証は「相手が本人であるかを確認する仕組み」、認可は「本人に何を許可するかを判定する仕組み」です。ログインの成功は認証の完了を意味しますが、その後にどこまで操作できるかは認可の設計によって決まります。
認証と認可はどちらを先に設計すべきですか。
一般的には、認証の仕組みを先に固め、その結果として得られる本人情報をもとに認可のルールを設計する順序が実務的です。ただし、どのような権限区分が必要かという認可の要件は、要件定義の早い段階から並行して洗い出しておくことが望ましいでしょう。
多要素認証(MFA)を導入すれば、認可の設計は不要になりますか。
不要にはなりません。多要素認証はあくまで本人確認の精度を高める認証側の仕組みであり、本人が確認できた後に何を許可するかという認可の設計とは別の課題です。両方を組み合わせて初めて、なりすましと過剰な権限付与の両方のリスクに対応できます。
RBACとABAC、小規模なシステムではどちらを選ぶべきですか。
権限のパターンが部署や役職に応じてある程度固定的であれば、まずRBACから設計を始めるのが現実的です。取引先や利用条件によって細かく権限を分けたい場合は、RBACを土台にしつつ一部の条件をABAC的な判定で補う設計も選択肢になります。
外部委託でシステム開発を依頼する場合、認証・認可について何を確認すればよいですか。
権限の単位(ロール単位か機能単位か)、APIレベルでの認可チェックの有無、アカウント無効化や権限変更の運用フロー、トークンやセッションの有効期限の設計方針について、要件定義の段階で確認しておくとよいでしょう。
著者:テレリモ総研編集部 鈴木 亮佑
システム開発・設計のご相談はLASSICへ
元請(プライムベンダー)として、認証・認可の設計方針の整理から、権限管理を含むシステム開発までご提案します。まずはお気軽にご相談ください。
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:IPA(独立行政法人情報処理推進機構)「情報セキュリティ」関連情報(https://www.ipa.go.jp/security/)