【Laravel】SSL通信に設定する/419エラーになったら確認すること

もくじ

cookieの確認

SSL通信に設定するとhttpsでのアクセスに限定し、cookieのsecure属性にチェックがつきます。

例えばLaravelの公式ドキュメントもSSL通信なので参考にしてcookieを見てみます。デベロッパーツールで確認できます。今回はChromeなのでF12を押すかOption + ⌘ + iを押します。

  1. Applicationタブを開きます
  2. cookieのURLを選択します
  3. secure属性を確認します

f:id:bonoponz:20210205201005p:plain

チェックがついていますね。SSL通信でありセキュアなことがわかります。

SSL通信の設定

LaravelをSSL通信の設定をします。下記のように追記または変更します。どちらか一方だけで大丈夫です。

パターンA:/config/session.phpを変更

'secure' => true,

開発環境だろうが本番環境だろうが、いついかなる時もSSL通信だ!って場合はこちらですね。

まぁローカルだとSSL通信は叶いませんが。

パターンB:.envファイルに追記

SESSION_SECURE_COOKIE=true

.envファイルを更新したらキャッシュをクリアします。

$ php artisan config:clear

本番環境ではSSL通信にするけど開発環境(ローカル)ではSSLにしないよ!って場合は環境変数で設定する必要があるので.envファイルを変更します。

その理由についてはこちら。

bonoponz.hatenablog.com

httpsでアクセス

開発中だとhttpsにアクセスできないので、ここではngrokというサービスを利用します。

bonoponz.hatenablog.com

419エラーが返ってくる

IDパスワードを入力してログインするようなサイトの場合、SSLでアクセスすると419エラーになります。

f:id:bonoponz:20201022151235p:plain

Laravelで419が返ってくる要因は、POST通信の際のCSRFクロスサイトリクエストフォージェリ)対策ができていないことです。しかし、私の場合きちんと対策していたためなぜこのエラーになるのか不明でした。

信頼できるプロキシを指定

調べていくと、どうやらIPアドレスに対してプロキシの信頼が得られていないためにエラーとなって返ってくるようです。

全プロキシを指定

App\Http\Middlewar\TrustProxies.phpTrustProxiesクラスで設定を変更します。

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies = '*'; // ここ

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

全てのプロキシを信用するために*を使います。

個別でプロキシを指定

信用できるプロキシが限定されていれば、IPアドレスで指定してもOKです。

class TrustProxies extends Middleware
{
    /**
     * このアプリケーションで信用するプロキシ
     *
     * @var string|array
     */
    protected $proxies = [
        '192.168.1.1',
        '192.168.1.2',
    ];

    /**
     * プロキシを検出するために使用するヘッダ
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

これによりエラーもなく無事SSL通信になりました。

どなたかのお役に立てれば幸いです。

参考URL

Laravelでセッションの Cookie をセキュアに配信する - Larapet

SESSION_SECURE_COOKIE for?

HTTPリクエスト 7.x Laravel

HerokuにデプロイしたLaravelアプリのアセットのURLをhttpsにする手順 – hrendoh's tech memo

Amazon CloudFrontを経由したLaravelがHTTPSにならないとき | 株式会社LIG