유지상

STOMP 메시지 인가

WebSocket에서는 기본 필터가 동작하지 않아 프레임 단계에서 인가를 검사했습니다.

WebSocket, STOMP, JWT, ChannelInterceptor

로그인은 했지만 그다음이 비어 있었습니다

REST 요청은 필터가 매번 검사합니다. WebSocket은 다릅니다. 연결이 한 번 열리고 나면 그 위로 오가는 메시지는 필터를 지나지 않습니다.

그래서 남의 채팅방을 구독하거나 그 방으로 메시지를 보낼 수 있었습니다.

판단을 프레임 단계로 옮기기

인가를 연결 시점이 아니라 프레임 시점으로 옮겼습니다. CONNECT에서는 토큰의 서명과 만료를 확인해 세션 주체를 정합니다. 그 뒤 SUBSCRIBE와 SEND는 매번 destination이 가리키는 방과 세션 주체의 구성원 여부를 확인합니다.

접속 시점 검사와 나란히 돌리기

접속 시점에만 검사하는 구현을 따로 만들어 같은 시나리오를 양쪽에 돌렸습니다.

시나리오프레임 단계 검사접속 시점만 검사
토큰 없음·서명 위조·만료세션 안 열림세션 안 열림
비구성원의 구독거부, 구독 저장 안 됨통과
비구성원의 송신거부통과
거부된 세션의 메시지 수신도달 안 함도달함
방에서 제외된 뒤 송신거부통과
구성원 16·비구성원 16 동시 구독 후 브로드캐스트구성원 16건만 수신32건 모두 수신