2013-06-17 3 views
1

Tomcat 7에 사용자 정보를 세션에 DTO 객체로 유지하는 웹 응용 프로그램이 있습니다. 또한 사용자가 세션이없는 경우 자동으로 사용자를 로그인 페이지로 리디렉션하는 프로젝트에 스프링 보안을 사용하도록 설정했습니다.Tomcat 세션 쿠키가 만료되지 않습니다.

내 응용 프로그램에 한 번 로그인 한 다음 Eclipse에서 Tomcat을 다시 시작하면 내 세션이 플러시되지만 쿠키가 이동하지 않는다는 것입니다.

이것은 서버를 다시 시작한 후에 세션에 UserDto가 없지만 유효한 JSESSIONID가 브라우저에 남아 있다는 것을 의미합니다. 따라서 스프링 보안은 실제로 사용자가 로그인하지 않은 경우 사용자가 로그인했다고 생각합니다.

왜 이런 일이 발생합니까? (Firefox에서 페이지 정보를보고 JSESSIONID 쿠키 유형을 확인했습니다. 즉, Expire: At end of session입니다. 따라서 서버 재시작시 이상하게 만료되어야합니까? 그렇지 않습니다.)

편집 : Firefox가 Expire: At end of session으로 표시되어 있지만 쿠키가 아직 남아 있습니다. Firefox를 종료했다가 다시 시작하면

답변

1

쿠키가 브라우저에 보관되어 있습니다. 서버가 다시 시작되지만 브라우저가 계속 실행되면 쿠키가 보관되어 다음 요청시 서버에 표시됩니다.

이제 서버 쪽에서 여러 옵션을 사용할 수 있습니다. 디스크에 지속되도록 클러스터의 SessionManager를 구성하고 다시 시작할 때 내용을 읽을 수 있습니다. 클러스터의 여러 톰캣간에 세션을 분산하는데도 사용되는 옵션입니다. When When 세션은 디스크에 직렬화되며 모든 서버는 세션을 직렬화 해제하여 세션을 계속 진행할 수 있습니다. 약간의 비용이 묵시적입니다 (세션을 계속해서 직렬화해야 함).

현재 이보다 구체적인 힌트를 드릴 수는 없지만, 쿠키를 검색하여 쿠키가 저장된 위치의 차이점을 이해한다면 왜 그렇지 않습니까? 서버를 다시 시작하면 세션 관리자의 tomcat 문서를 찾아 봐야 할 것입니다.

+0

cookie-config을 추가 할 수 있습니다 쿠키에 날짜를 만료 추가 나는 좋은 대답을 기다리고 있었다 나는 하나 :)을 얻었다. 심지어 나는 조금 의심스러워서 대답하지 않았다. 하지만 당신의 대답은 그것을 명확히했습니다. –

+0

@Olaf 그래서 서버의 상태를 모르는 브라우저가 쿠키를 가지고 있기 때문에 쿠키가 삭제되지 않습니다. 그러나 서버가이 쿠키를 유효하지 않은 쿠키로 거부해서는 안됩니까? 스프링 보안이 요청을 로그인 페이지로 리디렉션하지 않는 이유는 무엇입니까? –

+0

Firefox를 다시 시작하더라도 Btw 쿠키가 삭제되지 않습니다. –

1

웹 프로젝트에서 세션을 사용한 경우 Tomcat이 자동으로 JSESSIONID를 생성합니다.
세션 ID가 변경되면 JSESSIONID가 변경됩니다. JSESSIONID는 WEB 프로젝트의 seesion ID를 나타 내기 때문에.
서버가 중지되면 기본적으로 30 분 내에 만료되지만 서버가 자동으로 쿠키를 삭제할 수 없습니다.
JSESSIONID는 tomcat의 server.xml 파일에서 구성 할 수 있습니다.

0

성공적으로 로그인하는 동안 SpringSecurity는 브라우저에 쿠키를 저장합니다.

브라우저가 요청을 보내면 SpringSecurity는 쿠키의 내용을 확인합니다. SpringSecurity가 이전에 저장 한 값을 찾으면 사용자가 로그인했다고 생각하므로 SpringSecurity는 로그인 페이지로 리디렉션하지 않습니다. Servlet 3.0에서

1

, 나는이 질문을보고하자마자 web.xml 파일

<session-config> 
    <session-timeout>30</session-timeout> 
    <cookie-config> 
     <max-age>1800</max-age> 
    </cookie-config> 
</session-config> 
관련 문제