コンテンツにスキップ

6-1. 認証・認可・パスワードハッシュ・HTTPS

  • 認証と認可の違い
  • ログイン後に「誰か」を持ち越す方法
  • パスワードを平文保存してはいけない理由
  • パスワードハッシュとソルトの役割
  • HTTPS が通信で守っているもの
  • これらを実務でどう組み合わせるか

第2章では、HTTP・Cookie・401 / 403 を「Web の仕組み」として見た。
この章ではそこから一歩進み、なぜ安全に扱わないと危険なのか を理解する。


1. なぜセキュリティを最初に学ぶのか

Section titled “1. なぜセキュリティを最初に学ぶのか”

業務システムでは、次のような情報や操作を扱うことが多い。

  • 顧客情報
  • 注文や支払い
  • 社内資料
  • 管理者だけができる設定変更

つまりシステムには、常に次の問いがある。

1. この人は誰か
2. この操作を許してよいか
3. 途中で盗み見や改ざんをされないか
4. 万一データベースが漏れても被害を広げにくいか

この4つに対応する基本部品が、

  • 認証:この人は誰か
  • 認可:その操作を許してよいか
  • HTTPS:通信経路を守る
  • パスワードハッシュ:漏えい時の被害を減らす

である。

たとえば書籍管理アプリを考える。

利用者
│ ログイン情報を送る
▼
サーバー
│ 本人確認をする
│ 権限を確認する
▼
データベース

このとき、

  • 認証が弱いと、他人になりすませる
  • 認可が弱いと、一般ユーザーが管理操作できる
  • HTTPS がないと、通信を盗み見られる
  • パスワードを平文保存すると、漏えい時に即座に悪用される

という問題が起きうる。

セキュリティは「あとで追加する飾り」ではなく、最初から設計へ入れておくべき前提条件である。


似た言葉に見えるが、役割は違う。

用語何を確かめるか典型例
認証(Authentication)あなたは誰かログインしているか
認可(Authorization)その操作を許してよいか管理者だけが削除できるか
ログイン画面
↓
ID / パスワードを確認
↓
「Sato さん本人だ」と分かる
↓
認証成功

しかし、本人確認ができても、すべての操作を許してよいとは限らない。

Sato さんはログイン済み
↓
本の一覧を見る → 許可
本を削除する → 管理者なら許可
社員情報を全件取得する → 一般ユーザーなら不許可

Web API では、認証と認可の違いがステータスコードにも表れる。

コード意味状態
401 Unauthorized認証が必要まず「誰か」を示してほしい
403 Forbidden認可されない誰かは分かるが、その操作は許可できない

流れで見るとこうなる。

リクエスト受信
↓
認証できるか?
├─ できない → 401
↓
認可できるか?
├─ できない → 403
↓
処理を実行

ここで重要なのは、ログイン済み = 何でもできる、ではない という点である。


3. ログイン後はどう状態を持ち越すのか

Section titled “3. ログイン後はどう状態を持ち越すのか”

HTTP は基本的にステートレスであり、1回ごとのリクエストだけでは前回の状態を自動で覚えない。
そのため、ログイン成功後は「この人は認証済みだ」という情報を次のリクエストへ渡す必要がある。

典型的な流れは次のようになる。

ブラウザ
│ ID / パスワードを HTTPS で送る
▼
サーバー
│ 保存済みハッシュと照合する
▼
認証成功
│ セッションIDやトークンを返す
▼
以後のリクエストでその情報を送る
方式どう持ち越すか
セッションCookieブラウザが Cookie を自動送信し、サーバー側で状態を管理する
トークンクライアントが Authorization ヘッダーなどでトークンを送る

どちらも本質は、毎回パスワードを送り直さずに、認証済みであることを示す仕組み である。

セッションCookieを使う場合、次の属性がよく出てくる。

属性役割
SecureHTTPS 通信のときだけ送る
HttpOnlyブラウザの JavaScript からアクセスできなくする

つまり、ログイン処理は「認証に成功したら終わり」ではない。
認証済み状態をどう安全に持ち運ぶか まで設計する必要がある。


4. パスワードをそのまま保存してはいけない理由

Section titled “4. パスワードをそのまま保存してはいけない理由”

最も避けるべきなのは、パスワードの平文保存である。

たとえば次のようなテーブルを考える。

users
+----+--------+---------------+
| id | name | password |
+----+--------+---------------+
| 1 | Sato | lesson-pass |
| 2 | Ito | abc12345 |
+----+--------+---------------+

この状態でデータベースが漏れると、攻撃者はすぐにそのままログインを試せる。

平文保存が危険な理由は次の通りである。

  • データベース漏えい時に、即座に中身を読める
  • 運用者や開発者が不用意に閲覧できてしまう
  • 利用者が他サービスで同じパスワードを使っていると、被害が連鎖しやすい

「暗号化しておけばよい」では足りない理由

Section titled “「暗号化しておけばよい」では足りない理由”

ここで初学者が混同しやすいのが、暗号化 と ハッシュ の違いである。

方法元に戻せるか主な用途
暗号化鍵があれば戻せる内容を安全に保管・送信する
ハッシュ基本的に元へ戻さない前提一致確認に使う

