ether-http-security provee políticas de seguridad HTTP composables: CORS, cabeceras de seguridad, filtrado por IP, proxies de confianza y rate limiting.
Instalación
<dependency>
<groupId>dev.rafex.ether.http.security</groupId>
<artifactId>ether-http-security</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
HttpSecurityProfile — perfil de seguridad completo
HttpSecurityProfile profile = HttpSecurityProfile.defaults();
HttpSecurityProfile profile = new HttpSecurityProfile(
corsPolicy,
securityHeadersPolicy,
trustedProxies,
ipPolicy,
rateLimitPolicy
);
CORS — CorsPolicy
CorsPolicy cors = CorsPolicy.builder()
.allowOrigins("https://app.example.com", "https://admin.example.com")
.allowMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowHeaders("Authorization", "Content-Type", "X-Request-Id")
.exposeHeaders("X-Total-Count", "X-Request-Id")
.allowCredentials(true)
.maxAge(Duration.ofHours(1))
.build();
Cabeceras de seguridad — SecurityHeadersPolicy
Inyecta automáticamente cabeceras como Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options, Content-Security-Policy:
SecurityHeadersPolicy headers = SecurityHeadersPolicy.builder()
.strictTransportSecurity("max-age=31536000; includeSubDomains")
.contentTypeOptions("nosniff")
.frameOptions("DENY")
.contentSecurityPolicy("default-src 'self'")
.referrerPolicy("strict-origin-when-cross-origin")
.build();
Filtrado por IP — IpPolicy
IpPolicy allowList = IpPolicy.allowList(
"10.0.0.0/8",
"192.168.1.0/24",
"203.0.113.5"
);
IpPolicy blockList = IpPolicy.blockList("185.220.101.0/24");
Proxies de confianza — TrustedProxyPolicy
Configura qué proxies pueden establecer cabeceras X-Forwarded-For y X-Real-IP:
TrustedProxyPolicy proxies = TrustedProxyPolicy.of(
"10.0.0.1",
"172.16.0.0/12"
);
Rate limiting — RateLimitPolicy
RateLimitPolicy global = RateLimitPolicy.global(1000, Duration.ofMinutes(1));
RateLimitPolicy perIp = RateLimitPolicy.perIp(100, Duration.ofMinutes(1));
RateLimitPolicy perUser = RateLimitPolicy.perUser(500, Duration.ofMinutes(1));
Integración con ether-http-jetty12
public class AppContainer {
public HttpSecurityProfile securityProfile() {
return new HttpSecurityProfile(
CorsPolicy.builder()
.allowOrigins("https://app.example.com")
.allowMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowHeaders("Authorization", "Content-Type")
.allowCredentials(true)
.build(),
SecurityHeadersPolicy.builder()
.strictTransportSecurity("max-age=31536000")
.contentTypeOptions("nosniff")
.frameOptions("DENY")
.build(),
TrustedProxyPolicy.of("10.0.0.0/8"),
IpPolicy.allowAll(),
RateLimitPolicy.perIp(200, Duration.ofMinutes(1))
);
}
}
Más información