こんにちは、阿久梨絵です!
「この機能、動くはずなのに…」
「なんでアクセスできないの?」
そんな“止められた体験”の裏には、セキュリティ設計の基本原則が潜んでいます。
それが、“ デフォルト拒否 ”という考え方。
この記事では、ホワイトリスト方式の意味と、実装でどう守るかをやさしく解説します。
「デフォルト拒否」ってどういうこと?
セキュリティ設計では、“最初はすべて拒否”が基本です。
そのうえで、明示的に許可されたものだけを通す──これがホワイトリスト方式。
対義語は?
・ブラックリスト方式:危険なものだけをブロックする(抜け漏れが起きやすい)
・ホワイトリスト方式:安全なものだけを通す(安心設計)
なぜ“拒否が基本”なの?
・漏れが起きにくい:許可されたものしか通らないため、意図しないアクセスを防げる
・予測可能な動作:開発者もユーザーも「何が通るか」が明確になる
・ゼロトラスト設計に近づく:信頼せず、検証する設計思想と相性が良い
実装でどう守る?ホワイトリスト方式の例
1.CORS(クロスオリジンリソース共有)
// ❌ワイルドカードで全許可(危険)
res.setHeader(“Access-Control-Allow-Origin”, “*”);
// ✅ホワイトリスト方式
const allowedOrigins = [“https://example.com”, “https://aqlier.com”];
if (allowedOrigins.includes(origin)) {
res.setHeader(“Access-Control-Allow-Origin”, origin);
}
・外部からのアクセスは明示的に許可されたドメインのみ通す
2.入力サニタイズ(XSS・SQLインジェクション対策)
// ❌そのままDBに突っ込む(危険)
db.query(`SELECT * FROM users WHERE name = ‘${req.body.name}’`);
// ✅サニタイズ+プレースホルダー
const sanitizedName = sanitize(req.body.name);
db.query(“SELECT * FROM users WHERE name = ?”, [sanitizedName]);
・入力値は“安全なものだけを通す”処理を挟むのが基本
3.APIアクセス制御
// ❌誰でも叩けるAPI(危険)
app.get(“/admin”, handler);
// ✅認証+ロールチェック
app.get(“/admin”, authenticate, authorize(“admin”), handler);
・APIは“誰が何をできるか”を明示的に制御する
“拒否から始める”ことで、安心が生まれる
「最初は通さない」ことで、
“通していいもの”を見極める習慣が生まれます。
それは、ユーザーの安心だけでなく、
開発者自身の「この設計で大丈夫?」という不安もほどいてくれるのです。
まとめ
ホワイトリスト方式は、信頼を前提にしない設計です。
それは、「なんでこうなるの?」を防ぐための、やさしい拒否。
「最初は拒否、あとで許可」──この順番が、
アプリやサービスの安心を支える土台になります。
阿久梨絵でした!
