Dev Study
← 研修トップ

Webセキュリティの実務

Cookie は誰が頼んだかに関係なく付いていきます。ブラウザが止めるのは読むことで、送ることではありません。CSRF・XSS・SameSite・CORS・CSP・セッション・OAuth/OIDC を、ブラウザが何を強制し、何をサーバに任せているかの境目から見直します。攻撃の手順は扱いません。仕様の文言と、手元に立てたサーバの実測から積み上げます。

  1. 1
    Cookie は、頼んだページに関係なく付いていく — ambient authority
    ブラウザが Cookie を付けるかどうかは、送り先と Cookie の属性で決まります。要求を起こしたページが誰かは、判定の主役ではありません。自前サーバの実測では、a.test のページから送ったフォームの POST に、b.test の Cookie が付きました。
    約 9 分
  2. 2
    単純な要求で CORS が止めるのは、送ることではなく読むこと
    CORS エラーは「要求が届かなかった」という意味ではありません。単純な要求なら、サーバには届いて処理され、ブラウザはその応答をスクリプトに渡さないだけです。
    約 9 分
  3. 3
    プリフライトの線は、フォームが送れた範囲に引かれている
    別オリジンへの要求のうち、事前確認(プリフライト)が付くのは一部だけです。Fetch Standard はその線を「HTML のフォーム要素でできる範囲より込み入った要求」と書いており、事前確認なしで送られるメソッドと Content-Type は、フォームが送れる範囲とほぼ重なります。
    約 9 分
  4. 4
    SameSite の判定単位は site — 兄弟サブドメインは同じ側にいる
    SameSite が比べるのは origin ではなく site(scheme + registrable domain)です。`https://a.example.test` と `https://b.example.test` は origin が違っても同じ site なので、手元の実測では3エンジンとも、兄弟から来た POST に `SameSite=Strict` の Cookie が付きました。
    約 8 分
  5. 5
    CSRF の防御は、別サイトのページが作れない信号を渡すこと
    このコースの芯は「ブラウザが確かめられるのは『どこから来たか』までで、『本人が望んだか』はサーバが自分で確かめるしかない」です。CSRF の防御はこの境目にあり、サーバは Cookie ではなく、別サイトのページには作れない信号を要求の中から探して照合します。
    約 9 分
  6. 6
    注入されたスクリプトは、そのオリジンそのものとして動く — HttpOnly が守るもの
    ブラウザが確かめられるのは「どこから来たか」までです。ページの中で動くスクリプトは、誰が書いたものであれ、そのオリジンから来たものとして扱われます。HTML の定義は、同じオリジンの行為者を `the same authority` を持つものと前提しています。
    約 9 分
  7. 7
    サーバに届かない経路 — フラグメントとシンク
    URL の `#` 以降(フラグメント)は仕様上リクエストに載りません。サーバのログにも、要求を検査する WAF にも現れませんが、ページ内のスクリプトからは読めます。
    約 9 分
  8. 8
    CSP は注入を止めない — 起きたあとに、実行してよいものへ印を付ける
    CSP の仕様は、CSP を注入に対する最初の防御線ではなく、注入が起きたときの被害を減らす多層防御だと自ら書いています。
    約 8 分
  9. 9
    セッションIDは参照にすぎない — Cookie を消しても表の行は残る
    セッションIDはサーバの表の1行を指す参照です。Cookie を消させても、表の行が残っていれば、同じ値を持つ要求はまだ通ります(自前サーバと curl をブラウザ役にした実測)。
    約 9 分
  10. 10
    OAuth がリダイレクトで運ぶのは、アクセストークンではなくコード
    ブラウザが確かめられるのは「どこから来たか」までで、「本人が望んだか」はサーバが自分で確かめるしかありません。OAuth の認可コードフローはこの前提どおりに作られていて、ブラウザを通る経路には短命で1回限りの認可コードだけを載せ、アクセストークンはクライアントと認可サーバの直接の通信で受け渡します。
    約 9 分
  11. 11
    PKCE は先にハッシュを約束し、後で原像を見せる
    認可コードはリダイレクトでブラウザを通って運ばれます。ブラウザは、そのコードを受け取った者が要求を始めた当事者かどうかを確かめません。確かめるのはサーバの側で、PKCE ではそれを認可サーバが担います。
    約 9 分
  12. 12
    ID トークンには宛先がある
    ID トークンの署名が正しいことは、本物の発行者が出したことを示すだけで、自分に宛てて出したことは示しません。OpenID Connect Core は、aud に自分の client_id が無いトークンを MUST で拒否させます。
    約 8 分