カテゴリ: Laravel 更新日: 2026/04/11

LaravelのCSRFトークンとは?フォームのセキュリティ対策

LaravelのCSRFトークンとは?フォームのセキュリティ対策
LaravelのCSRFトークンとは?フォームのセキュリティ対策

先生と生徒の会話形式で理解しよう

生徒

「先生、Laravelでフォームを作るときによく@csrfって書きますけど、これは何ですか?」

先生

「これはCSRFトークンと呼ばれるもので、フォームを安全に送信するための仕組みです。」

生徒

「CSRFってなんですか?」

先生

「CSRFはクロスサイトリクエストフォージェリの略で、悪意のある第三者があなたのサイトに不正なリクエストを送る攻撃のことです。例えば、ログインした状態のサイトで勝手に操作されてしまうリスクがあります。」

生徒

「なるほど、安全にフォームを送るための仕組みなんですね。」

1. CSRFトークンの基本

1. CSRFトークンの基本
1. CSRFトークンの基本

LaravelでWebアプリケーションを作る際、セキュリティの要となるのが「CSRFトークン」です。これは、自分のサイトのフォームから送られたデータが、本当に自分のサイト内の画面から送信されたものかを証明するための「秘密の合言葉」のような役割を果たします。

プログラミングが初めての方でも、まずは「外部からの不正ななりすまし操作を防ぐためのスタンプ」だとイメージすれば分かりやすいでしょう。Laravelでは、フォームの中に@csrfという短い1行を書くだけで、この高度なセキュリティ機能が有効になります。

例えば、@csrfを記述したファイルがブラウザで表示されると、自動的に以下のような隠し入力フィールドが生成されます。


<input type="hidden" name="_token" value="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0">

このように、目には見えない場所で「a1b2c3...」といった複雑でランダムな文字列(トークン)が発行されます。ユーザーが送信ボタンを押すと、このトークンも一緒にサーバーへ送られます。サーバー側では「今、自分が発行した合言葉と同じかな?」と一瞬で照合を行い、一致した場合のみ処理を受け付けます。これにより、悪意のある第三者が勝手に外部からデータを送りつけようとしても、正しい合言葉を知らないため、システムが自動的にブロックしてくれる仕組みです。

2. Bladeでのフォーム作成とCSRFトークン

2. Bladeでのフォーム作成とCSRFトークン
2. Bladeでのフォーム作成とCSRFトークン

Laravelでユーザーから情報を受け取る画面(フォーム)を作る際は、resources/viewsディレクトリ内にBladeテンプレートファイルを作成します。初心者の方がまず覚えるべきは、POST送信を行うすべてのフォームに@csrfという記述を忘れないことです。

例えば、名前とメールアドレスを入力してもらう簡単な「お問い合わせフォーム」を作成する場合、コードは以下のようになります。


<form action="/contact" method="POST">
    @csrf
    <div style="margin-bottom: 10px;">
        <label for="name">名前:</label><br>
        <input type="text" id="name" name="name" placeholder="山田 太郎">
    </div>
    <div style="margin-bottom: 10px;">
        <label for="email">メールアドレス:</label><br>
        <input type="email" id="email" name="email" placeholder="example@mail.com">
    </div>
    <button type="submit">この内容で送信する</button>
</form>

このコードの中で、@csrfはたった1行ですが非常に重要な役割を持っています。もしこの記述を忘れてしまうと、Laravelはセキュリティ保護のために「419 | Page Expired」というエラー画面を表示し、データの送信を拒否してしまいます。

プログラミング未経験の方にとって「セキュリティ」と聞くと難しく感じるかもしれませんが、Laravelではこの@csrfと書くだけで、背後で複雑な認証処理をすべて代行してくれます。これにより、開発者はセキュリティの細かな仕様を気にすることなく、安心してフォーム機能の実装に集中できるのです。

ブラウザ上でこのフォームが表示される際、HTMLソースを確認すると、以下のようなトークンが自動的に埋め込まれていることがわかります。これが「正しい送信元である証」として機能します。


<input type="hidden" name="_token" value="R6m5P...(ランダムな英数字)">

3. CSRFトークンの仕組み

3. CSRFトークンの仕組み
3. CSRFトークンの仕組み

CSRFトークンはランダムな文字列で、ユーザーのセッションと紐付けられています。フォーム送信時にサーバーがこのトークンとセッション内の値を照合し、一致すれば正しいリクエストとして処理します。これにより、第三者が不正にフォームを送信しても弾かれる仕組みです。

4. CSRFトークンを手動で確認する方法

4. CSRFトークンを手動で確認する方法
4. CSRFトークンを手動で確認する方法

通常は@csrfで自動的にチェックされますが、APIやAjaxリクエストでトークンを手動で扱うこともあります。metaタグにトークンを埋め込み、JavaScriptで取得してリクエストヘッダーに追加する方法です。


<meta name="csrf-token" content="{{ csrf_token() }}">

<script>
    const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
    fetch('/contact', {
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': token,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ name: '太郎', email: 'taro@example.com' })
    });
</script>

5. CSRF対策のポイント

5. CSRF対策のポイント
5. CSRF対策のポイント
  • すべてのフォームに@csrfを必ず追加する
  • AjaxやJavaScriptで送信する場合は、ヘッダーにCSRFトークンをセットする
  • トークンはユーザーごとにランダムで生成されるため、使い回さない
  • POST以外のPUT、PATCH、DELETEリクエストでも@csrfが必要

これらを守ることで、Laravelのフォームを安全に運用でき、ユーザーの情報を守ることができます。

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelでバリデーションをテストする方法を完全解説!初心者でも安心のLaravelテスト入門
New2
CodeIgniter
CodeIgniterでフォームのバリデーションエラーを表示する方法!初心者向け徹底解説
New4
Symfony
Symfonyのコントローラで404・403エラーを制御する方法を初心者向けに解説!
人気記事
No.2
Java&Spring記事人気No2
Laravel
LaravelでReactコンポーネントを組み込む方法完全ガイド!JSX対応でフロントエンド連携を学ぼう
No.3
Java&Spring記事人気No3
CodeIgniter
CodeIgniterのCSRF対策を完全解説!フォーム処理のセキュリティ手順
No.4
Java&Spring記事人気No4
Laravel
Laravelのリレーションを使った検索条件の書き方(whereHas)
No.5
Java&Spring記事人気No5
Symfony
Symfonyでバリデーションをコントローラに組み込む方法を徹底解説!初心者にもやさしい入力チェックの基本
No.6
Java&Spring記事人気No6
Laravel
LaravelのRESTfulコントローラ設計のベストプラクティスを初心者向けにわかりやすく解説
No.7
Java&Spring記事人気No7
Laravel
Laravelのold()関数でフォーム再表示時に値を保持する方法
No.8
Java&Spring記事人気No8
Symfony
Symfonyのインストール方法!CLIとComposerの導入手順まとめ