認証と認可の違い
この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のよくある脆弱性
- alg:none 攻撃: アルゴリズムに「none」を指定して署名検証をバイパス。サーバー側で許可するアルゴリズムを明示的に指定することが必須です。
- 機密情報の格納: JWTのペイロードはBase64エンコードのみ(暗号化ではない)。パスワードやシークレットを含めないこと。
- 有効期限の未設定: exp クレームは必ず設定すること。
理解度チェック
OAuth 2.0 と OpenID Connect の主な違いはどれですか?
解説: OAuth 2.0は認可(リソースへのアクセス権限の委譲)のためのフレームワークです。OpenID ConnectはOAuth 2.0の上に認証レイヤーを追加したプロトコルで、ユーザーの身元確認(認証)が可能になります。ID Tokenを使ってユーザー情報を取得できる点がOAuthとの大きな違いです。