Webセキュリティ入門:HTTP・Cookie・脆弱性
CookieのSecure・HttpOnly・SameSite属性
この回でやること
CookieのSecure・HttpOnly・SameSite属性で、読まれ方と送られ方を絞ります。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
Cookie の属性は、その値がどこへ送られ、誰に読まれるかを絞るための指定です。HttpOnly、Secure、SameSite の3つが、それぞれ何を止めるのかを確かめます。
読み終えるころには、セッション Cookie に付けるべき属性を挙げられます。
主な属性
| 属性 | 効果 | 防ぐもの |
|---|---|---|
HttpOnly | JavaScript から読めなくする | スクリプト経由の持ち出し |
Secure | HTTPS のときだけ送る | 暗号化されない経路への流出 |
SameSite | 別サイト起点の要求で送らない | 別サイトからの操作 |
Domain / Path | 送る範囲を絞る | 不要な相手への送信 |
Max-Age / Expires | 期限を決める | 残り続けること |
HttpOnly
ページに他人のスクリプトが入り込んだとき、まず狙われるのがセッションの値です。HttpOnly を付けると JavaScript から読めなくなります。
読めなくなるだけで、要求には今までどおり自動で付きます。ログイン状態は保たれたまま、持ち出しだけが止まります。付けない理由がある場面は、ほとんどありません。
Secure
Secure を付けると、HTTPS でないときは送られません。付けないと、何かの拍子に平文で接続したときに値が流れます。
SameSite
別サイトを起点にした要求で Cookie を送るかどうかを決めます。
Strict別サイトからの遷移では送らない。もっとも厳しいLax通常のリンク遷移では送るが、書き込み系では送らないNone常に送る。Secureが必須
前に見た「Cookie が自動で付く」問題に、直接効く属性です。ただしこれだけに頼らないのが原則です。ブラウザによって扱いに差が出ることがあり、ブラウザ以外からの要求には効きません。
属性は層のひとつ
どれも「これを付ければ大丈夫」ではありません。ひとつが破られても次で止まるようにするための層です。Defense in Depth の考え方がここでも効きます。
範囲と期限
Domain を広く取ると、サブドメインにも送られます。必要な範囲だけに絞ります。 期限も、用途に対して長すぎないようにします。