Spring/Spring Security

[Spring Security] 4-4. 보안: HttpFirewall

noahkim_ 2023. 10. 14. 02:54

1. HttpFirewall

  • Spring Security의 보안 컴포넌트 중 하나입니다.
  • 여러  기반 공격 유형으로부터 보호하는 보안 레이어를 제공합니다.

 

역할
  • HTTP 요청이 보안 필터 체인에 도달하기 전에 요청을 검사하고, 필요한 경우 수정하는 역할을 합니다.
  • 정규화
    • URL에 포함될 수 있는 잠재적으로 위험한 문자 또는 패턴을 검사하고 제거합니다.
    • 악의적인 요청이 시스템을 방해하지 않도록 합니다
  • 요청 검증
    • 악의적인 요청을 식별하고 거부하는 역할을 합니다.
    • 예를 들어, 세미콜론(;)으로 시작하는 매개변수나 쿼리 문자열에 있는 잠재적 위험 요소를 검사합니다.
  • HTTP 응답 분할 방지
    • HTTP 응답 헤더에 새 줄 문자가 포함되어 있는지 확인하여 HTTP 응답 분할 공격을 방지합니다.

 

StrictHttpFirewall
 
  • 기본적으로 Spring Security는 StrictHttpFirewall이라는 HttpFirewall 구현체를 사용합니다.
  • StrictHttpFirewall는 웹 애플리케이션의 보안을 강화하기 위한 방화벽 구성 요소입니다
    • 기본적으로 많은 종류의 잠재적 위험 요소를 차단합니다.
    • 그러나 특정 요구 사항에 따라 너무 제한적일 수 있기 때문에, 필요에 따라 HttpFirewall의 구현을 사용자 정의할 수 있습니다.

 

2. StrictHttpFirewall 커스터마이징

세미콜론 허용

@Bean
public StrictHttpFirewall httpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowSemicolon(true);
    return firewall;
}
  • URL에 세미콜론을 허용할 수 있습니다.

 

HTTP 메소드 허용 목록

@Bean
public StrictHttpFirewall httpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowedHttpMethods(Arrays.asList("GET", "POST"));
    return firewall;
}
  • Cross Site Tracing (XST) 및 HTTP Verb Tampering 공격을 방지하기 위해 허용되는 HTTP 메소드 목록을 제공합니다.
  • 기본적으로 DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT 등의 메소드가 허용됩니다.
  • setAllowedHttpMethods 사용하여 허용되는 HTTP 메소드를 GET 및 POST로만 설정할 수 있습니다.

 

헤더 및 파라미터 이름 및 값 검증

@Bean
public StrictHttpFirewall httpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowedHeaderNames((header) -> true);
    firewall.setAllowedHeaderValues((header) -> true);
    firewall.setAllowedParameterNames((parameter) -> true);
    return firewall;
}
  • 헤더 이름, 헤더 값, 파라미터 이름 및 값들을 확인합니다.

 

특정 값 허용

@Bean
public StrictHttpFirewall httpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    Pattern allowed = Pattern.compile("[\\p{IsAssigned}&&[^\\p{IsControl}]]*");
    Pattern userAgent = ...;
    firewall.setAllowedHeaderValues((header) -> allowed.matcher(header).matches() || userAgent.matcher(header).matches());
    return firewall;
}
  • 예를 들어 iPhone Xʀ는 ISO-8859-1 문자 집합에 포함되지 않는 문자를 포함하는 User-Agent를 사용합니다.
  • 이로 인해 일부 애플리케이션 서버는 이 값을 두 개의 별도 문자로 구문 분석합니다.
  • 이를 처리하기 위해 setAllowedHeaderValues 메소드를 사용하여 특정 User-Agent를 허용할 수 있습니다.

 

헤더 값을 UTF-8로 구문 분석

firewall.setAllowedHeaderValues((header) -> {
    String parsed = new String(header.getBytes(ISO_8859_1), UTF_8);
    return allowed.matcher(parsed).matches();
});
  • 헤더 값의 경우, 검증 시점에 이를 UTF-8로 구문 분석하는 것을 고려할 수 있습니다.

 

 

 

출처