【入門編】 APIゲートウェイにおける認証・認可とレート制限 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

皆さん、こんにちは!インフラやセキュリティの世界へようこそ。
初めてサーバーやAPIのセキュリティと向き合う時、「OAuth?OIDC?レート制限?なんだか難しそう……」と途方に暮れていませんか?大丈夫です、一歩ずつ一緒に紐解いていけば、決して怖くありませんよ。

今回は、現代のWebシステムやスマホアプリの心臓部である「APIゲートウェイ」における認証・認可と、サーバーを守るための防衛策(レート制限)について、身近な防犯の仕組みに例えながら優しく解説していきます。

実務ですぐに使える具体的な設定例も用意したので、ぜひ最後まで読んでいってくださいね!

—

1. APIゲートウェイってなに? 家の「オートロック付きエントランス」に例えてみよう

皆さんが住んでいるマンションを想像してみてください。
もし、マンションの入り口(オートロック)がなくて、誰でもいきなり各部屋のドアを開けられたとしたら……怖くて夜も眠れませんよね。

現代のWebシステムも全く同じです。フロントエンド(スマホアプリやブラウザ)から送られてくるリクエストを一番最初に受け止め、家全体の安全を守る「マンションのエントランス」の役割を果たすのが、APIゲートウェイになります。

APIゲートウェイは、外からやってきた人が「怪しい奴ではないか」「正しい合鍵を持っているか」をチェックし、問題ない場合だけ中の部屋(バックエンドのマイクロサービス)に通すという、非常に重要な門番の仕事をしています。

—

2. 認証と認可:OAuth 2.0 / OIDCの世界を分かりやすく

APIのセキュリティで必ず耳にするのがOAuth 2.0とOIDC(OpenID Connect)という言葉です。なんだか呪文のようですが、これも現実世界の仕組みに置き換えるとスッキリ理解できます。

① 認証(Authentication)=「あなたは誰ですか?」

ホテルにチェックインする時、身分証明書を見せて「私は予約した〇〇です」と証明しますよね。これが認証です。
ITの世界では、これがOIDCの役割になります。「このユーザーは本当に本人に間違いない」という身元確認を、信頼できる認証局(GoogleやAuth0など)にお墨付きをもらう仕組みです。

② 認可(Authorization)=「あなたは何をしていい人ですか?」

ホテルに入った後、普通の宿泊客が「ホテルのマスターキーをください」と言っても、フロントは絶対に渡してくれませんよね。「一般の部屋はOKだけど、従業員用フロアやバックヤードに入る権限はありません」と制限されます。これが認可です。
ITの世界では、これがOAuth 2.0の役割になります。「このアプリには、このユーザーのプロフィールを見る権限だけを渡そう」といった、アクセス権限の委譲を行います。

APIゲートウェイは、この2つを連携させて、「正しい身元(OIDC)を持ち、適切な許可(OAuth 2.0)が書かれたデジタル通行証(アクセストークン)」を持っている人だけを通す仕組みを作ります。

—

3. スロットリング(レート制限):ドッと押し寄せる「悪意ある群衆」を防ぐ

さて、身元確認の門番を置くだけで万全……とはいかないのが、サイバー世界の厄介なところです。

例えば、人気のコンサートのチケット発売日に、何万人ものファンが一斉にアクセスしてサーバーがパンクしてしまう現象(いわゆる「入場制限」)や、悪意ある攻撃者がボット(自動プログラム)を使って、一秒間に何万回もパスワード総当たり攻撃を仕掛けてくるケースを想像してください。

これらを防ぐのがレート制限(スロットリング)です。
現実世界で例えるなら、人気ラーメン店の「お一人様一杯限り」「お並びの際はお一組ずつ順番に」というルールや、遊園地のアトラクションの入場ゲートで「1分間に通れる人数を制限する」仕組みにそっくりですね。

APIゲートウェイでは、「特定のIPアドレスやユーザーからのリクエストは、1分間に最大60回まで」といった制限を設けることで、サーバーのダウンや総当たり攻撃を未然に防ぎます。

