spring security를 사용하여 로그인 관리를 할때 동일 session에 대한 제어 처리 부분 삽질,,,
동일 session을 허락하지 않게 설정을하는데 설정은 잘 먹는다.
하지만 설정 이후에 logout을 해도 session이 삭제되지 않는다.
머지,,, 찾아보니 spring security 3.2.4 버전에서 문제가 있었다고 한다.
나도 하도 짜증나서 디버깅으로 찍어보니 AbstractAuthenticationProcessingFilter의 doFilter(ServletRequest req, ServletResponse res, FilterChain chain) method 실행중 sessionStrategy.onAuthentication(authResult, request, response); 부분에서 에러가 발생하였다.
해당 method는 CompositeSessionAuthenticationStrategy의 onAuthentication method에서 session 체크시 로그아웃한 session이 삭제되지 않아서 발생한 문제이다.
1 2 3 4 5 6 7 8 9 10 | public void onAuthentication(Authentication authentication, HttpServletRequest request, HttpServletResponse response) throws SessionAuthenticationException { for (SessionAuthenticationStrategy delegate : this.delegateStrategies) { if (this.logger.isDebugEnabled()) { this.logger.debug("Delegating to " + delegate); } delegate.onAuthentication(authentication, request, response); } } |
왜 이런 문제가 발생하나 엄청나게 구글링을 했지만 딱히 방법이 없었다.
국내 블로거분께서는 spring security 3.2.7 이상을 사용시 해결되었다고 했는데 우리 환경은 4버전 이상이여서 해당 문제는 아닌것 같았다.
물론 방법은 찾았다.
spring boot에서 HttpSessionListener 관련 설정 내용에 대한 언급이 없어서 해외 개발자가 이슈로 등록했는데 받아들여지지 않은것 같다.
1 2 3 4 5 6 7 8 9 10 11 12 | // web.xml에 하위 리스너를 선언하고 사용하는 방식 <listener> <listener-class>session.destory.servlet.SessionManagerListener</listener-class> </listener> // spring boot에서 bean annotation으로 선언하고 사용하는 방식 // 해당 bean 내용을 spring WebSecurityConfigurerAdapter를 extends한 class(WebSecurityConfiguration) 에 등록하고 사용하였다. @Bean public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() { return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher()); } |
상위 처럼 설정하면 logout시 spring security 내부적으로 session을 삭제처리 된다.
참고링크