본문 바로가기

Java

웹소켓채팅 적용하며 겪은 문제점&해결법

http와 websocket의 헤더는 서로 다른방식이라 웹소켓의 메세지를 받는 컨트롤러에서 userdetails를 받을수가없음

  • jwt를 발급하여 해당 토큰을 stomphandler에서 메세지를 인터셉트할때 accessor.getFirstNativeHeader로 토큰을 가져와 사용자를 식별하였음

으레 그렇듯이 채팅에는 항상 악성유저가 생길수있음

  • 추방기능을 적용, 채팅방에 유저가 들어갈때 유저와 채팅방이 매핑된 테이블을 생성하여 관리하는데, 추방시에 해당 row를 삭제하여 더이상 악성유저가 해당 채팅방에 접근할수 없도록함

위의 방법을 사용하였을때 악성유저가 새로고침이나 페이지를 나가기전까지는 계속 채팅방에 있을수있음

  • 메시지의 타입에 BAN 타입을 추가하고, 방장이 BAN타입으로 해당유저의id를 보내면 해당 채팅방을 구독중인 유저들은 BAN타입의 메시지를 받았을때 해당 메시지안에있는 유저id와 자신의 id를 비교한뒤 둘이 같을경우 alert와 함께 강제로 페이지를 이동시킴 ( 뒤로가기해도 돌아올수없음 )

유저가 정상적이지않은 방법(창끄기,f5등)으로 disconnect할경우 disconnect 메시지의 헤더에 토큰을 담을수없어 유저를 식별할수없음

  • 채팅방을 구독할때 메시지의 헤더에서 simpSessionId를 읽어 캐시에 저장해두는데, 여기에 토큰이나 유저정보를 함께 저장해두고 (토큰은 만료시간의 문제가 생길수 있기때문에 유저정보를 저장하는것이 좋을것같음) 캐시에서 유저정보와 세션을 함께 읽어오면 될것같음 ( 테스트예정 )

 

 

2024-03-20

--이전에 작성했던 글 읽던중 보여서 추가작성

웹소켓접속시 엔드포인트에서 핸드쉐이크에서 Principal 구현체등을 넣는 방식으로 유저 식별가능