HttpOnly 미설정 쿠키 노출

Sensitive Cookie Without HttpOnly Flag

설명

HttpOnly 미설정 쿠키 노출은 인증 정보나 세션 ID 같은 민감한 값을 담고 있는 쿠키에 HttpOnly 옵션을 설정하지 않았을 때 발생하는 취약점입니다. HttpOnly가 없으면 JavaScript 같은 클라이언트 측 스크립트가 document.cookie를 통해 쿠키 값을 읽을 수 있습니다. 공격자는 XSS(크로스 사이트 스크립팅) 취약점을 이용해 악성 스크립트를 삽입하고, 그 스크립트로 사용자의 세션 쿠키를 탈취하여 세션 하이재킹(사용자 계정 가로채기)을 할 수 있습니다.

잠재적 영향

  • 세션 탈취 (세션 하이재킹): XSS를 통해 공격자가 document.cookie로 세션 쿠키를 읽어 사용자의 로그인 세션을 가로챌 수 있습니다.

  • 계정 탈취 (Account Takeover): 세션을 탈취한 공격자가 해당 사용자의 권한으로 민감 정보 조회, 설정 변경, 결제 등 모든 행동을 수행할 수 있습니다.

  • 권한 오남용 및 사기 거래: 관리자 계정이나 높은 권한 계정의 쿠키가 탈취되면 시스템 설정 변경, 대량 데이터 유출, 사기성 거래 수행이 가능해집니다.

해결 방법

  • 모든 세션/인증 관련 쿠키에 HttpOnly: true를 반드시 설정합니다.

  • 민감한 정보(세션 ID, 토큰, 사용자 식별자 등)를 담는 쿠키에는 HttpOnly와 Secure(HTTPS 전용) 둘 다 설정하는 것을 기본 정책으로 합니다.

  • 쿠키 생성/삭제/갱신용 공통 함수(헬퍼)를 만들고, 그 안에서 HttpOnly와 Secure를 기본값으로 강제 설정하여 개발자가 실수로 빼먹지 않게 합니다.

  • XSS 취약점 자체도 함께 제거하여 document.cookie에 접근 가능한 스크립트 삽입을 방지합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: non_compliant 코드에서는 인증/세션을 위한 session_id 쿠키를 만들 때 HttpOnly 필드를 설정하지 않았습니다. 이 경우 브라우저의 JavaScript 코드가 document.cookie를 통해 session_id 값을 읽을 수 있습니다. 애플리케이션에 XSS 취약점이 하나라도 존재하면, 공격자가 악성 스크립트를 주입하여 사용자의 세션 쿠키를 탈취하고, 이를 이용해 세션 하이재킹 및 계정 탈취 공격을 수행할 수 있습니다. 또한 Secure 플래그도 없어 HTTP 트래픽에서 쿠키가 평문으로 노출될 위험이 커집니다.

  • 안전한 코드: compliant 코드에서는 쿠키를 설정하는 공통 함수 setSecureSessionCookie에서 HttpOnly: true를 명시적으로 설정하여 JavaScript가 쿠키에 직접 접근하지 못하도록 했습니다. 따라서 XSS가 있더라도 document.cookie로 세션 ID를 바로 탈취하기 어렵습니다. 추가로 Secure: true를 설정해 HTTPS 연결에서만 쿠키가 전송되도록 하고, SameSite 옵션을 통해 CSRF 위험도 줄였습니다. 이런 방식으로 쿠키 생성 로직에서 보안 옵션을 기본값으로 강제하면, 개발자가 새 쿠키를 추가할 때 HttpOnly 설정을 빠뜨리는 실수를 예방할 수 있습니다.

참조

Last updated