0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Day18 — APIのRate Limit(アクセス制限)を実装してみる

0
Last updated at Posted at 2025-12-17

はじめに

Day17 では、

✅ CSRF 攻撃の仕組み
✅ なぜ JWT(API) では CSRF が不要なのか

を理解しました。

しかし、API セキュリティには もう一つ大きな穴 があります。

❓「同じ API を 1 秒に 1 万回叩かれたらどうなる?」

今日はこれを防ぐ
👉 Rate Limit(レート制限)
を扱います。

今日のゴール

・Rate Limit が必要な理由を説明できる

・Laravel の Rate Limit 仕組みを理解する

・API にアクセス制限を実装できる

・429 エラーの意味が分かる

Rate Limit とは?

Rate Limit とは、

一定時間内に許可するリクエスト回数を制限する仕組み

目的は主にこの3つ。

・サーバ負荷対策

・不正アクセス防止

・API の公平利用

Rate Limit が無いと起きること

・ブルートフォース攻撃

・BOT による連打

・DoS 攻撃の踏み台

・サーバダウン 💥

👉 認証があっても安全ではない

よくある Rate Limit 例

API 制限例
ログイン 5回 / 分
一般API 60回 / 分
検索API 30回 / 分

HTTP ステータスコード 429

Rate Limit に引っかかると返るのがこれ。

429 Too Many Requests

レスポンス例:

{
  "message": "Too Many Attempts."
}

Laravel の Rate Limit 仕組み

Laravel では
👉 Throttle ミドルウェア
が用意されています。

基本構文

throttle:回数,

例:

throttle:60,1

1分間に60回まで

実装①:ルート単位で制限

Route::middleware('throttle:60,1')->group(function () {
    Route::get('/posts', ...);
});

実装②:ログインAPIを厳しく制限

Route::post('/login')
    ->middleware('throttle:5,1');

👉 1分5回まで

ユーザー単位の Rate Limit

Laravel は
IP + ユーザーID
を自動で識別します。

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by(
        $request->user()?->id ?: $request->ip()
    );
});

Rate Limit を試してみる

1.Postman で API を連打

2.しばらくすると…

429 Too Many Requests

🎉 正常に防御できています

Rate Limit ヘッダーを見る

レスポンスヘッダー:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Retry-After: 30

👉 フロントで制御可能

フロント側での活用

if (response.status === 429) {
  alert('アクセスが集中しています。しばらくお待ちください');
}

よくある設計ミス

全 API を同じ制限

・ログインも投稿も同じ
→ UX 悪化

制限が緩すぎる

throttle:10000,1

→ ほぼ意味なし

制限が厳しすぎる

throttle:3,1

→ 普通の操作で弾かれる

Rate Limit 設計のコツ

・ログイン系は厳しく

・一覧取得は緩め

・書き込み系は中程度

・ユーザー体験も考慮

JWT × Rate Limit の相性

・認証済ユーザー単位で制御

・悪質ユーザーを局所的に遮断

・API 全体が安定する

今日のまとめ

・Rate Limit は API 防御の必須要素

・429 は正常なエラー

・Laravel は Throttle で簡単実装

・ルートごとに制限を変える

・認証があっても Rate Limit は必要

次回 Day19

ここから 実践アプリ編 に入ります 🚀

** Day19 — アプリ設計:API仕様書を作ってみよう(エンドポイント一覧)**

「いきなり作らない」
設計から始める API 開発 をやります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?