🔐

認証と認可の違いを『ポケモン』でわかりやすく解説する記事

2023/10/11に公開

はじめに

今回の記事では、認証と認可の違いを『ポケットモンスター』(以下『ポケモン』)を具体例に、簡単なJavaScriptのコードを用いて解説する。

認証(Authentication)とは

認証は、ユーザが主張する自分の身元(ユーザ名、パスワード)が正しいかどうかを確認するプロセスを意味する。認証の最大の目的は、アクセスしようとしている人を確認するためにある。数多くのWebサービスで存在する「ログイン」機能は、認証の代表的な具体例だ。

認証の主な具体例は以下の通りである。

  • ユーザ名とパスワード
  • 顔認証、指紋認証等の生体認証
  • ワンタイムパスワード

認可(Authorization)とは

認可とは、特定のリソースやサービスへのアクセスを拒否するプロセスである。大半は認証が成功した際に行われることが多い。認可の最大の目的は、認証されたユーザが許可されている行為とそうではないものを決定するためにある。

認可の主な具体例は以下の通りだ。

  • ファイルの読み取り・書き込み制限
  • 特定のWebページのアクセス制限

サンプルコード&解説

今度は具体的にJavaScriptのコードで『ポケモン』を具体例に、両者を説明しよう。「ポケモントレーナーのSatoshiで、trainerでありis_verifiedとしてアクセスできるかどうかを検証する」プログラムを書く。

まずは、Satoshiというユーザ情報のサンプルを書く。

const user = {
    username: 'Satoshi',
    password: 'pikachu123',
    roles: ['trainer', 'is_verified']
};

次に、認証(authenticate())と認可(authorize())を司る関数を以下に書く。

// 認証
function authenticate(username, password) {
    return user.username === username && user.password === password;
}

// 認可
function authorize(role) {
    return user.roles.includes(role);
}

その後に、認証と認可を実行するプロセスを以下のように書く。

if (authenticate('Satoshi', 'pikachu123')) {
    console.log('認証成功!');

    if (authorize('trainer')) {
        console.log('トレーナーとしてのアクセスが許可されました。');
    }
    if (authorize('is_verified')) {
        console.log('ポケモンリーグに参加する資格があります。');
    }
} else {
    console.log('認証失敗!');
}

上述のコードを深く読んでみよう。以下のコードの部分が、「あなたはポケモントレーナーのSatoshiですか?」を証明する関数になる。

if (authenticate('Satoshi', 'pikachu123')) {

    console.log('認証成功!');

    // コードは省略
} 

先程のauthenticate()関数の下部にあるこの部分が、「Satoshiはポケモンリーグに参加する資格のあるトレーナーですか?」を証明する関数になる。

if (authorize('trainer')) {
      console.log('トレーナーとしてのアクセスが許可されました。');
}

if (authorize('is_verified')) {
      console.log('ポケモンリーグに参加する資格があります。');
}

これまで書いたコードを一つのファイルにまとめると、Satoshiというuserがポケモンリーグに参加する資格のあるトレーナーであることを証明するプログラムが完成する。

const user = {
    username: 'Satoshi',
    password: 'pikachu123',
    roles: ['trainer', 'is_verified']
};

function authenticate(username, password) {
    return user.username === username && user.password === password;
}

function authorize(role) {
    return user.roles.includes(role);
}

if (authenticate('Satoshi', 'pikachu123')) {
    console.log('認証成功!');

    if (authorize('trainer')) {
        console.log('トレーナーとしてのアクセスが許可されました。');
    }
    if (authorize('is_verified')) {
        console.log('ポケモンリーグに参加する資格があります。');
    }
} else {
    console.log('認証失敗!');
}

上述のコードを踏まえて、改めて両者の違いを『ポケモン』を具体例に解説する。

認証(Authentication)は、userがポケモントレーナーのSatoshiかどうかを証明するプロセスだ。例えば、ポケモンリーグでバトルをする前に自分の身分を証明するプロセスがこれに該当する。

一方で、認可(Authorization)はSatoshiとして認証された後、ポケモンリーグに参加する権限を持っているかどうかを確認するプロセスだ。

まとめると、

  • 認証:「あなたは本当にSatoshiですか?」という質問に回答すること
  • 認可:「Satoshiとして、ポケモンリーグに参加できますか?」という質問に回答すること

このように解釈できる。認証と認可はそれぞれ独立しておらず、以下のような流れで進む。

おわりに

今回の記事では、『ポケモン』を具体例に認証と認可の違いを解説した。両者の違いをまとめると、以下のようになる。

認証(Authentication) 認可(Authorization)
定義 システムのアクセスを提供するために、ユーザ自身の身元を確認する 具体的なリソースにアクセスするために、個人やユーザの権限を確認する
目的 ユーザや個人が正しいかどうかを検証する ユーザや個人がサービス内でできることを検証する
具体例 生体認証、ワンタイムパスワード ファイルの読み取り・書き取り制限、アクセス制限

参考サイト

https://www.onelogin.com/learn/authentication-vs-authorization

https://auth0.com/docs/get-started/identity-fundamentals/authentication-and-authorization

https://www.geeksforgeeks.org/difference-between-authentication-and-authorization/

GitHubで編集を提案

Discussion