-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Description
Affects: 5.3.13
I'm using Spring Cloud Gateway with Spring Security and the issue is connected with default Security Headers.
When downstream response with a lowercase key header for Cache-Control, e.g. cache-control: max-age=120
then Spring thinks Cache Headers are not present and overwrites them with Cache-Control: no-cache, no-store, max-age=0, must-revalidate
which is incorrect behavior and violates RFC 2616.
Expected behavior: Compliance with RFC 2616, so Header names are case-insensitive, so no headers overwrite here.
I analyzed the source code, here my notes:
org.springframework.security.web.server.header.CacheControlServerHttpHeadersWriter
calls org.springframework.security.web.server.header.StaticServerHttpHeadersWriter
calls Collections.disjoint()
and passes org.springframework.http.client.reactive.NettyHeadersAdapter$HeaderNames
.
StaticServerHttpHeadersWriter
using Collections.disjoint()
assumes that passed collections are case-insensitive, which is not true in case of NettyHeadersAdapter$HeaderNames
.
Here's a test to reproduce it: https://github.com/mat-mik/gateway-headers/blob/425944a7fcfa52b1e555d81e554d1901e1e08cdd/src/test/java/com/example/gatewayheaders/GatewayHeadersApplicationTests.java#L43
Looking at the current design I believe that issue belongs to Spring Framework (because of NettyHeadersAdapter$HeaderNames
), but I'm not sure if, in the long run, the StaticServerHttpHeadersWriter
(so Spring Security
) shouldn't take care of case-insensitiveness (but that's just an invitation for discussion)