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) 강화 기법"을 분석합니다.
'시큐어코딩 > JAVA' 카테고리의 다른 글
(시큐어코딩)Java에서 JWT 기반 인증 및 보안 강화를 위한 Best Practice (0) | 2025.04.02 |
---|---|
(시큐어코딩) Java에서 OWASP Top 10 기반의 보안 인증(Authentication) 강화 기법 (0) | 2025.03.20 |
(시큐어코딩) Java에서 CSRF(크로스 사이트 요청 위조) 보안취약점 공격 방어 전략 (0) | 2025.03.18 |
(시큐어코딩)Java에서 크로스사이트 스크립트(XSS) 보안취약점 공격 방어 전략 (0) | 2025.03.17 |
(시큐어코딩)Java에서 SQL 삽입 취약점 공격 방어 전략 (0) | 2025.03.17 |