CSRF対策
Webの規格であるSameSite属性について。
旧来のブラウザでは、Webページから別のドメイン(別のサイト)に対してGETやPOSTを発行した場合、現在いるページがどこか関係なくリクエストに対してそのドメイン用のCookieをつけてしまう。これにより、攻撃者のページからユーザーがログイン済みの別サイトにリクエストを送り勝手に操作ができてしまう。これをCSRF攻撃と呼ぶ。
対策法はいくつかある。
Referを確認する
サーバー側でリファラを見れば、開いているページがどこかわかるため、自サイトか他サイトか判別できる。
トークンを使う
POSTなどする前にWebページか一時的なトークンを発行し、それを使わないとリクエストをする。
これにより、何らかの形でトークンを取得する(GETしてスクレイピングする)必要があるが、fetchやxmlhttprequestは他サイトに対して実行しても結果は取得できないため、結果として攻撃が防げる。
SameSite ←最近できたやつ
現在開いているサイトとは別のサイトにリクエストを飛ばす場合、そもそもCookieを送らないという選択ができる。
Cookieの属性にSameSiteという概念を追加する。SameSite=laxかSameSite=Strictを設定されたCookieは、他のサイトからそのCookieの主のサイトにリクエストを飛ばされても、ブラウザはCookieを付随させない。
laxはPOST・XHR・iframe・<img src=??>のみ禁止される。strictはそれらに加えてGETも禁止される。
SameSite=Noneは従来のブラウザ通りの振る舞い(全て許可)をする。
Chromeでは、Noneを使う時にはSecure属性(https時のみCookieを扱い、httpでは送らない)が必須となる。