websocket을 먼저 배우고 이 기술의 발전된 기술인 STOMP 에 대해서 알아야한다. 이 둘의 차이점을 기반으로 공부할 것이다.
그리고 redis의 pub/sub 이용해서 멀티서버 환경을 고려해야한다.
이것을 간략하게 설명하자면 A와 B가 메시지를 주고 받는 다고 가정
A는 ㄱ서버에 있고, B는 ㄴ서버에 있을 때 서로 메시지를 주고 받을 수 없다.
이럴 때 사용하는 기술이 redis나 kafka의 pub/sub이다.
이 redis에 연결된 서버 모두에 메시지를 전달을 한다.
HTTP 프로토콜은 반드시 request와 response가 왔다갔다 해야한다.
그래서 채팅 페이지를 구현한다고 할 때 메시지를 전송하는 것은 괜찮은데 메시지를 받을 때 메시지가 들어왔는지 확인하기 위해서 데이터베이스에 데이터를 조회하는 request를 보내고 그리고 response를 받은 뒤에 새로운 메시지를 페이지에 띄워줘야한다.
그래서 화면을 refresh를 해주거나 메시지 받기 버튼을 눌러서 request/response 과정을 거쳐야한다.
그래서 이것은 실시간 채팅이라고 하기는 어렵다
클라이언트가 서버로 요청을 보내고 서버가 응답을 하는 단방향 통신
HTTP는 클라이언트가 서버에 요청을 보내기 전까지 서버는 메시지를 주지 않는다.
보내주지 않는 이유는 서버가 메시지를 보내기 위해서는 각 클라이언트에 메시지를 보내기 위해서는 위치정보를 알아야한다.
클라이언트는 서버의 위치정보를 알고있지만 서버는 클라이언트의 위치정보는 알 수 없다.
websocket에는 클라이언트라는 개념이 있다. -> 웹브라우저(사용자)
(a)클라이언트가 서버와 websocket으로 연결이 되어있는 상황에서 어떤 다른 클라이언트가 서버로 메시지를 전송하면 (a)클라이언트는 실시간으로 메시지를 받을 수 있다.
클라이언트와 서버가 양방향 통신을 한다. 즉, 클라이언트가 서버에 메시지를 보낼 수 있고 반대로 서버가 클라이언트한테 메시지를 보낼 수 있다.
http 프로토콜이 아니기 때문에 http://이 아닌 ws://을 사용한다.
STOMP 프로토콜을 사용하면 명시적으로는 ws://가 아닌 http://를 사용한다. 하지만 내부적으로는 ws://가 사용된다.
바로 TCP 이다. 이 프로토콜은 양방향 연결이다.
이것이 가장 큰 차이점이다.
매번 연결을 요청했다 끊었다를 반복하면서 계속 http 요청을 보내는 것은 성능 저하가 발생한다.
websocket은 최초 연결을 할 때는 http 프로토콜을 이용해서 연결 요청을 서버에 보낸다.
websocket도 최초 연결시에는 HTTP 헤더를 통해 token과 같은 인증 정보를 보낼 수 있다. - 이를 통해 인증 처리를 할 수 있다.
- 즉, 이거로 JWT 검증 가능하다.
HTTP 메시지는 정보가 많다.