Cookie・CORS・CSP・CSRF - セキュリティ

最終更新日: 2026-07-25

TOP(About this memo)) > 一覧(セキュリティ) > Cookie・CORS・CSP・CSRF

クロスサイトスクリプティング(XSS)

サーバーとのやりとり

JavaScriptでの保存

ITP(Intelligent Tracking Prevention)

(参考) Googleのプライバシー対応の年表

サードパーティCookie以外も含めた、モバイル領域でのGoogleのプライバシー対応の経緯。

クロスドメイントラッキング

セッションIDをパラメータに載せて引き継ぐ方法

CORS(Cross-Origin Resource Sharing)

CORSプリフライト

CORS設定だけでは不十分なケースがある

CSP(Content Security Policy)

CSRFとは

サイトを跨いだリクエストの偽造。正規のサイト以外から利用者を騙してリクエストを偽造して送らせるケースはCSRFと考えてよい。

Cookieと一緒にCSRFの話が出てくることが多いのは、Cookieの仕組み自体がCSRFの温床になりやすいため。Cookieはドメインに紐づいてリクエストへ自動的に付与されて送信される仕組み上、別のサイトからでもセッションを持ったPOSTやGETが実行できてしまう(もしこれができないと、別サイトへ遷移するたびに未ログイン状態になってしまい利便性が悪くなる)。

CSRFトークン

昔からあるCSRF対策。サーバーがページを返す際に予測できないトークンをformに埋め込んでおき、受け取ったリクエストでそのトークンを検証する。これにより、外部からのリクエストはCSRFトークンを用意できないため防ぐことができる。

現在のCSRF対策

OriginヘッダーのチェックとSameSite属性の設定で基本的にはカバーできる(CSRFトークンを別途使う必要は薄い)。

Originヘッダー

ブラウザはform送信の際にOriginヘッダーを付与している。これをチェックすることで、正規のサイトからのリクエストかどうかを判定できる。

SameSite属性

Cookieを送信する範囲を指定できる属性。Lax(異なるサイトからの場合はGETのときだけ送信)に設定するのがちょうどよい落とし所になりやすい。ブラウザによってデフォルト値が異なるため、明示的に設定しておくことが望ましい。なお、GETに関してはSameSite=Laxでも送られてしまうため、GETリクエストでデータの変更などを発生させないよう注意する(通常はそのような実装はしないが)。

別サイトへのGETやPOST

HTMLのaタグやimgタグなどはGETできる。formはPOSTもできる。これらのレスポンス結果をJSから読むことはできない。JSでのfetchなどは、CORSで許可されている場合のみ実行できる。ただしdocument.forms[0].submit()のようにformを自動送信したり、window.location.href = "https://example.com"としたりすることで、間接的にGETやPOSTを発生させることは可能。

SPAではCSRFは可能か

認証が必要なURLの場合、ローカルストレージなどにアクセストークンを保存する構成であれば、その部分に関してCSRFは原理的に成立しない(ローカルストレージは別ドメインから読み取れないため)。一方、認証不要なURLに対しては、SPAかどうかに関係なくCSRFの可能性はある。

ローカルストレージへのアクセストークンの保存

基本的にはNGとされており、適切に設定されたCookie(SameSiteHttpOnlyの設定に加え、Originヘッダーのチェックや適切なCORS設定も併用)の方が好ましいとされる。XSS攻撃が埋め込まれた場合、ローカルストレージへアクセスされて窃取されるリスクが上がるため。XSS対策を万全にしておくのは当然として、例えば外部ライブラリの脆弱性のように自分では制御しきれないリスクも考慮し、多層的に防御しておくのが基本になる。

CSRFに関する考慮例

(実例) OAuth連携(Slack等)でのstateパラメータ設計

外部サービス(例: Slack)とのOAuth連携を自作サービスに組み込む際のCSRF対策の考え方の例。

フロー

サーバー側で「どのユーザーか」を判定する必要がある

stateに渡す値

その他考えられる攻撃

ワンタイムトークンの生成方法

セッションハイジャックの例