설명
쿠키(Cookie)에 Secure 속성을 설정하지 않거나 명시적으로 비활성화하면 HTTP 연결에서도 쿠키가 전송될 수 있어 중간자 공격(Man-in-the-Middle, MitM)에 의해 탈취될 위험이 있습니다. HTTPS를 사용하는 애플리케이션에서는 쿠키가 암호화된 연결을 통해서만 전송되도록 Secure 속성을 설정해야 합니다.
잠재적 영향
쿠키가 실제로 HTTP로 전송되고 공격자가 트래픽을 볼 수 있을 때 값이 노출될 수 있습니다. 영향은 쿠키에 담긴 데이터와 세션 권한에 따라 달라집니다.
- 세션 하이재킹(Session Hijacking): 공격자가 네트워크 트래픽을 감청하여 사용자의 세션을 탈취할 수 있습니다.
- 개인정보 유출: 로그인 정보, 인증 토큰 등 민감한 쿠키 값이 노출될 수 있습니다.
- 불법적인 계정 접근: 공격자가 탈취한 세션을 이용하여 사용자의 계정에 접근할 수 있습니다.
해결 방법
- 쿠키가 HTTPS에서만 전송되도록 Java에서는
cookie.setSecure(true), Kotlin에서는cookie.secure = true또는cookie.setSecure(true)를 적용합니다. - 쿠키 생성과 응답 전송을 공통 헬퍼로 모아
Secure=true를 기본값으로 강제합니다. - 서비스 전체를 HTTPS-only로 운영하고 HTTP 요청은 HTTPS로 리다이렉트하세요. 리다이렉트만으로 첫 HTTP 요청에 포함된 쿠키를 보호할 수는 없습니다.
- 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)
}