Secure属性のないCookie

HTTPSのCookieにSecureを設定してHTTPでの送信を制限する

説明

Secureを設定していない、または明示的に無効化したCookieはHTTPでも送信され、通信を観測できる攻撃者に読み取られる可能性があります。HTTPSアプリケーションでは、暗号化した接続でCookieを送るようSecureを設定してください。

想定される影響

攻撃者が観測できる経路でCookieが実際にHTTP送信されると、値が漏れる可能性があります。影響は保存した値とセッションの権限によって変わります。

  • セッションCookieの傍受によるセッションの乗っ取り
  • 認証トークンや個人情報の漏えい
  • 盗まれたセッションによるアカウントへの不正アクセス

対処方法

  1. Javaではcookie.setSecure(true)、Kotlinではcookie.secure = trueまたはcookie.setSecure(true)を設定してください。
  2. Cookieの生成とレスポンスへの追加を共通処理にまとめ、既定でSecure=trueにしてください。
  3. サービス全体をHTTPSで運用し、HTTPからリダイレクトしてください。ただし最初のHTTPリクエストに含まれたCookieは、リダイレクトだけでは保護できません。
  4. JavaScriptから読む必要のない機密CookieにHttpOnlyを設定し、対応APIやSet-Cookieヘッダーで適切なSameSiteを指定してください。

例

通常の設定値を保存するCookieで、送信属性だけを比較します。機密性は名前だけでなく、保存する値と用途から判断してください。

Java

変更前

java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

void addPreferenceCookie(HttpServletResponse response, String value) {
    Cookie cookie = new Cookie("theme", value);
    cookie.setSecure(false);
    response.addCookie(cookie);
}

変更後

java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

void addPreferenceCookie(HttpServletResponse response, String value) {
    Cookie cookie = new Cookie("theme", value);
    cookie.setSecure(true);
    response.addCookie(cookie);
}

Kotlin

変更前

kotlin
import jakarta.servlet.http.Cookie
import jakarta.servlet.http.HttpServletResponse

fun addPreferenceCookie(response: HttpServletResponse, value: String) {
    val cookie = Cookie("preferences", value)
    cookie.secure = false
    response.addCookie(cookie)
}

変更後

kotlin
import jakarta.servlet.http.Cookie
import jakarta.servlet.http.HttpServletResponse

fun addPreferenceCookie(response: HttpServletResponse, value: String) {
    val cookie = Cookie("preferences", value)
    cookie.secure = true
    response.addCookie(cookie)
}

参考資料