◀ 39.

Laravelにおけるクッキー(cookie)の設定と取得

▶
この記事の要点
  • 設定: response('...')->cookie('name', 'value', $minutes)、またはどこからでも使える Cookie::queue()
  • 取得: $request->cookie('name') または Cookie::get('name')
  • 有効期間の単位は「分」。削除は Cookie::expire('name') や withoutCookie('name')
  • Laravel が作る Cookie は既定で暗号化され、HttpOnly も付く。JavaScript から読みたい値は暗号化の対象外にする
  • セットした Cookie は次のリクエストから読める。同じリクエスト内では取得できない

Laravel で Cookie(クッキー)を設定・取得・削除する方法と、つまずきやすいポイントをまとめます。コード例は Laravel 11 以降(2026 年時点の最新は 13)を前提にしていますが、基本的な API は古いバージョンでもほぼ同じです。

設定(レスポンスに付ける)

最も基本的な方法は、レスポンスオブジェクトの cookie() メソッドで付ける方法です。

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

$minutes にはクッキーの有効期間を分単位で指定します。たとえば 1 日なら 60 * 24 です。ビューを返す場合やリダイレクトの場合も同様に付けられます。

return view('welcome')->cookie('theme', 'dark', 60 * 24 * 30);

return redirect('/home')->cookie('visited', '1', 60);

Cookie::queue でレスポンスを持っていない場所から設定する

サービスクラスやミドルウェアなど、レスポンスを直接返さない場所では Cookie::queue() を使います。キューに入れた Cookie は、最終的なレスポンスに自動で付与されます。

use Illuminate\Support\Facades\Cookie;

Cookie::queue('name', 'value', $minutes);

パス・ドメイン・Secure などを指定する

引数を追加すると、Cookie の属性を細かく指定できます。

return response('ok')->cookie(
    'name',      // 名前
    'value',     // 値
    60,          // 有効期間(分)
    '/',         // パス
    null,        // ドメイン(null ならリクエストのホスト)
    true,        // Secure(HTTPS のときだけ送信)
    true         // HttpOnly(JavaScript から読めない)
);

パス・ドメイン・Secure・SameSite を省略した場合の既定値は、config/session.php の path / domain / secure / same_site の設定から取られます。本番環境が HTTPS なら、.env で SESSION_SECURE_COOKIE=true にしておくと安全です。

取得

コントローラーでは、Request オブジェクトから取得します。

use Illuminate\Http\Request;

public function show(Request $request)
{
    $value = $request->cookie('name');

    // 存在しないときの既定値を指定
    $theme = $request->cookie('theme', 'light');
}

Request を受け取っていない場所では、Cookie::get('name') や request()->cookie('name') でも取得できます。いずれも、ブラウザから送られてきた現在のリクエストの Cookie を読みます。

削除

Cookie の削除は、同じ名前で有効期限切れの Cookie を送ることで行います。

// レスポンスに付けて削除
return response('ok')->withoutCookie('name');

// キューで削除
Cookie::expire('name');

設定時にパスやドメインを指定していた場合は、削除時も同じパス・ドメインを指定しないと消えません。

仕組み: Laravel の Cookie は暗号化されている

Laravel の web ミドルウェアグループには EncryptCookies ミドルウェアが含まれており、Laravel が発行する Cookie の値は APP_KEY を使って暗号化・署名されます。利用者が Cookie の値を書き換えても改ざんとして検出され、値は読めなくなります。

そのため、ブラウザの開発者ツールで見ると値は長いランダムな文字列になっています。JavaScript から読みたい Cookie(例: 画面表示の設定値)は、暗号化の対象から外します。Laravel 11 以降では bootstrap/app.php で指定します。

->withMiddleware(function (Middleware $middleware) {
    $middleware->encryptCookies(except: [
        'theme',
    ]);
})

Laravel 10 以前では、app/Http/Middleware/EncryptCookies.php の $except 配列に名前を追加します。さらに JavaScript から読むには、設定時に HttpOnly を false にする必要があります(既定は true)。

よくある落とし穴

  • 設定直後に読めない: Cookie はレスポンスと一緒にブラウザへ送られ、ブラウザが次のリクエストで送り返して初めて読める。同じリクエスト内で値を使いたい場合は変数で持ち回す
  • routes/api.php で読めない・値が暗号文のまま: api ルートには web グループのミドルウェア(EncryptCookies など)が適用されないため、web 側で暗号化された Cookie は復号されない
  • APP_KEY を変えたら Cookie が消えた: 暗号化キーが変わると既存の Cookie は復号できず、ログイン状態なども失われる
  • 有効期間を秒で指定してしまう: PHP の setcookie() は有効期限を UNIX 時刻(秒)で指定するが、Laravel は分。3600 を渡すと 60 時間になる
  • 大きなデータを入れる: Cookie は 1 つあたりおおむね 4KB までが目安で、暗号化するとサイズが増える。大きなデータはセッションや DB に保存する
  • 個人情報を入れる: 暗号化されていても端末側に保存される。認証情報や個人情報は Cookie に直接入れない

確認方法

  1. ブラウザの開発者ツールの「Application」(Firefox は「ストレージ」)→ Cookies で、名前・有効期限・HttpOnly・Secure・SameSite を確認する
  2. 「Network」タブで、レスポンスヘッダに Set-Cookie が出ているか、次のリクエストヘッダに Cookie が含まれているかを見る
  3. コントローラーで dump($request->cookies->all()) を実行し、復号後の値を確認する

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)