はじめに
Laravel のルーティングファイルについて、何気なく触っていたので備忘録として残します。
※Laravel8 を使用
対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
ルーティングファイルの種類
- web.php
- api.php
違いについて
web.php
デフォルトでCSRF保護の機能が有効になっているため、外部から POST することができない。
api.php
CSRF保護が有効になっていないため外部から POST ができる。
詳細
kernel.php に web.php と api.php のそれぞれの設定がミドルウェアとして組み込まれています。
デフォルトでは下記の通りの設定となっており、api.php にはVerifyCsrfToken
が入っていないため CSRF保護が機能しておりません。
kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
/* CSRF保護 */
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
検証
実際にどのような動きになるのか curlコマンドを使用して検証してみます。
web.php の場合
事前準備としてエンドポイントを設定します。
- ルーティング
web.php
Route::post('/test', [TestController::class, 'test']);
- コントローラーはリクエストをそのまま返却する処理とします
TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
function test(Request $request)
{
return $request;
}
}
curl -X POST -H "Content-Type: application/json" -d '{"name":"太郎"}' http://localhost:8000/test
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page Expired</title>
CSRF保護の機能が有効になっているため、「Page Expired」が表示されています。
api.php の場合
上記と同様に事前準備としてエンドポイントを設定します。
- ルーティング
web.php
Route::post('/test', [TestController::class, 'test']);
- コントローラー
TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
function test(Request $request)
{
return $request;
}
}
curl -X POST -H "Content-Type: application/json" -d '{"name":"太郎"}' http://localhost:8000/api/test
POST /api/test HTTP/1.1
Accept: */*
Content-Length: 17
Content-Type: application/json
Host: localhost:8000
User-Agent: curl/7.64.1
{"name":"太郎"}
CSRF保護が有効になっていないため、外部からPOSTでアクセスできます。
おわりに
PHPのルーティングファイルについてまとめました。
CSRF保護のデフォルト設定が異なっており、主な使い分け方としては下記の通りとなります。
- web.php
画面に表示するようなルーティングを設定する場合に使用する - api.php
外部からの HTTP リクエストを受けて値を返却する場合に使用する