—

4. 実践!NGINXを使ったAPIゲートウェイの設定例

それでは、実際にオープンソースの強力なWebサーバー/リバースプロキシである NGINX を使って、APIゲートウェイにおける「レート制限」と「認証トークンの検証」の雰囲気をコードで見てみましょう!

実務でそのままコピー&ペーストして微調整できるよう、日本語のコメントを丁寧に記載しています。

# /etc/nginx/nginx.conf の設定例

http {
    # 1. レート制限の定義(IPアドレス単位で、1秒間に許可するリクエスト数を「10回」に制限)
    # zone=api_limit:10m は、IPアドレスの状態を保持するメモリ領域を10メガバイト確保するという意味です。
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    server {
        listen 80;
        server_name api.example.com;

        # すべてのAPIリクエストの入口
        location /api/v1/ {
            
            # 2. レート制限の適用
            # burst=20 は「ちょっとくらい急な連打(10回を超えた分)が来ても、最大20回までは順番待ち(バースト)として受け付けますよ」という優しい設定です。
            # nodelay をつけると、待ち時間なしで即座にエラー(503)を返すかどうかの挙動が変わります。
            limit_req zone=api_limit burst=20 nodelay;

            # 3. 認証・認可(トークンチェック)のイメージ
            # 本来はここでLuaスクリプトやauth_requestモジュールを使い、
            # ヘッダーに含まれる Authorization: Bearer <トークン> が有効かOAuthサーバーに問い合わせます。
            # 今回はダミーとして、Authorizationヘッダーの存在をチェックする例を記載します。
            
            if ($http_authorization = "") {
                return 401 "{\"error\": \"Unauthorized: 認証トークンが必要です\"}";
            }

            # 4. 認証・レート制限をクリアした安全なリクエストだけを、奥のバックエンドサーバー(コンテナ等)へ転送
            proxy_pass http://backend-app-cluster;
            
            # プロキシ時のヘッダー引き継ぎ
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

設定のポイント

  • limit_req_zone で「誰からのアクセスを」「どれくらいのペースで制限するか」を定義しています。
  • if ($http_authorization = "") の部分で、合鍵(アクセストークン)を持っていない不審な客をバッサリと 401 Unauthorized で追い返しています。

—

5. 防御ヘッダーとエラー応答の重要性

レート制限に引っかかったり、認証に失敗したりした際、APIゲートウェイはきちんとした「合図(レスポンスヘッダーやステータスコード)」をクライアントに返す必要があります。

特に、レート制限(スロットリング)を発動した際には、親切なAPIであることを示すために、以下のようなどこまで待てばいいのかを伝えるカスタムヘッダーを返すのがモダンな開発の作法です。

  • Retry-After: あと何秒待てば再度リクエストしてよいかの秒数
  • X-RateLimit-Limit: 制限の上限回数
  • X-RateLimit-Remaining: 残りのリクエスト可能回数

これらを適切に返すことで、正当なアプリ開発者にとっても「あ、今ちょっとアクセスしすぎちゃったんだな、少しプログラムのスパム的なループを直そう」と気づきを与えることができます。

—

まとめ:一歩ずつ、堅牢なシステムを作っていこう

今回は、APIゲートウェイにおける認証・認可(OAuth 2.0 / OIDC)と、レート制限によるサーバー防衛の仕組みを、マンションのオートロックやラーメン店の行列に例えて解説しました。

  • 認証・認可で「誰が来ていて、何をしていい人か」を厳しくチェックする。
  • レート制限で、想定外の大量アクセスやボットの攻撃からサーバーの身を守る。

セキュリティの世界は広く、覚えることも多いですが、一つひとつの仕組みは私たちの日常のルールととてもよく似ています。「どうすれば泥棒に入られにくいか」「どうすれば正当なユーザーが快適に過ごせるか」というおもてなしの心を持って設計すれば、必ず堅牢で美しいシステムが作れます。

一歩ずつ、確実に知識と実装を自分のものにしていきましょう!それでは、また次のセキュリティ解説でお会いしましょう。

コメント

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