認証と認可の違い

この2つは混同されやすいですが、明確に異なります。

概念英語問い
認証Authentication(AuthN)「あなたは誰か?」ログイン画面でパスワードを入力
認可Authorization(AuthZ)「何をしていいか?」管理者のみが設定ページにアクセス可能
略語の混乱

認証はAuthn、認可はAuthzと略されることがあります。Auth単体では文脈によって意味が変わるため注意が必要です。

認証の3要素

安全な認証には以下の要素を組み合わせます(多要素認証 = MFA)。

要素説明
知識要素(Something you know)知っている情報パスワード、PIN、秘密の質問
所持要素(Something you have)持っているモノスマートフォン、ハードウェアキー(YubiKey)
生体要素(Something you are)体の特徴指紋、顔認証、虹彩

MFA の重要性

Microsoft の調査によると、MFAを有効にするだけでアカウント侵害の99.9%を防止できます。

SMS認証の弱点

SMS認証(OTP)は利便性が高いですが、SIMスワッピング攻撃に脆弱です。可能であれば認証アプリ(TOTP)またはFIDO2/WebAuthnハードウェアキーを使用してください。

パスワードの安全な管理

パスワードハッシュ

パスワードは平文で保存してはいけません。適切なハッシュアルゴリズムを使用します。

パスワードハッシュアルゴリズムの比較
アルゴリズム推奨度特徴
bcrypt推奨コスト係数で計算速度を調整可能
Argon2id最推奨メモリ・並列性・反復回数を調整可能。PHCの勝者
scrypt推奨メモリハード設計でGPUによるブルートフォースに耐性
PBKDF2条件付き推奨FIPS準拠環境向け。NIST SP 800-63B推奨
MD5 / SHA-1禁止高速すぎてブルートフォースに極めて脆弱
SHA-256(単純)禁止Saltなし・高速のため辞書攻撃・レインボーテーブルに脆弱

Salt とは

パスワードハッシュにランダムな値(Salt)を加えることで、同じパスワードでも異なるハッシュ値を生成します。レインボーテーブル攻撃を無効化します。

OAuth 2.0 と OpenID Connect

OAuth 2.0(認可フレームワーク)

OAuth 2.0は「アプリAがユーザーに代わってサービスBにアクセスする権限を安全に委譲する」仕組みです。

ユーザー → アプリA → 「Googleでログイン」ボタン

Googleの認可画面(「アプリAに○○を許可しますか?」)
         ↓ 承認
アプリA → Googleから Access Token を取得

アプリA → Googleの APIに Access Token を使ってアクセス

OpenID Connect(OIDC)

OAuth 2.0を拡張した認証プロトコル。ID Token(JWT形式)によりユーザーの身元確認ができます。

アクセス制御モデル

RBAC(ロールベースアクセス制御)

ユーザーに「ロール(役割)」を割り当て、ロールに権限を付与します。

ユーザー → ロール(admin/editor/viewer)→ 権限
  • シンプルで管理しやすい
  • 大規模組織では「ロール爆発」が課題

ABAC(属性ベースアクセス制御)

ユーザー属性・リソース属性・環境属性を組み合わせてポリシーで評価します。

「部署=財務 AND 職位=課長以上 AND 時刻=営業時間内」→ アクセス許可
  • 柔軟で細かい制御が可能
  • ポリシー設計が複雑になりやすい

JWT(JSON Web Token)

JWTは認証情報をJSONとして符号化し、署名を付けたトークンです。

ヘッダー.ペイロード.署名
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIn0.xxxx
JWTのよくある脆弱性
  1. alg:none 攻撃: アルゴリズムに「none」を指定して署名検証をバイパス。サーバー側で許可するアルゴリズムを明示的に指定することが必須です。
  2. 機密情報の格納: JWTのペイロードはBase64エンコードのみ(暗号化ではない)。パスワードやシークレットを含めないこと。
  3. 有効期限の未設定: exp クレームは必ず設定すること。

理解度チェック

OAuth 2.0 と OpenID Connect の主な違いはどれですか?