본문 바로가기
시큐어코딩/JAVA

(시큐어코딩) Java에서 HTTP 응답 헤더 보안 설정(Content Security Policy, HSTS, X-Frame-Options)

by ICT 인사이트 2025. 3. 20.
728x90

1. 시큐어코딩(Secure Coding)

시큐어코딩(Secure Coding)은 보안 취약점을 예방하기 위해 안전한 코드 작성 원칙과 기법을 적용하는 프로그래밍 방식입니다. 


웹 애플리케이션의 보안을 강화하는 가장 중요한 요소 중 하나는 HTTP 응답 헤더 보안 설정입니다.
올바르게 설정된 보안 헤더는 클라이언트와 서버 간의 데이터 보호, XSS 및 클릭재킹 방어, 강제 HTTPS 연결 등의 역할을 수행합니다.


이 글에서는 자바 11 환경에서 Content Security Policy(CSP), HTTP Strict Transport Security(HSTS), X-Frame-Options 등 주요 보안 헤더의 역할과 구현 방법을 다룹니다.


2. 주요 HTTP 응답 헤더 보안 설정

2.1 Content Security Policy (CSP)

CSP(Content Security Policy)는 XSS 공격 및 데이터 변조를 방지하기 위해 스크립트 실행을 제어하는 HTTP 응답 헤더입니다.

CSP의 역할:

  • 신뢰된 출처에서 로드된 리소스만 실행 허용
  • eval() 및 inline JavaScript 실행 차단 가능
  • XSS 및 코드 인젝션 공격 방어

(1) 취약한 코드: CSP 미적용

아래 코드처럼 CSP가 적용되지 않으면 공격자가 XSS 공격을 수행할 수 있습니다.

<script>alert('XSS!')</script>

(2) 안전한 코드: CSP 적용

response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' https://trusted.com");

방어 효과:

  • default-src 'self' → 현재 도메인에서 로드된 리소스만 허용
  • script-src 'self' https://trusted.com → 신뢰된 도메인에서만 스크립트 실행 허용
  • inline JavaScript 실행 차단

2.2 HTTP Strict Transport Security (HSTS)

HSTS(HTTP Strict Transport Security)는 웹사이트가 HTTPS를 강제하도록 설정하는 보안 헤더입니다.
이를 적용하면 중간자 공격(Man-in-the-Middle Attack, MITM)HTTPS 우회 공격을 방어할 수 있습니다.

(1) 취약한 코드: HSTS 미적용

response.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");
  • HTTPS가 강제되지 않아 사용자가 HTTP로 접속할 가능성이 있음
  • 공격자가 HTTPS 연결을 HTTP로 다운그레이드하여 MITM 공격 가능

(2) 안전한 코드: HSTS 적용

response.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");

방어 효과:

  • max-age=31536000 → 1년 동안 HTTPS 연결 강제
  • includeSubDomains → 모든 서브도메인에 HSTS 적용
  • preload → 브라우저가 HSTS 목록에 사전 등록 가능

2.3 X-Frame-Options

X-Frame-Options는 웹사이트가 iframe을 통해 다른 사이트에 포함되는 것을 방지하는 보안 헤더입니다.
이를 통해 클릭재킹(Clickjacking) 공격을 차단할 수 있습니다.

(1) 취약한 코드: X-Frame-Options 미적용

아래 코드처럼 X-Frame-Options가 설정되지 않으면 공격자가 iframe을 활용한 클릭재킹 공격을 수행할 수 있습니다.

<iframe src="https://victim-site.com" width="800" height="600"></iframe>

(2) 안전한 코드: X-Frame-Options 적용

response.setHeader("X-Frame-Options", "DENY");

방어 효과:

  • DENY → iframe을 통한 웹사이트 로딩 완전 차단
  • SAMEORIGIN → 동일 도메인 내에서만 iframe 허용

2.4 X-Content-Type-Options

이 보안 헤더는 브라우저가 MIME 타입을 자동으로 추론하지 않도록 막아 파일 업로드 취약점을 방어하는 역할을 합니다.

(1) 취약한 코드: X-Content-Type-Options 미적용

response.setHeader("X-Content-Type-Options", ""); // 미설정
  • 브라우저가 콘텐츠 유형을 자동으로 감지하여 공격자가 악성 파일을 실행할 가능성 있음

(2) 안전한 코드: X-Content-Type-Options 적용

response.setHeader("X-Content-Type-Options", "nosniff");

방어 효과:

  • nosniff → 브라우저가 콘텐츠 MIME 타입을 임의로 변경하지 않도록 제한
  • 파일 업로드 시 악성 콘텐츠 실행 차단

2.5 Referrer-Policy

Referrer-Policy는 외부 사이트로 전송되는 HTTP Referer 정보를 제어하여 민감한 정보를 보호하는 역할을 합니다.

(1) 취약한 코드: Referrer-Policy 미적용

response.setHeader("Referrer-Policy", "");
  • 사용자가 로그인된 상태에서 외부 링크 클릭 시 Referer 헤더가 전달됨
  • 민감한 정보가 URL을 통해 유출될 가능성이 있음

(2) 안전한 코드: Referrer-Policy 적용

response.setHeader("Referrer-Policy", "no-referrer");

방어 효과:

  • no-referrer → 모든 요청에서 Referer 헤더 제거
  • strict-origin-when-cross-origin → 동일 출처(origin) 요청에만 Referer 포함

3. Spring Boot에서 HTTP 응답 헤더 보안 설정

Spring Boot에서는 **SecurityFilterChain**을 통해 보안 헤더를 쉽게 설정할 수 있습니다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .headers(headers -> headers
            .contentSecurityPolicy("default-src 'self'")
            .strictTransportSecurity(hsts -> hsts.maxAgeInSeconds(31536000).includeSubDomains(true).preload(true))
            .frameOptions(frameOptions -> frameOptions.deny())
            .contentTypeOptions(contentTypeOptions -> contentTypeOptions.nosniff())
            .referrerPolicy(referrer -> referrer.policy(ReferrerPolicy.NO_REFERRER))
        );
    return http.build();
}

Spring Security에서 보안 헤더 설정을 한 번에 적용 가능
보안 헤더 정책을 중앙 집중적으로 관리할 수 있음


4. 결론

HTTP 응답 헤더는 웹 애플리케이션의 보안을 강화하는 필수적인 요소이며,
특히 CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy 등을 설정하면 XSS, 클릭재킹, HTTP 다운그레이드 공격, MIME 타입 조작 등의 위협을 방어할 수 있습니다.

 

✅ 다음 포스팅:

다음 글에서는 OWASP Top 10 기반의 "보안 인증(Authentication) 강화 기법"을 분석합니다.

728x90