Secureのない機密性の高いCookie

Secure属性のない機密性の高いCookie

説明

Secure のないCookieは暗号化されていないHTTPでも送信されるため、通信の傍受や中間者攻撃によって機密性の高い値が漏えいするおそれがあります。

想定される影響

  • 情報漏えい: 傍受されたCookieから機密情報を取得されたり、セッションを盗まれたりする可能性があります。
  • セッションの乗っ取り: セッションCookieを取得した攻撃者に、利用者になりすまされるおそれがあります。
  • データ改ざん: Cookieの値の改ざんが、アプリケーションの完全性に影響する可能性があります。

対処方法

  • Secure を設定し、ブラウザーがHTTPSでのみCookieを送信するようにします。

例

変更前

python
# Djangoで保護フラグを設定しない例
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False

変更後

python
# Djangoで保護フラグを設定する例
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

変更前

python
# Flaskで保護フラグを設定しない例
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_SECURE=False,
)

変更後

python
# Flaskで保護フラグを設定する例
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_SECURE=True,
)

変更前

python
# FastAPIで保護フラグを設定しない例
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # サーバーが発行する予測困難なセッション値
    response.set_cookie(
        key="session",
        value=session_id,
        secure=False,
        httponly=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

変更後

python
# FastAPIで保護フラグを設定する例
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # サーバーが発行する予測困難なセッション値
    response.set_cookie(
        key="session",
        value=session_id,
        secure=True,
        httponly=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

解説

  • 変更前: Secure がないため、HTTPでCookieが送信される可能性があります。
  • 変更後: Secure は送信をHTTPSに限定します。HttpOnly は別の保護で、JavaScriptからの読み取りを防ぎます。

参考資料