パスワード保存では、サーバーは「元の文字列を思い出す」必要はない。
必要なのは、入力されたパスワードが正しいものと一致するか を確認することだけである。

そのためパスワードは「読める形で持つ」のではなく、照合だけできる形で持つ べきである。


5. パスワードハッシュとソルト

Section titled “5. パスワードハッシュとソルト”

ハッシュは、入力データから一定の規則で別の値を作る処理である。

password
↓
ハッシュ関数
↓
f3ab... のような値

ここで重要なのは、同じ入力なら必ず同じ結果になるが、結果から元の入力を直接取り戻す前提ではない ことだ。

ログイン時は次のように照合する。

登録時
入力パスワード
↓
ハッシュ化
↓
ハッシュ値を保存
ログイン時
入力されたパスワード
↓
同じ手順でハッシュ化
↓
保存済みハッシュと比較

つまりサーバーは、平文パスワードを覚えるのではなく、比較用の値 を保存する。

ソルトは、パスワードへ追加するランダムな付加データである。

password + salt
↓
ハッシュ化
↓
保存する値

ソルトが重要なのは、同じパスワードでもユーザーごとに違う結果を作りやすくなるからである。

Sato: lesson-pass + salt-A → hash-X
Ito: lesson-pass + salt-B → hash-Y

これにより、

  • 同じパスワードを使っている利用者を見抜かれにくくなる
  • 事前計算された攻撃用データを使い回されにくくなる

という効果がある。

ここでさらに重要なのは、パスワード保存には一般的な高速ハッシュをそのまま使わない ことである。
実務では、総当たり攻撃を遅くするために bcrypt、scrypt、Argon2 のようなパスワード専用の遅いアルゴリズムを使う。

つまり実務の考え方は、

平文保存しない
↓
ソルト付きでハッシュする
↓
パスワード専用の遅いアルゴリズムを使う

である。


HTTPS は、HTTP を TLS で保護した通信 である。
第2章では「安全に包んだ HTTP」として見たが、ここでは何が守られるのかをもう少し具体的に見る。

ブラウザ == TLSで保護された経路 == サーバー

HTTPS が主に守るのは次の3つである。

守るもの何を意味するか
秘密性途中で内容を盗み見られにくい
完全性途中で内容を書き換えられにくい
接続先の確認本当にそのサーバーへ接続しているか確かめやすい
利用者 ──(平文のHTTP)── 攻撃者も見える ── サーバー

この状態では、

  • ログインIDやパスワード
  • セッションCookie
  • 返ってくる HTML / JavaScript

などが盗み見や改ざんの対象になりうる。

特にログイン情報やセッションCookieが取られると、本人になりすまされる危険がある。

HTTPS は通信経路を守るが、

  • 弱いパスワード
  • 平文保存された認証情報
  • 間違った認可設定

までは解決しない。

つまり HTTPS は重要だが、認証・認可・安全な保存方式とセットで考える必要がある。


これまでの要素を、1つの流れとして並べると次のようになる。

1. 利用者がログイン画面へ入力
2. ブラウザが HTTPS で送信
3. サーバーが保存済みハッシュと照合
4. 成功したらセッションIDやトークンを返す
5. 以後の各リクエストで認証状態を確認
6. 操作ごとに認可を確認
7. 許可なら処理、不可なら 401 / 403

書籍管理アプリの例だと、こう考えられる。

操作認証認可
本の一覧を見る必要一般ユーザーでも可
本を追加する必要編集権限が必要
本を削除する必要管理者だけ可

ここで大切なのは、認証は入口の確認、認可は各操作ごとの確認 だということだ。
一度ログインしたあとも、操作ごとに権限判断は続く。


ログインできた = 何でもできる、ではない

Section titled “ログインできた = 何でもできる、ではない”

ログイン成功は本人確認が通っただけである。
その後の削除・閲覧・管理画面アクセスは、別途認可が必要になる。

暗号化は「戻す」ことを前提にする。
ハッシュは「戻さず、一致確認に使う」ことを前提にする。

HTTPS があれば保存方法は何でもよい、ではない

Section titled “HTTPS があれば保存方法は何でもよい、ではない”

HTTPS は通信中を守るが、データベースに平文保存していたら漏えい時に防げない。
通信の安全 と 保存の安全 は別々に考える必要がある。


キーワード説明
認証あなたは誰かを確かめること
認可その操作を許してよいか判断すること
401認証が必要、または不足している状態
403認証済みだが権限が足りない状態
パスワードハッシュ平文の代わりに照合用の値を保存する考え方
ソルトパスワードへ追加してハッシュを個別化する付加データ
bcrypt / scrypt / Argon2実務で使う代表的なパスワードハッシュ手法
HTTPS通信経路を盗み見・改ざんされにくくする仕組み
Secure / HttpOnlyCookie をより安全に扱うための代表的な属性

演習問題 に取り組んで、認証・認可・ハッシュ・HTTPS の関係を自分の言葉で説明できるようになろう。

理解できたら、次は 6-2. OWASP Top 10 で代表的な脆弱性の種類を学ぼう。