유저당 최대 연결 수 관리

최대 연결수 넘어가면 기존에 있던 연결 끊기?

일단은 최대 연결 수 넘어가면 더 이상 연결 안되게 에러 던지는 식으로 구현

Stomp 연결 같은 경우 스프링 필터를 타지 않기 때문에

StompHandler ChannelInterceptor에서 먼저 Jwt 검증

preSend 부분에서 connect 요청의 경우

  1. Jwt 검증

  2. 해당 유저 세션 연결 수 확인 후 연결 완료 짓기

StompHeaderAccessor로 꺼내고, acc.setUser(auth)를 해야 하는 이유

  • CONNECT preSend에서 acc.setUser(auth)를 하면, 그 값이 세션에 결합되어 이후 모든 프레임/이벤트에서 event.getUser()로 동일하게 보입니다.

  • SimpUserRegistry가 이 Principal유저-세션 집계를 하고, 브로커 릴레이 환경에선 이 정보가 전 노드에 브로드캐스트됩니다.

  • /user/queue/** 같은 유저 목적지 라우팅도 이 Principal이 있어야 정확히 동작합니다.

처음에 Connect preSend와 SessionConnectedEvent 리스너가 하나의 스레드에서 이뤄지는 줄 알았다. 그래서 SecurityContext에 저장해두고 유저 id, 세션 id 가져오려고 했었다. 그런데같은 SecurityContext(같은 ThreadLocal)라고 가정하면 안 된다고 한다.

다만 위 StompHeaderAccessor가 세션에서 모두 공유된다 하니 StompHeaderAccessor 활용하였음

다만 현재 구현의 경우 하나의 서버 즉 메모리에서 세션을 관리하고 있으므로 다중 서버의 경우 제대로 연결 관리가 되지 않을 것이다. 이는 추후 멀티 서버 구현시에 redis를 통해 세션수 관리를 개발해 볼 것이다.

Last updated