Secure 플래그가 없는 민감한 쿠키 설정

Secure 플래그가 없는 민감한 쿠키 설정

설명

이 취약점은 세션 ID나 로그인 상태 같은 민감한 정보를 담은 쿠키를 만들 때 Secure 플래그를 설정하지 않아, HTTP(암호화되지 않은) 요청에도 쿠키가 전송될 수 있을 때 발생합니다. 공격자는 같은 네트워크(공용 Wi-Fi 등)에서 트래픽을 가로채(패킷 스니핑) 이 쿠키 값을 탈취할 수 있고, 탈취한 세션 쿠키로 사용자를 가장해 로그인 세션을 탈취할 수 있습니다.

잠재적 영향

  • 세션 탈취 (Session Hijacking): HTTPS 페이지에서 발급된 세션 쿠키가 이후 HTTP 요청에도 전송되면, 같은 네트워크 상의 공격자가 패킷을 가로채 세션 ID를 훔칠 수 있습니다.
  • 계정 도용 (Account Takeover): 탈취한 세션 ID로 사용자를 가장해 로그인 상태를 그대로 재현할 수 있어, 계정 정보 조회, 설정 변경, 결제 등의 행위를 대신 수행할 수 있습니다.
  • 정보 노출 (정보 유출): 쿠키에 권한 정보, 사용자 식별자 등 추가 민감 정보가 들어있는 경우, 탈취된 쿠키를 통해 더 많은 개인정보가 노출될 수 있습니다.

해결 방법

  • 모든 세션·인증 관련 쿠키에 Secure: true를 설정하세요.
  • 서비스 전체에 HTTPS를 적용하세요. HTTP에서 HTTPS로 리다이렉트하더라도 이미 전송된 HTTP 요청의 쿠키를 보호할 수는 없습니다.
  • HttpOnly: true도 설정해 JavaScript를 통한 쿠키 값 탈취 위험을 줄이세요. XSS 자체를 막는 설정은 아닙니다.
  • 가능하면 민감하지 않은 쿠키에도 Secure를 기본값으로 사용하세요.
  • 쿠키 생성·삭제용 공통 함수에서 필요한 보안 속성을 유지하세요. 삭제할 때는 원래 쿠키와 이름, Domain, Path가 일치해야 합니다.

예시

변경 전

go
package main

import (
    "net/http"
)

// 비준수 예: Secure 플래그 누락
func setSessionCookie(w http.ResponseWriter, sessionID string) {
    // 로그인 세션 쿠키지만 Secure, HttpOnly를 설정하지 않음
    cookie := http.Cookie{
        Name:  "SESSIONID",
        Value: sessionID,
        Path:  "/",
        // Secure: false가 기본값
        // HttpOnly: false가 기본값
    }

    // HTTP 요청에서도 이 쿠키가 전송될 수 있음
    http.SetCookie(w, &cookie)
}

변경 후

go
package main

import (
    "net/http"
    "time"
)

// 준수 예: Secure, HttpOnly를 명시적으로 설정
func setSessionCookie(w http.ResponseWriter, sessionID string) {
    cookie := http.Cookie{
        Name:     "SESSIONID",
        Value:    sessionID,
        Path:     "/",
        Secure:   true,          // HTTPS 연결에서만 전송
        HttpOnly: true,          // JavaScript에서 접근 불가
        SameSite: http.SameSiteLaxMode,
        Expires:  time.Now().Add(30 * time.Minute),
    }

    http.SetCookie(w, &cookie)
}

// 삭제 시에도 동일하게 Secure/HttpOnly 유지
func deleteSessionCookie(w http.ResponseWriter) {
    cookie := http.Cookie{
        Name:     "SESSIONID",
        Value:    "",
        Path:     "/",
        Secure:   true,
        HttpOnly: true,
        Expires:  time.Unix(0, 0),
        MaxAge:   -1,
    }

    http.SetCookie(w, &cookie)
}

설명:

  • 변경 전: setSessionCookie 함수는 로그인 세션과 같이 민감한 정보를 담은 SESSIONID 쿠키를 생성하면서 Secure: true를 설정하지 않았습니다. 이 경우 브라우저는 HTTP(암호화되지 않은) 요청에도 이 쿠키를 전송할 수 있고, 공용 Wi-Fi 등에서 공격자가 네트워크 트래픽을 스니핑하여 세션 쿠키를 탈취할 수 있습니다. 또 HttpOnly도 설정하지 않아, XSS 취약점이 있을 경우 JavaScript로 쿠키를 읽어갈 위험도 커집니다.
  • 변경 후: 수정된 코드에서는 세션 쿠키에 Secure: true를 설정해 HTTPS 연결에서만 쿠키가 전송되도록 했습니다. 덕분에 평문 HTTP 트래픽을 가로채도 세션 쿠키는 노출되지 않습니다. 또한 HttpOnly: true를 설정하여 브라우저의 JavaScript 코드에서 쿠키에 접근할 수 없도록 막아 XSS를 통한 쿠키 탈취 위험을 줄였습니다. 삭제 예시는 같은 이름과 Path를 사용하고 두 경우 모두 Domain을 생략합니다. 이 식별 범위가 일치해야 원래 쿠키가 제거됩니다. Secure와 HttpOnly는 별도의 보호 속성입니다.

참조