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로 구문 분석하는 것을 고려할 수 있습니다.
출처
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security] 4-3. 보안: HTTP (0) | 2023.10.14 |
---|---|
[Spring Security] 4-2. 보안: Security HTTP Response Headers (2) | 2023.10.14 |
[Spring Security] 4-1. 보안: CSRF (0) | 2023.10.06 |
[Spring Security][KoLiving] 4-5. BlackList Token (0) | 2023.10.03 |
[Spring Security][KoLiving] 4-4. RefreshToken Rotation (0) | 2023.10.03 |