유저당 최대 연결 수 관리
최대 연결수 넘어가면 기존에 있던 연결 끊기?
일단은 최대 연결 수 넘어가면 더 이상 연결 안되게 에러 던지는 식으로 구현
Stomp 연결 같은 경우 스프링 필터를 타지 않기 때문에
StompHandler ChannelInterceptor에서 먼저 Jwt 검증
preSend 부분에서 connect 요청의 경우
Jwt 검증
해당 유저 세션 연결 수 확인 후 연결 완료 짓기
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