認証
認証 (authentication) = 誰であるかを確かめる。 認可 (authorization) = 何をしてよいかを決める。
混同されやすいが別の問題。
方式#
| 方式 | 特徴 |
|---|---|
| パスワード | 実装は簡単。使い回し・漏洩に弱い |
| 多要素認証 (MFA) | 知識 + 所持 + 生体。最も効果が大きい |
| パスキー / WebAuthn | 公開鍵暗号。フィッシングに原理的に強い |
| OAuth 2.0 / OIDC | 他サービスに委任する |
| 生体認証 | 端末内で検証。鍵の解錠に使う |
パスワードの保存#
平文で保存してはいけない。 ハッシュ化する。 しかも高速なハッシュ(SHA-256 など)は不適切で、 意図的に遅い関数を使う。
| 推奨 | 特徴 |
|---|---|
| Argon2id | メモリも要求する。現在の第一候補 |
| bcrypt、scrypt | 実績がある |
各ユーザに異なるソルトを付け、 レインボーテーブルを無効にする。
トークン#
| 種類 | 寿命 | 保存場所 |
|---|---|---|
| アクセストークン | 短い(数分〜1 時間) | メモリ |
| リフレッシュトークン | 長い | キーチェーン等の安全な場所 |
短命なアクセストークンと長命なリフレッシュトークンに 分けるのは、漏洩時の被害を時間で限定するため。
OAuth 2.0 / OIDC#
OAuth は認可の枠組みであって認証ではない。 「このアプリに、あなたの写真を読む権限を与えますか」を扱う。
認証(本人確認)が必要なら、 その上に構築された OpenID Connect を使う。 OAuth を認証に流用した実装は脆弱になりやすい。
ネイティブアプリでは PKCE 付きの認可コードフローが必須。 インプリシットフローは非推奨。
参考文献#
- Dick Hardt (ed.). The OAuth 2.0 Authorization Framework. RFC 6749, 2012. https://doi.org/10.17487/RFC6749
- Torsten Lodderstedt et al. OAuth 2.0 Security Best Current Practice. RFC 9700, 2025. https://doi.org/10.17487/RFC9700
- NIST SP 800-63B. Digital Identity Guidelines: Authentication and Lifecycle Management. https://pages.nist.gov/800-63-3/sp800-63b.html
- OWASP. Password Storage Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html