こんにちは。セキュリティの最前線で、日々「見えない泥棒」と対峙しているエンジニアです。
今日は、APIという「家の玄関」をどう守るか、というお話をします。ITの世界も実は現実の防犯と全く同じ。仕組みを知れば、あなたの作ったサービスがグッと堅牢になりますよ。一歩ずつ、紐解いていきましょう。
—
1. APIは「あなたの家の玄関」です
APIは、外部からのリクエストを受け付ける窓口です。ここを野放しにしていると、泥棒(攻撃者)は「鍵のかかっていない玄関」を見つけた時と同じように、家中を荒らし放題にしてしまいます。
ここで登場するのがAPIゲートウェイという「凄腕の警備員」です。ゲートウェイは、建物(バックエンドのサーバー)に入る前に、怪しい奴がいないか、騒ぎを起こそうとしていないかを厳しくチェックします。
泥棒の手口:ブルートフォースとDDoS
- ブルートフォース(総当たり攻撃): 泥棒が「カチャカチャ」とありとあらゆる鍵を試して開けようとすることです。
- DDoS(サービス拒否攻撃): 何千人ものサクラを雇って玄関に詰めかけさせ、正規の訪問者が入れないようにすることです。
これらを防ぐのが「レートリミット(スロットリング)」と「認証・認可」の二本柱です。
—
2. レートリミット:玄関に置く「人数制限ポール」
レートリミットとは、「1分間に何回まで叩いてもいいよ」という制限です。例えば、「お一人様、1分間に10回まで」と決めておけば、爆速で鍵を回してくる泥棒を門前払いにできます。
設定のイメージ(Nginxなどの設定例)
APIゲートウェイとしてNginxを使う場合、こんな風に設定します。
# 1分間に10回までのリクエストに制限する設定
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/m;
server {
location /api/ {
# 制限を適用し、バースト(一時的な急増)を5回まで許容する
limit_req zone=api_limit burst=5 nodelay;
# 正常な処理へ
proxy_pass http://backend_server;
}
}
「burst=5」というのは、「普段は厳しいけど、ちょっとした混雑なら5回までは見逃してあげるよ」という優しさのバッファです。この数値を調整するのが、現場の腕の見せ所ですね。
—
3. OAuth 2.0 / OIDC:身分証という名の「通行手形」
レートリミットで「数」を絞っても、そもそも「誰かわからない奴」を通すのは危険ですよね。そこで登場するのが、OAuth 2.0 や OIDC(OpenID Connect) です。
これは、玄関に警備員を立たせ、「身分証を見せてください」と言う仕組みです。
- OAuth 2.0: 「君にはこの部屋に入る権限があるね」という許可(認可)の証明。
- OIDC: 「君は本当に本人だね」という身元の確認(認証)。
APIゲートウェイは、リクエストのヘッダーにある Authorization: Bearer <トークン> を受け取り、そのトークンが本物か、期限切れではないかを検証します。
リクエスト検証のコード例(Node.js/Expressでの簡易イメージ)
ゲートウェイが裏側でやっている検証は、こんなイメージです。
const jwt = require('jsonwebtoken'); // トークンを解析するライブラリ
function verifyToken(req, res, next) {
const authHeader = req.headers['authorization'];
// 「Bearer <トークン>」という形式か確認
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.status(401).send('身分証がないですよ!');
// トークンが信頼できる相手から発行されたか、改ざんされていないかチェック
jwt.verify(token, process.env.PUBLIC_KEY, (err, user) => {
if (err) return res.status(403).send('その身分証は偽造されています!');
req.user = user;
next(); // 通過OK!
});
}
—
4. 現場からのアドバイス:完璧を目指さない
最後に、これだけは覚えておいてください。「完璧なセキュリティは存在しない」ということです。
レートリミットを厳しくしすぎると、本当に困っているお客様まで締め出してしまいます(これを「誤検知」と言います)。逆に、認証を複雑にしすぎると、開発者がコードを書くたびに頭を抱えることになります。
- まずは「誰が来ているか(認証)」を固める。
- 次に「やりすぎな奴を止める(レートリミット)」を設定する。
- 最後に「監視ログ」を見て、泥棒がどんな玄関を狙っているか分析する。
このサイクルを回し続けることこそが、最高峰のセキュリティへの第一歩です。難しく考えすぎず、まずは自分のサービスの「玄関」に鍵をかけるところから始めてみましょう。
皆さんのサービスが、泥棒知らずの安全な場所になりますように。応援しています!
コメント