LaravelでSPA認証をするときに401(Unauthorized)がでた
LaravelでSPA認証をするときにいじったsession.phpのsame_site
題名にある通り、SPA認証をするときにCookieの発行がうまくできず苦しんだ時に調べたことを備忘録として残します。
フロントをNext.jsで作成したものをVercelにデプロイ
バックをLaravelで作成したものをさくらレンタルサーバーにデプロイ
認証周りが動かず、なんで!?ってなってたとき、このsame_siteが関係していました。
401エラー(Unauthorized)がでて苦しみました。
CORSの設定で手こずり、CSRFの設定で手こずってやっと繋がったと思ったら、ログインできない。
結論から言うと、session.phpのsame_siteがNoneになっていたのが問題だった。
same_siteをLaxにすると、正常に動き、認証周りが動きました。
same_siteの目的
簡単に説明すると遷移元が外部ドメインのリクエストの場合はCookieが送信されないように制御できるというもの。
これによりほとんどのCSRF攻撃を防ぐことが可能になる。
今回はVercelとさくらレンタルサーバーで非同期通信を行うので、別のドメインにリクエストを送るのに該当する。
same_siteにある3種類の属性
Lax
CrossSite のリクエストでは、Top Level Navigation 以外は Cookieを送りません。
別サイトからの選移でもログイン状態が維持できるため、既存のSession 管理にも導入しやすいです。
POST では Cookieが送られないため、CSRF 攻撃への耐性が高まります。
Strict
自分のサイト以外からの全てのリクエストを Cookieを送らなります。
強い制限である。
Session Cookie にこの属性を付与すると、例えば別のサイトからリンクで遷移した場合にも Cookie が送られなくな
30
別のサイトから遷移する場合は、毎回ログインが必要となるため、ユーザの利便性も考えると難しいです。
具体的にいうと開発者がフォームを作成する時CSRFトークンでのセキュリティ対策をすると419エラーが発生しますのでCSRFトークンを無効にする必要が出てきます。
None
Cookieを送る
今後セキュリティをあげないといけないのであまりおすすめできません。
Discussion