はじめに
―― セキュリティの土台であり、最初に崩れる場所
ユーザ認証は、システムセキュリティにおける玄関の鍵です。
どんなに堅牢な暗号化や最新のWAFを導入していても、認証が甘ければすべて無意味になります。
逆に言えば、認証設計がきちんとしているサービスは、だいたい全体設計も強い。
この記事では、ユーザ認証の基本から実務で重要なポイントまでを体系的に整理します。
ユーザ認証とは
ユーザ認証(Authentication) とは、
「この操作をしている人物が、主張している本人であることを確認する仕組み」
です。
※よく混同されますが:
| 用語 | 意味 |
|---|---|
| 認証(Authentication) | あなたは誰か |
| 認可(Authorization) | 何をしていいか |
この2つを混ぜると、脆弱性が生まれます(ほぼ確実に)。
認証の基本フロー
- ユーザが識別情報を送信(ID / メール)
- 秘密情報を提示(パスワード・トークンなど)
- サーバ側で検証
- 認証成功後、認証状態を発行(セッション or トークン)
重要なのは④。
毎回パスワードを送らせないのが現代的な設計です。
主なユーザ認証方式
1. パスワード認証
最も古く、今も最も多く使われている方式です。
仕組み
- サーバはパスワードのハッシュ値のみを保存
- ログイン時にハッシュ化して比較
必須ルール
- 平文保存:論外
- 高速ハッシュ(SHA-256単体):危険
- 推奨:
bcrypt / Argon2
問題点
- 使い回し
- フィッシング耐性が低い
- 漏洩時の被害が大きい
単体運用はもはや限界。
2. 多要素認証(MFA / 2FA)
複数の「本人確認要素」を組み合わせる方式。
要素の種類
- 知識:パスワード
- 所持:スマホ、トークン
- 生体:指紋、顔認証
例
- パスワード + ワンタイムパスワード
- パスワード + 生体認証
メリット
- パスワード漏洩 ≠ 即侵害
セキュリティの現実的な落とし所。
3. トークンベース認証(JWTなど)
API・SPA・モバイルアプリで主流。
流れ
- ログイン成功
- サーバがトークンを発行
- クライアントは以後トークンを送信
特徴
- ステートレス
- スケーラブル
注意点
- 有効期限は短く
- 署名アルゴリズムの誤設定は致命的
- トークンの保存場所が重要
便利だが、扱いを間違えると一気に事故る。
4. 外部認証(OAuth / OpenID Connect)
Google・Apple・GitHubログインなど。
メリット
- パスワード管理不要
- UXが良い
注意
- 認証と認可の責務を誤解しやすい
- 実装ミスによるアカウント乗っ取り事例が多い
楽だが、ブラックボックスを信じすぎないこと。
よくある実装ミス(実務あるある)
- フロントで暗号化して「安全だと思っている」
- JWTを localStorage に保存
- トークン無期限
- ログアウト時に何もしない
- 認証失敗理由を詳細に返す
攻撃者は仕様書を読みません。コードを読みます。
ベストプラクティスまとめ
- パスワードは
Argon2 / bcrypt - 通信は常に HTTPS
- トークンは短命+更新設計
- 重要操作は再認証
- 可能な限り MFA を必須化
- フロントエンドは信用しない
おわりに
ユーザ認証は、
一度作って終わりではなく、運用で完成する仕組み
派手さはありませんが、
ここが強いシステムは、全体的に信頼できます。