[java] Apache Shiro의 보안 헤더 설정

Apache Shiro는 자바 기반의 보안 프레임워크로서, 애플리케이션의 인증과 인가를 처리하는데 사용됩니다. 이러한 보안 프레임워크는 웹 애플리케이션에서 중요한 역할을 담당하며, 특히 보안 헤더 설정은 애플리케이션의 보안 강화에 큰 도움을 줍니다.

보안 헤더란?

보안 헤더는 웹 애플리케이션이 클라이언트에게 전송하는 HTTP 응답 헤더의 일종입니다. 보안 헤더를 설정함으로써 애플리케이션은 다양한 보안 측면을 강화할 수 있습니다. 대표적인 보안 헤더에는 다음과 같은 것들이 있습니다:

  1. X-XSS-Protection: XSS(Cross-site Scripting) 공격을 방지하기 위한 기능을 제공합니다.
  2. X-Content-Type-Options: MIME 스니핑 공격을 방지하기 위해, MIME 타입을 강제로 지정하도록 합니다.
  3. X-Frame-Options: 클릭재킹(clickjacking) 공격을 방지하기 위해, 프레임의 표시 여부를 제어합니다.
  4. Content-Security-Policy: 애플리케이션에서 로드할 수 있는 리소스의 출처를 지정하여, XSS나 데이터 유출 등의 공격을 방지합니다.

Apache Shiro에서 보안 헤더 설정하기

Apache Shiro는 ServletFilter를 통해 보안 헤더를 설정할 수 있습니다. ShiroFilter를 사용하여 보안 필터를 등록하고, 필터 체인에서 보안 헤더를 추가할 수 있습니다. 아래는 web.xml 파일에서 보안 헤더를 설정하는 코드 예시입니다:

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    <init-param>
        <param-name>staticSecurityManagerEnabled</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

위의 코드에서 staticSecurityManagerEnabled는 보안 필터가 정적인 SecurityManager를 사용하는지 여부를 지정하는 파라미터입니다. 이 값을 true로 설정하면 보안 헤더를 추가할 수 있습니다.

보안 헤더를 추가하기 위해서는 ShiroFilter를 확장한 사용자 정의 필터를 구현하고, 필터 체인에서 해당 필터를 등록해야 합니다. 아래는 사용자 정의 필터에서 보안 헤더를 설정하는 예시 코드입니다:

import org.apache.shiro.web.servlet.AdviceFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class SecurityHeaderFilter extends AdviceFilter {
    @Override
    protected void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        // 보안 헤더 설정
        response.setHeader("X-XSS-Protection", "1; mode=block");
        response.setHeader("X-Content-Type-Options", "nosniff");
        response.setHeader("X-Frame-Options", "DENY");
        response.setHeader("Content-Security-Policy", "default-src 'self'");
        
        // 다음 필터로 체인 전달
        super.doFilterInternal(request, response, chain);
    }
}

위의 코드에서는 doFilterInternal 메서드를 오버라이드하여 보안 헤더를 설정하고, 원래의 필터 체인으로 제어를 넘깁니다.

이렇게 구현된 사용자 정의 필터를 web.xml에서 등록하고 필터 체인에 추가하면 웹 애플리케이션에서 보안 헤더가 적용됩니다.

결론

Apache Shiro를 사용하여 보안 헤더를 설정하면 웹 애플리케이션의 보안을 강화할 수 있습니다. 보안 헤더를 설정함으로써 애플리케이션은 다양한 공격으로부터 더욱 안전하게 보호될 수 있습니다.