실제 서비스에 영향이 있진 않으나 3주 전 즈음부터 로그에서 계속해서 아래와 같은 context of uiadapter does not exist 에러가 모니터링 되고 있습니다.
해당 로그가 어떤 에러인지 알 수 있을까요 ? 그리고 혹시 해당 에러가 메모리 누수와도 연관이 있을 수 있을까요 ?
캐모마일 1.0 버전 + 넥사크로 17 사용하고 있습니다.
<<__Exception__>>
java.lang.IllegalArgumentException: context of uiadapter does not exist.
at net.lotte.chamomile.security.uiadapter.UiAdapterSecurityHandlerProvider.getSecurityHandler(UiAdapterSecurityHandlerProvider.java:47)
at net.lotte.chamomile.security.uiadapter.UiAdapterAuthenticationEntryPoint.commence(UiAdapterAuthenticationEntryPoint.java:27)
at com.bpo.com.fwk.sec.BpoUiAdapterAuthenticationEntryPoint.commence(BpoUiAdapterAuthenticationEntryPoint.java:75)
at org.springframework.security.web.access.ExceptionTranslationFilter.sendStartAuthentication(ExceptionTranslationFilter.java:203)
at org.springframework.security.web.access.ExceptionTranslationFilter.handleSpringSecurityException(ExceptionTranslationFilter.java:177)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:133)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:177)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at net.lotte.chamomile.security.uiadapter.UiAdapterSelectFilter.doFilter(UiAdapterSelectFilter.java:71)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:98)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:86)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:98)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:86)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:171)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:98)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:86)
at jeus.servlet.engine.ServletWrapper.execute(ServletWrapper.java:145)
at jeus.servlet.engine.RequestProcessor.run(RequestProcessor.java:228)
at jeus.util.pool.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:1299)
at jeus.util.pool.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:1343)
at jeus.servlet.engine.WebThreadPoolExecutor$WebRequestWorker.run(WebThreadPoolExecutor.java:340)
at java.lang.Thread.run(Thread.java:748)
<<__!Exception__>>
안녕하세요. 이상현입니다.
로그상에서 확인할 수 있는 정보로는
특정 웹 요청에 대해서
Spring Security 관련 Exception 이 발생하여
인증 단계를 최초시작(또는 재시작)하기위해
AuthenticationEntryPoint 넘기는 과정에서 발생하는 것으로 보입니다.
java.lang.IllegalArgumentException: context of uiadapter does not exist. at net.lotte.chamomile.security.uiadapter.UiAdapterSecurityHandlerProvider.getSecurityHandler(UiAdapterSecurityHandlerProvider.java:47) at net.lotte.chamomile.security.uiadapter.UiAdapterAuthenticationEntryPoint.commence(UiAdapterAuthenticationEntryPoint.java:27) at com.bpo.com.fwk.sec.**BpoUiAdapterAuthenticationEntryPoint**.commence(BpoUiAdapterAuthenticationEntryPoint.java:75) at org.springframework.security.web.access.ExceptionTranslationFilter.**sendStartAuthentication**(ExceptionTranslationFilter.java:203) at org.springframework.security.web.access.ExceptionTranslationFilter.**handleSpringSecurityException**(ExceptionTranslationFilter.java:177) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:133)
기본적으로 최초 발생한 Exception 이 발생하면서 추가적으로 발생하는 예외로
ex) 세션 타임아웃으로 인한 인증 예외 등이 먼저 발생한 상황에서 다시 인증 프로세스를 시작하는 상황
정상적으로 로그인 절차를 잘 수행하고 있다면
이것 자체가 어플리케이션의 문제가 될 것 같지는 않습니다.
추가적으로 예외가 발생하는 상황에 대해 추정해보면
넥사크로 화면에 대한 요청이 아닌 기타 HTTP Request 에 대해서 Security 예외가 발생하는데
로그인페이지 정보에서는 Nexaxcro UiAdapter Context 를 사용하는 상황에서 발생하는 것 같습니다.
예를 들어 캐모마일 UiAdapter 에서는 [OPTION](https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/OPTIONS) 요청 같은 경우엔 UiContext 사용을 무시합니다.
따라서 CORS 정책으로 OPTION 요청이 발생하는 경우 해당 예외가 발생할 수 있습니다.
정상적으로 화면(Nexacro) 요청 -> 인증 오류 -> 로그인 화면으로 전환 상황에서는 문제가 발생하지 않고
데이터(또는 기타 OPTION) 요청 -> 인증 오류 -> 로그인 화면으로 전환하려는 상황에서 발생하는 문제로 추정됩니다.
정상적으로 세션이 종료되거나 로그아웃이 진행된 상황에서 인증 시작을 위한 로그인 페이지가 정상적으로 출력되는지 확인바랍니다.
프로젝트에서 작성하신 **BpoUiAdapterAuthenticationEntryPoint** 가 정상적으로 동작한다면 큰 문제는 없을 것으로 보입니다.
다만, 해당 예외가 잦게 출력되는 경우
잦은 로그 출력 및 예외 발생이 다른 문제를 유발할 수 있으므로
어떤 요청이 발생한 상황에서
어떤 최초 예외가 발생하는지 추적한 뒤에
**BpoUiAdapterAuthenticationEntryPoint** 에서 예외처리를 해주시거나
화면에 대한 요청이 아닌것으로 판단되므로 로그인처리를 위한 로직 연결이 아닌 [403응답](https://developer.mozilla.org/ko/docs/Web/HTTP/Status/403)을 주는 것으로 우회할 수 있을 것 같습니다.