채권환경에서 사용자 정보가 달라질 경우, 경영정보 환경에서 이에 대함 정합성을 확보하는 방안이 필요하였다.
이에 대해 세션정보를 서로 일치시켜야 한다는 접근법이 애초에 WAS가 달라 불가능하다는 판단을 하였고, 경영정보의 특정 이벤트 호출 시 세션정보와 사용자데이터를 비교하여 같을 경우에만 이벤트를 이어가고 다를 경우 로그아웃을 하도록 조치하였다.
그런데 곰곰히 생각해보니까 포트가 다른거지 WAS가 다른 환경은 아니라는 생각이 들었고, 그렇다면 세션정보는 공유할텐데 왜 세션정보가 수정되지 않는지 의문점이 생겨서 관련하여 더 알아보았다.
일단 기존에 생각했던 부분 중 상당수가 다른 내용이었고, 이에 따라 트러블 슈팅 제목도 바꿀 필요가 있다고 생각하여 글제목을 바꾸는 것 부터 시작한다.
결론부터 말하면, 내가 보았을때는 인증정보를 세션스토리지에 저장하지 않는 것처럼 보였다.
이에 대한 사유는 아래와 같다.
application.yml에서 session 정보를 tracking-modes : cookie로 설정하여, 세션정보를 저장하긴 하지만 세션스토리지에 인증 정보가 존재하지 않았다.
로컬스토리지에만 로그인한 사용자 사원번호 및 토큰이 존재하였다.
쿠키에 jsessionid는 채권과 동일하였으나 이것이 더 포트 환경 상에서 사용자 정보의 일치를 보장하지는 않으며, 애초에 보안적인 부분으로 인해 저장을 할 수 없다.
Spring Security Context Holder를 기반으로 인증정보를 가져오는데, 이는 스레드 로컬을 기반한 변수이므로 각 환경에서 사용자 정보의 일치는 별도로 만족시켜주어야 한다.
경영정보 환경과 채권 환경은 아예 다른 환경이므로 로그인도 따로, 이에 따른 로그인 사용자 정보도 따로 운용해야 한다. 세션 스토리지를 따로 운용하지 않는 이유도 여기서 비롯된 것으로 보인다.
또한 전체적으로 세션id를 쿠키에 넣고 이를 다중 포트 환경에서 공유하기에 문제가 되었던 케이스는 많은데, 나의 경우 공유를 하는 것이 문제가 되진 않으나 상세 정보의 정합성을 확보할 수 없기에 문제가 발생한 케이스였다.
이러한 상황을 종합하였을때 세션정보는 쿠키를 통해 공유는 하지만, 상세 정보까지는 서로의 정합성을 맞출 수는 없었기에 이 정보를 runtime(실시간) 변경을 할 수 있는지 더 알아보아야겠다.
상기 기술한대로 상세정보의 경우 SecurityContextHolder에 저장한 사용자 정보에서 가져오는데, 이는 스레드로컬에 기반하여 가져오므로 포트가 다른 환경에서 상세정보를 실시간으로 맞출 수는 없다.
현재 마련한 방안은 경영정보 환경에서 특정 이벤트 호출시 사용자 정보와 securitycontextholder의 정보와 일치하는지 확인하여, 상이할 경우 강제 로그아웃하도록 조치하였다.
일단 springsecurity, jwt 부분에 대해 좀 더 알아보고 서로의 상세정보를 일치할 수 있는지, 혹은 세션스토리지를 활용하여 더 간결하고 확실한 방안은 없을지 고민해보아야겠다.
다중포트환경에서 세션을 공유하여 생기는 다른 형태의 문제 - https://velog.io/@sungmo738/%EA%B0%99%EC%9D%80%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%A4%EB%A5%B8%ED%8F%AC%ED%8A%B8%EC%9D%98-%EC%84%B8%EC%85%98%EB%AC%B8%EC%A0%9C
SecurityContextHolder - https://velog.io/@dailylifecoding/spring-security-authentication-registry