메뉴 건너뛰기

app

브라우저가 종료되어도 남는 흔적: CWE-539 지속성 쿠키 정보 노출

suritam92026.01.17 22:40조회 수 4댓글 0

    • 글자 크기

1. 지속성 쿠키를 통한 정보 노출의 위험성

CWE-539는 민감한 정보를 담은 쿠키의 만료 시간(Expiration)을 너무 길게 설정하여, 사용자의 하드디스크에 파일 형태로 저장(Persistent Cookie)될 때 발생합니다. 메모리에만 머무는 세션 쿠키와 달리 지속성 쿠키는 브라우저를 닫아도 삭제되지 않습니다. 만약 공용 PC에서 사용자가 로그아웃을 잊거나, 기기를 분실했을 경우 공격자는 하드디스크에 저장된 쿠키 파일을 복사하여 사용자의 세션을 탈취하거나 쿠키에 포함된 민감 정보(ID, 권한 등)를 획득할 수 있습니다.

2. 흔히 발생하는 취약한 패턴: '로그인 상태 유지'의 함정

사용자 편의를 위해 제공하는 기능들이 보안 약점이 되는 경우가 많습니다.

과도한 유효기간: 쿠키의 Max-Age나 Expires 속성을 며칠, 몇 달 단위로 길게 설정하는 경우.

민감 정보 직접 저장: 쿠키 값에 암호화되지 않은 사용자 아이디, 이름, 이메일 또는 자동 로그인용 토큰을 그대로 담는 경우.

불필요한 지속성 부여: 브라우저 종료 시 삭제되어야 할 세션 정보에 명시적인 만료 시간을 부여하여 하드디스크에 기록되게 하는 경우.

3. 실무적 대응: 세션 쿠키 우선 사용과 보안 속성 강화

보안과 편의성 사이의 균형을 맞추기 위해 쿠키 설정 시 다음 원칙을 준수해야 합니다.

세션 쿠키(Session Cookie) 사용: Max-Age나 Expires를 설정하지 않으면 쿠키는 브라우저 메모리에만 존재하며 브라우저 종료 시 자동 삭제됩니다.

최소한의 만료 시간: 자동 로그인 등의 기능이 반드시 필요하다면 만료 시간을 최소한으로 설정하고, 해당 쿠키에는 민감 정보를 절대 담지 않습니다.

보안 속성 적용: HttpOnly(자바스크립트 접근 차단), Secure(HTTPS 전송 강제), SameSite(CSRF 방어) 속성을 반드시 결합합니다.

서버 측 세션 관리: 쿠키에는 무작위로 생성된 세션 ID만 담고, 실제 정보는 서버 메모리나 DB에 저장합니다.

4. CWE-539 대응 및 안전한 쿠키 생성 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
 
public class CookieSecurityManager {
    private static final Logger logger = LoggerFactory.getLogger(CookieSecurityManager.class);
 
    // [CWE-539 조치] 민감 정보는 세션 쿠키로 설정하여 하드디스크 저장을 방지
    public void setSecureSessionCookie(HttpServletResponse response, String sessionToken) {
        // 쿠키 생성 (민감 정보가 아닌 무작위 토큰만 사용)
        Cookie cookie = new Cookie("AUTH_TOKEN", sessionToken);
 
        // 1. 만료 시간을 설정하지 않음 -> 세션 쿠키로 동작 (브라우저 종료 시 삭제)
        // cookie.setMaxAge(60 * 60 * 24 * 30); // [위험] 30일간 하드디스크 저장 금지
 
        // 2. 보안 속성 강화 (CWE-614 등 관련 취약점 동시 대응)
        cookie.setHttpOnly(true);  // XSS를 통한 쿠키 탈취 방지
        cookie.setSecure(true);    // HTTPS 환경에서만 전송
        cookie.setPath("/");       // 쿠키 사용 범위 제한
 
        response.addCookie(cookie);
        logger.debug("Secure session cookie set without persistent expiration.");
    }
}

코멘트: 쿠키는 편리한 도구이지만, 사용자의 PC에 남겨지는 "디지털 지문"과 같습니다. 특히 금융이나 개인정보와 관련된 시스템이라면 반드시 세션 쿠키 사용을 원칙으로 삼으십시오. 어쩔 수 없이 지속성 쿠키를 써야 한다면, 그 안에 담긴 값이 유출되어도 2차 피해가 없도록 일회성 토큰 방식을 채택해야 합니다. logger.debug()를 통해 쿠키 설정 흐름을 기록하되, 쿠키 값 자체는 로그에 남기지 않는 세심함이 시큐어 코딩의 완성입니다.

 
    • 글자 크기
해커를 위한 친절한 설명서: CWE-615 주석 내 중요 정보 노출 (by suritam9) 신뢰의 연결고리를 확인하라: CWE-295 부적절한 인증서 유효성 검증 (by suritam9)

댓글 달기

첨부 (0)
위로