- 서블릿 필터 코드로 보안 헤더 설정하기
아래는 보안 헤더를 한 번에 설정하는 통합 서블릿 필터 코드이다. 이 필터는 HttpOnly, Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, X-XSS-Protection를 모든 응답에 적용한다.
- HttpOnly: Set-Cookie 헤더에 HttpOnly 속성을 추가하여 모든 쿠키에 대해 적용되도록 설정
- X-Content-Type-Options: 브라우저가 MIME 타입을 스니핑하지 않도록 설정
- X-Frame-Options: 클릭재킹 방지를 위해 페이지가 <iframe> 내에 표시되지 않도록 설정
- X-XSS-Protection: 브라우저에서 XSS 필터를 활성화
- Content-Security-Policy: 외부 스크립트나 리소스의 로딩을 제한하여 XSS 공격을 방지
- SecurityHeadersFilter.java 추가
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SecurityHeadersFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
// HttpOnly 속성을 모든 쿠키에 적용
httpResponse.setHeader("Set-Cookie", "name=value; HttpOnly");
// 보안 헤더 설정
httpResponse.setHeader("X-Content-Type-Options", "nosniff");
httpResponse.setHeader("X-Frame-Options", "DENY");
httpResponse.setHeader("X-XSS-Protection", "1; mode=block");
httpResponse.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self';");
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
- web.xml에 필터 등록
<filter>
<filter-name>securityHeadersFilter</filter-name>
<filter-class>com.example.SecurityHeadersFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>securityHeadersFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 코드 추가 시 예상 영향도
1. HttpOnly 속성
- 영향: HttpOnly 속성이 설정된 쿠키는 js 같은 클라이언트 측 스크립트에서 접근할 수 없다.
- 예상되는 영향: 일반적인 웹 애플리케이션에서는 쿠키를 통해 세션을 관리하므로, 대부분의 경우 문제를 일으키지 않는다. 그러나 만약 JavaScript에서 쿠키를 읽어야 하는 기능이 있다면, 이 속성으로 인해 해당 기능이 제대로 동작하지 않을 수 있다.
2. X-Content-Type-Options: nosniff
- 영향: 브라우저가 MIME 타입을 강제로 변경하거나 추측하지 않도록 한다.
- 예상되는 영향: 웹 서버에서 제공하는 콘텐츠의 MIME 타입이 정확히 설정되어 있지 않다면, 브라우저가 해당 콘텐츠를 잘못 처리할 수 있다. 예를 들어, 텍스트 파일을 스크립트로 실행하려는 경우 브라우저가 이를 차단하게 된다.
3. X-Frame-Options: DENY
- 영향: 페이지가 <iframe> 또는 <frame> 태그 안에 포함되지 않도록 한다.
- 예상되는 영향: 만약 애플리케이션에서 다른 페이지를 <iframe> 내에 포함시켜야 하는 경우, 이 설정으로 인해 기능이 제한될 수 있다. 예를 들어, 일부 포털 사이트나 대시보드가 내부적으로 iframe을 사용한다면 이러한 페이지가 로드되지 않을 수 있다.
4. X-XSS-Protection: 1; mode=block
- 영향: 브라우저에서 XSS 필터를 활성화하여 탐지된 XSS 공격을 차단한다.
- 예상되는 영향: 대부분의 경우 긍정적인 영향을 미치며, 브라우저가 자동으로 XSS 공격을 방어한다. 그러나 일부 경우, 정당한 콘텐츠가 오탐지되어 차단될 가능성이 있다. 예를 들어, 사용자가 입력한 콘텐츠가 필터링 조건에 부합하는 경우 오탐지로 인해 콘텐츠가 차단될 수 있다.
5. Content-Security-Policy (CSP)
- 영향: 외부 스크립트, 스타일, 이미지 등의 로딩을 제한하고, 지정된 출처에서만 리소스를 로드하도록 강제한다.
- 예상되는 영향: CSP는 매우 강력한 보안 정책을 제공하지만, 잘못 설정하면 웹사이트의 기능을 방해할 수 있다. 예를 들어, 외부 CDN에서 제공하는 JavaScript 라이브러리, 서드파티 위젯, 또는 특정 스타일시트를 허용하지 않는다면, 이러한 리소스가 차단되어 기능이 동작하지 않을 수 있다.
- 대처 방안: 필요한 외부 리소스를 사용해야 한다면, CSP 헤더에 해당 리소스 출처를 명시해야 한다.