STOMP 메시지 인가
WebSocket에서는 기본 필터가 동작하지 않아 프레임 단계에서 인가를 검사했습니다.
WebSocket, STOMP, JWT, ChannelInterceptor
로그인은 했지만 그다음이 비어 있었습니다
REST 요청은 필터가 매번 검사합니다. WebSocket은 다릅니다. 연결이 한 번 열리고 나면 그 위로 오가는 메시지는 필터를 지나지 않습니다.
그래서 남의 채팅방을 구독하거나 그 방으로 메시지를 보낼 수 있었습니다.
판단을 프레임 단계로 옮기기
인가를 연결 시점이 아니라 프레임 시점으로 옮겼습니다. CONNECT에서는 토큰의 서명과 만료를 확인해 세션 주체를 정합니다. 그 뒤 SUBSCRIBE와 SEND는 매번 destination이 가리키는 방과 세션 주체의 구성원 여부를 확인합니다.
접속 시점 검사와 나란히 돌리기
접속 시점에만 검사하는 구현을 따로 만들어 같은 시나리오를 양쪽에 돌렸습니다.
| 시나리오 | 프레임 단계 검사 | 접속 시점만 검사 |
|---|---|---|
| 토큰 없음·서명 위조·만료 | 세션 안 열림 | 세션 안 열림 |
| 비구성원의 구독 | 거부, 구독 저장 안 됨 | 통과 |
| 비구성원의 송신 | 거부 | 통과 |
| 거부된 세션의 메시지 수신 | 도달 안 함 | 도달함 |
| 방에서 제외된 뒤 송신 | 거부 | 통과 |
| 구성원 16·비구성원 16 동시 구독 후 브로드캐스트 | 구성원 16건만 수신 | 32건 모두 수신 |