- websocket 연결 요청 : GET "/ws-stomp"
- pub endpoint : "/pub/chat/message"
- sub endpoint : "/sub/chat/rooms/{room_id}"
관련 도메인 설명
- ChatRoom : 채팅방 정보 (id, type)
- ChatRoomJoin : 채팅방-회원 간 연결 테이블 (id, chatRoom_id, member_id) => 다대다 연결관계 매핑 막기 위해
- ChatMessage : 채팅 메세지 정보 (id, sender_id, room_id, message, time...)
채팅 관련 api
- 1대1 채팅방 정보 요청 : PUT "/chat/rooms/one-on-one"
- 두 사용자가 db에 존재하는 사용자인지 체크
- 두 사용자가 포함된 1대1 채팅방이 존재하는 경우 기존 채팅방 정보 리턴
- 두 사용자가 포함된 1대1 채팅방이 존재하지 않는 경우 새로운 채팅방 생성 후 리턴
- 채팅방 히스토리 요청 : GET "/chat/rooms/{chatRoomId}/messages"
- 요청자가 채팅방 구성원이 맞는지 체크
- 최근 시간 기준으로 정렬한 채팅 메세지를 30개 단위로 페이징 처리하여 리턴
고민되던 부분
websocket 연결 시 http 요청으로 handshake 과정을 거치는데 리서치를 해보니 이 경우엔 커스텀 헤더를 추가할 수 없기 때문에 기존에 요청 헤더에 토큰을 담는 것이 불가능하다고 합니다. 그런데 예상과 다르게 서버 쪽에서 테스트 코드를 작성하여 테스트할 때는 커스텀 헤더가 추가됨을 확인했습니다. 조금 헷갈려서 다시 찾아보니 프론트에서 사용하는 sockjs-client 라이브러리에서 요청시에 커스텀 헤더를 추가할 수 없다고 합니다.
현재 구현한 방법은 http 요청 대신 socket 통신 간에 커스텀 헤더를 추가할 수 있었기 때문에 websocket handshake 요청은 인증 필터를 거치지 않도록 제외시키고, 연결 요청 이후 websocket 통신에서 STOMP CONNECT 커맨드가 들어오는 경우에 헤더에 담긴 토큰 유효성을 체크하도록 구현하였습니다.
STOMP 기반 채팅 기능 구현
관련 도메인 설명
채팅 관련 api
고민되던 부분
websocket 연결 시 http 요청으로 handshake 과정을 거치는데 리서치를 해보니 이 경우엔 커스텀 헤더를 추가할 수 없기 때문에 기존에 요청 헤더에 토큰을 담는 것이 불가능하다고 합니다. 그런데 예상과 다르게 서버 쪽에서 테스트 코드를 작성하여 테스트할 때는 커스텀 헤더가 추가됨을 확인했습니다. 조금 헷갈려서 다시 찾아보니 프론트에서 사용하는 sockjs-client 라이브러리에서 요청시에 커스텀 헤더를 추가할 수 없다고 합니다.
현재 구현한 방법은 http 요청 대신 socket 통신 간에 커스텀 헤더를 추가할 수 있었기 때문에 websocket handshake 요청은 인증 필터를 거치지 않도록 제외시키고, 연결 요청 이후 websocket 통신에서 STOMP CONNECT 커맨드가 들어오는 경우에 헤더에 담긴 토큰 유효성을 체크하도록 구현하였습니다.