Spring MVC, Spring Security et Tomcat : changement d'ID de session et perte de données de session

voix
16

Le site web que je soutiens a été développé avec Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP, et Hibernate (4.3.8.Final). Le frontal est un équilibreur de charge (Kemp LoadMaster 3000) et le site fonctionne sur Tomcat (8.5.54). Afin de trouver la cause de ce problème, je ne fais tourner qu'une seule instance de Tomcat derrière l'équilibreur de charge afin d'avoir un système plus simple. Chaque page du site (les pages publiques et les pages vues après authentification) fonctionne sous HTTPS.

Le code simplifié suivant montre comment démontrer le problème :

@RequestMapping(value=/form, method = RequestMethod.GET)
public String surveyPageGet(HttpServletRequest request, 
    HttpServletResponse response,
    Model model, Map<String, Object> map) throws IOException {

    request.getSession().setAttribute(token, token-value);
    System.out.println(request.getSession().getId());

    return myform;
}

@RequestMapping(value=/form, method = RequestMethod.POST)
public String surveyPageGet(HttpServletRequest request, 
    HttpServletResponse response,
    Model model, Map<String, Object> map) throws IOException {

    System.out.println(request.getSession().getAttribute(token));
    System.out.println(request.getSession().getId());

    return redirect:/success;
}

La durée de la session sur l'équilibreur de charge est de 60 minutes et son mode persistant est

Super HTTP and Source IP

Le délai de session sur Tomcat est également de 60 minutes, comme indiqué dans le fichier web.xml

<session-config>
    <session-timeout>60</session-timeout>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

Voici la configuration correspondante dans Spring Security.

<security:http auto-config=false use-expressions=true request-matcher=regex entry-point-ref=authenticationEntryPoint >
    <security:intercept-url pattern=^\/secure\/.*$ access=hasRole('ROLE_USER')  />
    <security:access-denied-handler ref=accessDeniedHandler />
    <security:logout invalidate-session=true logout-url=/secure/logout logout-success-url=/ delete-cookies=JSESSIONID />
    <security:custom-filter ref=authenticationFilter position=FORM_LOGIN_FILTER />  
    <security:anonymous username=guest granted-authority=ROLE_GUEST />
</security:http>

Voici mes observations sur l'ID de session et les données de session dans la méthode POST. Dans un grand nombre de cas, la méthode POST imprime le même identifiant de session et la même valeur de jeton si la soumission a lieu dans les 60 minutes suivant l'affichage du formulaire. Cela est compréhensible. Ce que je ne comprends pas, c'est que pour un très faible pourcentage de cas où la soumission du formulaire a lieu avant la limite des 60 minutes, l'ID de session change ET la valeur du jeton est nulle ou l'ID de session reste la même MAIS la valeur du jeton est nulle

Comment puis-je empêcher la modification de l'identifiant de session et la perte de données de session si une session ne s'arrête pas ? J'en ai vraiment besoin en raison du fonctionnement du site. Je passe beaucoup de temps en ligne pour trouver une solution éventuelle et j'ai fait de nombreux et divers tests (y compris l'ajout de code pour exclure la possibilité que le problème soit causé par un spam ou une attaque), mais sans succès

N'hésitez pas à me faire savoir si vous avez besoin de plus d'informations sur le site.

Créé 07/06/2020 à 17:53
source utilisateur
Dans d'autres langues...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more