Solución:
Cuando usa spring-session, por ejemplo, para persistir su sesión en reddis, esto se hace automáticamente. La cookie es creada por org.springframework.session.web.http.CookieHttpSessionStrategy
En cual CookieHttpSessionStrategy#createSessionCookie
comprueba si la solicitud llega a través de HTTPS y se configura de forma segura en consecuencia:
sessionCookie.setSecure(request.isSecure());
Si lo haces no use spring-session, puede configurar cookies seguras usando un ServletContextInitializer
. Utilice una propiedad de la aplicación para establecerla en verdadero / falso según el perfil.
@Bean
public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}") boolean secure) {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.getSessionCookieConfig().setSecure(secure);
}
};
}
application.properties (usado en dev cuando el perfil ‘prod’ no está activo):
secure.cookie=false
application-prod.properties (solo se usa cuando el perfil ‘prod’ está activo, sobrescribe el valor en application.properties):
secure.cookie=false
inicie su aplicación en el servidor prod con:
--spring.profiles.active=prod
Parece un esfuerzo, si no ha trabajado con perfiles hasta ahora, pero lo más probable es que necesite un perfil para el entorno de producción de todos modos, por lo que realmente vale la pena.
Si está utilizando Spring Boot, existe una solución simple para ello. Simplemente establezca la siguiente propiedad en su application.properties
:
server.servlet.session.cookie.secure=true
Fuente: Spring docs – Apéndice A. Propiedades comunes de la aplicación
Si tiene algún entorno con HTTPS y otro sin él, deberá configurarlo como falso en los perfiles sin HTTPS. De lo contrario, se ignora la cookie segura.
en su application.yml solo agregue
server:
session:
cookie:
secure: true