Secure フラグのない機密性の高い Cookie

Secure フラグのない機密性の高い Cookie

説明

認証トークン、セッション識別子、API キーなどを含む Cookie に Secure フラグがないと、HTTPS 以外の接続でも送信される可能性があります。ネットワーク上の攻撃者が平文の HTTP 要求やダウングレードされた経路から Cookie を盗み、セッションの乗っ取りや認証の回避を試みるおそれがあります。

想定される影響

  • 中間者が平文の HTTP 要求からセッション Cookie やトークンを盗む可能性があります。
  • 盗まれた Cookie によってユーザーになりすまされたり、権限のある API にアクセスされたりするおそれがあります。
  • HTTPS のサイトでも、一部の HTTP パスやリダイレクトで Cookie が漏れる可能性があります。

対処方法

  • 機密性の高いサーバー Cookie に secure: true を設定してください。
  • HttpOnly と SameSite も使い、スクリプトからのアクセスや CSRF のリスクを減らしてください。
  • Set-Cookie ヘッダーを直接作る場合は Secure 属性を含め、HTTPS だけで送信されるようにしてください。

例

変更前

javascript
app.post("/login", (req, res) => {
  const token = createSession(req.user);
  res.cookie("session", token, { httpOnly: true });
  res.send("ok");
});

変更後

javascript
app.post("/login", (req, res) => {
  const token = createSession(req.user);
  res.cookie("session", token, {
    secure: true,
    httpOnly: true,
    sameSite: "Lax",
  });
  res.send("ok");
});

説明:

  • 変更前: 機密性の高いセッション Cookie に Secure がなく、HTTP で送信される可能性があります。
  • 変更後: Secure、HttpOnly、SameSite によって送信とアクセスの範囲を制限します。

参考資料