Mímisbrunnr知恵の泉

← サイバーセキュリティ 一覧

🎓 レベル:標準 | 重要度:A(必須) 📎 前提:セッションとトークン(JWT)

要点(BLUF)

概念:理屈と実装のギャップ

第3章で「ソルト付き低速 KDF」「JWT の署名検証」を学びました。しかし実装で Cookie 属性を付け忘れる、自動エスケープを切る、といった小さな漏れが、せっかくの設計を無効化します。アプリセキュリティの事故は派手な攻撃よりも、こうした実装の取りこぼしから起こります。ここでは代表的な勘所を押さえます。

仕組み:Cookie の安全属性

セッション ID やトークンを Cookie に置くなら、最低限この3属性を設定します。

属性効果防ぐもの
HttpOnlyJavaScript から読めなくするXSS による Cookie 窃取
SecureHTTPS のときだけ送信平文回線での盗聴
SameSite別サイトからの送信を制限CSRF(Lax/Strict)

加えて、Domain/Path を絞り、有効期限を適切にし、ログアウトで確実に無効化します。トークンを localStorage に置くと JS から読めて XSS に弱いので、HttpOnly Cookie が安全寄りです(セッションとトークン(JWT))。

仕組み:XSS と CSRF は別の問題

混同されがちですが、原因も対策も異なります。

flowchart TD
    subgraph XSS["XSS:スクリプトが混入して実行"]
        X1["原因:出力エンコード不足"] --> X2["対策:出力エンコード+CSP+HttpOnly"]
    end
    subgraph CSRF["CSRF:意図しない操作を誘発"]
        C1["原因:リクエストの真正性を確認せず"] --> C2["対策:CSRFトークン+SameSite"]
    end

仕組み:セッションのライフサイクル

防御側の使い方/設定

なぜ安全か:理屈を実装の既定で守る

これらが効くのは、正しい設計を「既定値」として実装に固定するからです。HttpOnly は XSS が起きても Cookie 窃取を防ぎ、Secure は回線盗聴を防ぎ、SameSite と CSRF トークンは「本人のブラウザだが本人の意図ではない」リクエストを弾きます。どれも一行の設定ですが、抜けると設計全体の保証が崩れます。実装の既定で守ることが、人的ミスに強い防御です。

仕組みの直観

セッションの実装は入館証の運用です。理屈(本人確認の仕組み)が立派でも、入館証を落としても誰でも拾って使える(属性漏れ)、別人が「これを使え」と渡した札で入れてしまう(固定化)、よそのビルの依頼状で勝手に手続きが進む(CSRF)――こうした運用の穴で台無しになります。属性を固め、入館のたびに新しい札を発行し、手続きには本人発行の合言葉(CSRF トークン)を要求する、という運用の徹底が安全を作ります。

⚠️ よくある誤解・設定ミス

対応 lab

ブラウザ挙動が前提のため実行 lab は置きません。トークン側の検証は security-study/labs/jwt_verify_demo.py、保存側は password_hashing_demo.py が対応します。

関連