cookie java spring servlets cookies

cookie - httpsession java



¿Cookie http solo con seguridad de primavera y servlet 2.5? (3)

Creo que te falta la etiqueta de seguridad. Prueba agregar:

<secure>false</secure>

Quiero que mi cookie sea segura y solo solicite http.

He visto muchos mensajes como este y parecen funcionar bien, pero usando archivos de configuración y servlet +3.

Lo que básicamente quiero hacer es configurar mi cookie http solo y (si es posible) también ssl.

Hasta ahora he agregado esto a mi web.xml

<session-config> <session-timeout>60</session-timeout> <cookie-config> <http-only>true</http-only> </cookie-config> <tracking-mode>COOKIE</tracking-mode> </session-config>

no hace nada, por lo que estaba leyendo, también tengo que configurar mi servlet.xml para habilitar esta característica, pero no sé cómo ...

¿Alguna idea de cómo hacer esto?

EDITAR:

Como estoy utilizando servlets 2.5, la configuración xml no es una opción, ¿quizás un filtro?


Los cambios context.xml mencionados por javagc solo reconfigurarán su cookie de sesión.

Para cambiar todas sus cookies, tiene 2 opciones:

Opción 1) Actualice su código de aplicación para agregar cookies utilizando un método más seguro. Ejemplo: https://.com/a/30488471/95674

Opción 2) Puede configurar un filtro de servlet para cambiar TODAS las (otras) cookies que ingresan a través del sistema. Agregue estas 2 clases en el paquete apropiado en su WAR. Luego actualice su web.xml como se detalla a continuación.

Hay un ejemplo más simple de la Opción 2 que figura en el sitio OWASP, si está dispuesto a agregar una dependencia en las bibliotecas OWASP. Eso se encuentra aquí: https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly

Contenedor de respuesta

Esto agrega el indicador de solo http a todas las cookies en la respuesta envuelta.

public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper { public HttpOnlyResponseWrapper(HttpServletResponse res) { super(res); } public void addCookie(Cookie cookie) { StringBuilder header = new StringBuilder(); if ((cookie.getName() != null) && (!cookie.getName().equals(""))) { header.append(cookie.getName()); } if (cookie.getValue() != null) { // Empty values allowed for deleting cookie header.append("=" + cookie.getValue()); } if (cookie.getVersion() == 1) { header.append(";Version=1"); if (cookie.getComment() != null) { header.append(";Comment=/"" + cookie.getComment() + "/""); } if (cookie.getMaxAge() > -1) { header.append(";Max-Age=" + cookie.getMaxAge()); } } else { if (cookie.getMaxAge() > -1) { Date now = new Date(); now.setTime(now.getTime() + (1000L * cookie.getMaxAge())); SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz"); header.append(";Expires=" + cookieFormat.format(now)); } } if (cookie.getDomain() != null) { header.append(";Domain=" + cookie.getDomain()); } if (cookie.getPath() != null) { header.append(";Path=" + cookie.getPath()); } if (cookie.getSecure()) { header.append(";Secure"); } header.append(";httpOnly"); addHeader("Set-Cookie", header.toString()); } }

Filtrar

Este filtro ajusta las respuestas configuradas en el contenedor anterior.

package yourpackage; @WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"}) public class HttpOnlyFilter implements Filter { private FilterConfig config; @Override public void destroy() { this.config = null; } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res); chain.doFilter(req, hres); } public FilterConfig getFilterConfig() { return this.config; } @Override public void init(FilterConfig config) throws ServletException { this.config = config; } }

Adaptado (ADVERTENCIA: ¡NO una copia exacta!) De la fuente: http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html

web.xml

Un último detalle: SÓLO SI tiene la exploración de anotación desactivada en su sistema de esta manera:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5" ***metadata-complete="true"***> </web-app>

Luego deberá configurar manualmente el filtro anterior en su archivo web.xml, así:

<filter> <filter-name>HttpOnlyFilter <filter-class>yourpackage.HttpOnlyFilter </filter> <filter-mapping> <filter-name>HttpOnlyFilter <url-pattern>/* </filter-mapping>

Si su aplicación escanea anotaciones (que es la predeterminada), la parte web.xml no es necesaria.


Odio la configuración XML, así que dedico algo de tiempo a encontrar una solución que no sea XML.

Desde Spring Security 1.3 puedes usar

server.session.cookie.http-only=true server.session.cookie.secure=true

en su archivo application.properties .

Tal vez haya una forma de configurar esto usando la Configuración Java pura, pero no puedo encontrarlos.