【Laravel】Cookieが原因で419エラーが出た...

どーも!

たかぽんです!

今回はLaravelで色々作っているとたまに出てくる419のレスポンスエラーについてです!

419エラーって何?

さて、HTTPリクエストではそのレスポンスのステータスとして数字を返すようになっています。

そのレスポンスのステータスが419エラーなんですね。

レスポンスのステータスコードの種類に関しては以下を参考にしてみてください。

上記によると、400499はクライアントエラーになっていますね。

つまり、クライアント側からのレスポンスの送信が何かおかしいよ?っていう場合に帰ってくるコードになります。

今回は419で、上記の一覧にはなかったかと思います。

Laravelではcsrf関連で何かしら正しくない挙動をした場合にこのエラーコードを返すようになっています。

より正確には...

以下の"VerifyCsrfToken.php"のメソッドにてthrowされている例外がそれに当たります。


// Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php 
public function handle($request, Closure $next)
{
    if (
        $this->isReading($request) ||
        $this->runningUnitTests() ||
        $this->inExceptArray($request) ||
        $this->tokensMatch($request)
    ) {
        return tap($next($request), function ($response) use ($request) {
            if ($this->shouldAddXsrfTokenCookie()) {
                $this->addCookieToResponse($request, $response);
            }
        });
    }
    throw new TokenMismatchException('CSRF token mismatch.');
}

直前のifをみると、requestの読み込み、Unittestの確認、csrfのチェック例外でないかの確認、トークンが一致するか確認といったことを行っていますね。

そして上記で正しいリクエストだと判断したら、responseに対してトークンのCookieを追加しています。

csrfに関しての詳述は割愛します。

そのcsrfトークンを正しくやりとりできていない場合によく出てくるエラーが419エラーです。

主な原因

さて、それではこの419エラーの主な原因について...

まず、主な原因は先程行ったcsrfトークンをリクエスト送信時に付与できていないことが挙げられます。

公式からの引用にはなりますが、Laravelのbladeだと、以下のようにformの中でディレクティブ("@csrf"の箇所)を用いてcsrfトークンをリクエストと一緒に送ることができます。

<form method="POST" action="/profile">
    @csrf

    <!-- Equivalent to... -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

詳細については以下でご確認ください。

主な原因はこの"@csrf"をつけるだけで解決することが多いかと思います。

筆者の場合...

さて、それでは筆者の場合、手元のPCでは419エラーが出ませんでしたが、なぜかユーザーさんから419エラーが出てしまいます...というお問い合わせがきました。

原因として、csrf対策はできているので、トークンの期限切れ(大抵sessionの有効期限超過)が原因かなぁ?とおもって確認してもらいましたがどうやら違ったようで...

であればいったいなんなんだ...?と...w

正解はCookieでした。

先程のVerifyCsrfToken.phpをみていただければわかるかと思いますが、cookieをがっつり使っているので、ためしにcookieをブロックして試すと、419エラーが発生しました。

逆にcookieをブロックしていなければ419エラーはでませんでした。

cookieの設定は以下のようにブラウザの設定から大抵変更できると思います。

Chromeの場合

Braveの場合

Safariの場合

なるほど、これでも419帰ってくるのかぁ...と...

あんまりLaravelの裏側までみに行くことないのですが、しっかり理解しないといけないですね...

まとめ

さて、今回はCookieが起因の419エラーについて書いていきました。

そもそも419エラー似合うことが少ないとは思いますが、もし出たら確認してみるといいかもしれないですね....!

あとはどう言ったタイミングでCookieをブロックするんだろう...

だいぶんその他サービスも使えない状態になりそうだけど....

ただ、思いつくのはプライバシーをしっかりしたい...とかでしょうか?

cookieのセキュリティについてとかは全然調べたことないのでもしかしたら、cookieでデメリットもあるかもですね...! そのうちしっかり調べたい...!

皆さんももし419に出会って原因がわからん...!

となったら一度cookieをみてみるといいかもしれません...!

それでわ!

おすすめの記事