Helmet 미들웨어 보안 기능 비활성화 (frameguard/CSP)
Insecure Security Headers (Helmet Misconfiguration)
설명
Helmet은 Express 앱에 보안 HTTP 헤더를 쉽게 설정하는 미들웨어입니다. frameguard(X-Frame-Options/Frame-Ancestors)나 contentSecurityPolicy(CSP)를 false로 비활성화하면 브라우저의 보호 메커니즘이 꺼져 클릭재킹과 XSS 위험이 크게 증가합니다. 공격자는 피싱/악성 페이지에서 피해 사이트를 iframe으로 감싸 사용자의 클릭을 가로채거나, 악성 스크립트를 로드·실행하도록 유도할 수 있습니다.
잠재적 영향
클릭재킹(Clickjacking): 외부 사이트가 대상 페이지를 iframe으로 임베드해 투명 레이어로 버튼을 덮어씌워 사용자가 원치 않는 결제/설정 변경 등을 클릭하게 만듭니다.
XSS 위험 증가: CSP가 꺼지면 외부 스크립트 로드, inline 스크립트 실행 제한이 사라져 스크립트 인젝션 성공률이 높아집니다.
데이터 유출: 악성 스크립트를 통해 세션 토큰, 개인정보, CSRF 토큰 등이 탈취될 수 있습니다.
계정 탈취/무단 행위: 위조된 UI로 사용자의 의도를 속여 비밀번호 변경, 송금, 결제 등의 행위를 유도할 수 있습니다.
해결 방법
frameguard와 contentSecurityPolicy를 비활성화하지 않습니다. 가능한 기본값(app.use(helmet()))을 사용합니다.
프레임 보호: helmet.frameguard({ action: 'deny' | 'sameorigin' }) 또는 CSP의 frame-ancestors로 임베드 허용 출처를 명확히 제한합니다.
CSP 강화: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self' 등 최소 권한 원칙으로 설정합니다. '*' 와 'unsafe-inline', 'unsafe-eval' 사용을 피하고, 불가피한 경우 nonce 또는 hash 기반 정책을 사용합니다.
페이지별 정책: 특정 페이지에서만 외부 임베드/스크립트가 필요하다면 그 페이지에만 제한적으로 허용합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: frameguard와 CSP를 false로 꺼서 브라우저 보호가 해제됩니다. 그 결과 공격자가 페이지를 iframe으로 감싸 클릭을 가로채거나, 악성 스크립트를 로드·실행하여 세션/개인정보를 탈취할 수 있습니다.
안전한 코드: Helmet을 활성화하고 frameguard와 CSP를 명시적으로 설정해 프레임 임베드와 스크립트 실행을 엄격히 제한합니다. 이를 통해 클릭재킹과 XSS의 가능성을 크게 줄입니다.
참조
Last updated