説明
Secureを設定していない、または明示的に無効化したCookieはHTTPでも送信され、通信を観測できる攻撃者に読み取られる可能性があります。HTTPSアプリケーションでは、暗号化した接続でCookieを送るようSecureを設定してください。
想定される影響
攻撃者が観測できる経路でCookieが実際にHTTP送信されると、値が漏れる可能性があります。影響は保存した値とセッションの権限によって変わります。
- セッションCookieの傍受によるセッションの乗っ取り
- 認証トークンや個人情報の漏えい
- 盗まれたセッションによるアカウントへの不正アクセス
対処方法
- Javaでは
cookie.setSecure(true)、Kotlinではcookie.secure = trueまたはcookie.setSecure(true)を設定してください。 - Cookieの生成とレスポンスへの追加を共通処理にまとめ、既定で
Secure=trueにしてください。 - サービス全体をHTTPSで運用し、HTTPからリダイレクトしてください。ただし最初のHTTPリクエストに含まれたCookieは、リダイレクトだけでは保護できません。
- 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)
}