【入門編】 APIゲートウェイにおけるレートリミットと認証・認可の統合 – ガバナンス・リスク管理 & 生成AIセキュリティ防御ガイド

こんにちは。セキュリティの最前線で、日々「見えない泥棒」と対峙しているエンジニアです。

今日は、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. 現場からのアドバイス:完璧を目指さない

最後に、これだけは覚えておいてください。「完璧なセキュリティは存在しない」ということです。

レートリミットを厳しくしすぎると、本当に困っているお客様まで締め出してしまいます(これを「誤検知」と言います)。逆に、認証を複雑にしすぎると、開発者がコードを書くたびに頭を抱えることになります。

  • まずは「誰が来ているか(認証)」を固める。
  • 次に「やりすぎな奴を止める(レートリミット)」を設定する。
  • 最後に「監視ログ」を見て、泥棒がどんな玄関を狙っているか分析する。

このサイクルを回し続けることこそが、最高峰のセキュリティへの第一歩です。難しく考えすぎず、まずは自分のサービスの「玄関」に鍵をかけるところから始めてみましょう。

皆さんのサービスが、泥棒知らずの安全な場所になりますように。応援しています!

コメント

タイトルとURLをコピーしました