Secure 속성이 없는 쿠키 설정 취약점

HTTPS 쿠키에 Secure 속성을 적용하여 HTTP 전송 제한

설명

쿠키(Cookie)에 Secure 속성을 설정하지 않거나 명시적으로 비활성화하면 HTTP 연결에서도 쿠키가 전송될 수 있어 중간자 공격(Man-in-the-Middle, MitM)에 의해 탈취될 위험이 있습니다. HTTPS를 사용하는 애플리케이션에서는 쿠키가 암호화된 연결을 통해서만 전송되도록 Secure 속성을 설정해야 합니다.

잠재적 영향

쿠키가 실제로 HTTP로 전송되고 공격자가 트래픽을 볼 수 있을 때 값이 노출될 수 있습니다. 영향은 쿠키에 담긴 데이터와 세션 권한에 따라 달라집니다.

  • 세션 하이재킹(Session Hijacking): 공격자가 네트워크 트래픽을 감청하여 사용자의 세션을 탈취할 수 있습니다.
  • 개인정보 유출: 로그인 정보, 인증 토큰 등 민감한 쿠키 값이 노출될 수 있습니다.
  • 불법적인 계정 접근: 공격자가 탈취한 세션을 이용하여 사용자의 계정에 접근할 수 있습니다.

해결 방법

  1. 쿠키가 HTTPS에서만 전송되도록 Java에서는 cookie.setSecure(true), Kotlin에서는 cookie.secure = true 또는 cookie.setSecure(true)를 적용합니다.
  2. 쿠키 생성과 응답 전송을 공통 헬퍼로 모아 Secure=true를 기본값으로 강제합니다.
  3. 서비스 전체를 HTTPS-only로 운영하고 HTTP 요청은 HTTPS로 리다이렉트하세요. 리다이렉트만으로 첫 HTTP 요청에 포함된 쿠키를 보호할 수는 없습니다.
  4. JavaScript 접근이 필요하지 않은 민감한 쿠키에는 HttpOnly를 적용하고, 지원되는 API 또는 Set-Cookie 헤더를 통해 적절한 SameSite 정책을 설정합니다.

예시

다음 일반 설정 쿠키 예시는 전송 속성만 비교합니다. 실제 민감도는 이름만이 아니라 저장된 값과 사용 방식으로 판단하세요.

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)
}

참조