RateLimit trong Laravel là một tính năng cho phép bạn giới hạn số lượng yêu cầu được gửi đến ứng dụng của bạn từ một địa chỉ IP hoặc một người dùng cụ thể trong một khoảng thời gian nhất định.
Chức năng này được sử dụng để ngăn chặn các cuộc tấn công từ một địa chỉ IP hoặc người dùng cố gắng gửi quá nhiều yêu cầu trong một khoảng thời gian ngắn.
RateLimit được sử dụng để bảo vệ ứng dụng của bạn khỏi các cuộc tấn công DDOS hoặc thực hiện quá nhiều yêu cầu từ một người dùng cụ thể trong một khoảng thời gian ngắn.

Laravel: RateLimit là gì? Cách sử dụng RateLimit
Ví dụ, nếu một người dùng cố gắng gửi quá nhiều yêu cầu đến ứng dụng của bạn trong một khoảng thời gian ngắn, bạn có thể sử dụng RateLimit để chặn những yêu cầu này và bảo vệ ứng dụng của bạn khỏi các cuộc tấn công này.
Hoặc đôi khi chúng ta muốn giới hạn truy cập của 1 IP hoặc tài khoản nào đó thì có thể sử dụng RateLimit: Ví dụ như khi bán hàng, số lượng sản phẩm có hạn mà nhiều người mua, trong khi ta muốn mỗi người mua 1 cái thì cũng có thể kết hợp sử dụng ratelimit
RateLimit hoạt động như thế nào?
- Xác định key: Đầu tiên, Laravel sẽ xác định key của yêu cầu dựa trên địa chỉ IP của người dùng hoặc một thuộc tính của người dùng. Key này sẽ được sử dụng để xác định xem yêu cầu này có vượt quá giới hạn được phép hay không.
- Kiểm tra giới hạn: Sau đó, Laravel sẽ kiểm tra xem yêu cầu này đã vượt quá giới hạn được phép hay không. Nếu yêu cầu này đã vượt quá giới hạn, Laravel sẽ trả về một lỗi HTTP 429.
- Thiết lập giới hạn: Nếu yêu cầu này chưa vượt quá giới hạn, Laravel sẽ tăng số lượng yêu cầu được gửi từ địa chỉ IP hoặc người dùng cụ thể đó và lưu trữ nó trong một kho lưu trữ được thiết lập trước đó, như Redis hoặc database. Bạn có thể thiết lập số lượng yêu cầu được phép và khoảng thời gian giữa các yêu cầu trong file cấu hình của Laravel.
- Trả về kết quả: Cuối cùng, Laravel sẽ trả về kết quả của yêu cầu cho người dùng.
Để sử dụng tính năng RateLimit trong Laravel, bạn có thể sử dụng middleware “throttle”. Middleware này được sử dụng để áp dụng giới hạn tốc độ cho các yêu cầu HTTP. Bạn có thể áp dụng middleware throttle cho một nhóm route hoặc cho một route cụ thể.
Ví dụ cụ thể
Ví dụ, để áp dụng giới hạn tốc độ cho tất cả các route trong nhóm “api”, bạn có thể thêm middleware throttle vào trong phương thức boot() của RouteServiceProvider như sau:
public function boot()
{
parent::boot();
Route::middleware('api')->throttle(60, 1)->group(function () {
Route::get('/users', 'UserController@index');
Route::post('/users', 'UserController@store');
// ...
});
}
Trong ví dụ trên, middleware throttle được áp dụng cho tất cả các route trong nhóm “api”. Tham số đầu tiên của phương thức throttle() là số lượng yêu cầu được phép trong một khoảng thời gian nhất định (ở đây là 60 yêu cầu trong 1 phút). Tham số thứ hai là khoảng thời gian giữa các yêu cầu (ở đây là 1 giây).
Nếu một người dùng cố gắng gửi quá nhiều yêu cầu trong một khoảng thời gian nhất định, middleware throttle sẽ trả về một lỗi HTTP 429 “Too Many Requests”.
Ngoài ra, bạn có thể tùy chỉnh thông báo lỗi được trả về khi quá giới hạn yêu cầu bằng cách sử dụng phương thức response() của middleware throttle.
Ví dụ:
Route::middleware('api')->throttle(60, 1)->response(function () {
return response()->json(['message' => 'Quá nhiều yêu cầu. Vui lòng thử lại sau.'], 429);
})->group(function () {
Route::get('/users', 'UserController@index');
Route::post('/users', 'UserController@store');
// ...
});
Trong ví dụ trên, phương thức response() được sử dụng để trả về một thông báo lỗi JSON khi quá giới hạn yêu cầu.
Tham số đầu tiên của phương thức response() là một hàm callback trả về phản hồi của lỗi, và tham số thứ hai là mã HTTP của phản hồi (ở đây là 429).
Bạn cũng có thể sử dụng middleware throttle cho một route cụ thể bằng cách sử dụng phương thức middleware() của đối tượng Route. Ví dụ:
Route::get('/users', 'UserController@index')->middleware('throttle:60,1');
Trong ví dụ trên, middleware throttle được áp dụng cho route “/users” với giới hạn tốc độ là 60 yêu cầu trong 1 phút và khoảng thời gian giữa các yêu cầu là 1 giây.
Bạn cũng có thể sử dụng tên khóa trong cấu hình để thiết lập giới hạn tốc độ cho middleware throttle. Ví dụ:
Route::get('/users', 'UserController@index')->middleware('throttle:api');
Trong ví dụ trên, middleware throttle được áp dụng cho route “/users” với giới hạn tốc độ được thiết lập trong khóa “api” trong cấu hình.
Để tùy chỉnh cấu hình của middleware throttle, bạn có thể sử dụng phương thức throttle() trong tệp cấu hình config/ratelimit.php. Ví dụ:
return [
'defaults' => [
'throttle:10,1',
'expires:5',
],
'api' => [
'throttle:60,1',
'expires:60',
],
];
Các tham số để cấu hình Rate Limiting
Các tham số để cấu hình Rate Limiting trong Laravel bao gồm:
driver
: Đây là driver sử dụng để lưu trữ thông tin Rate Limiting. Laravel hỗ trợ 3 driver làarray
,redis
, vàmemcached
.requests
: Số lượng request tối đa được phép trong khoảng thời gianseconds
.decay_seconds
: Thời gian đợi để reset lại số lượng request sau khi đã đạt được giới hạnrequests
.prefix
: Tên prefix được sử dụng để định danh các tham số Rate Limiting cho từng client.cache
: Tên cache store sử dụng để lưu trữ thông tin Rate Limiting. Giá trị mặc định làdefault
cache store.enabled
: Tham số này quyết định xem Rate Limiting có được kích hoạt hay không. Giá trị mặc định làtrue
.
Ví dụ, để cấu hình Rate Limiting trong Laravel với driver Redis, giới hạn 100 request trong vòng 60 giây và thời gian đợi để reset là 1 giờ, ta có thể sử dụng mã sau:
'api' => [
'driver' => 'redis',
'requests' => 100,
'decay_seconds' => 3600,
'prefix' => 'rate-limit',
],
Trên đây là một vài giới thiệu về RateLimit trong Laravel và một số ví dụ về cách thức sử dụng chúng. Nếu bạn có nhu cầu muốn sử dụng theo cách nào khác nữa thì hãy trao đổi cùng mọi người thêm nhé